アジャイルなソフトウェア開発とすべての原則(SRP、OCPなど)を考えるとき、ロギングをどのように扱うかを自問します。
実装の隣のロギングはSRP違反ですか?
yes
実装はロギングなしで実行することもできるはずだからです。それでは、より良い方法でロギングを実装するにはどうすればよいですか?いくつかのパターンを確認し、ユーザー定義の方法で原則に違反するのではなく、原則に違反することが知られているパターンを使用する最良の方法は、デコレータパターンを使用することであるという結論に達しました。
SRP違反のない完全に多数のコンポーネントがあり、ロギングを追加するとします。
- コンポーネントA
- コンポーネントBはAを使用します
Aのロギングが必要なので、Aで装飾された別のコンポーネントDを作成し、両方ともインターフェースIを実装します。
- インターフェースI
- コンポーネントL(システムのロギングコンポーネント)
- コンポーネントAはIを実装します
- コンポーネントDはIを実装し、Aを装飾/使用し、ロギングにLを使用します
- コンポーネントBはIを使用します
利点:-ロギングなしでAを使用できます-Aをテストすると、ロギングモックが不要になります-テストが簡単になります
欠点:-より多くのコンポーネントとより多くのテスト
これはもう1つの公開討論の質問のように思えますが、デコレータやSRP違反よりも優れたログ戦略を誰かが使用しているかどうかを実際に知りたいです。デフォルトのNullLoggerであり、syslogロギングが必要な場合、実行時に実装オブジェクトを変更する静的シングルトンロガーはどうでしょうか。