私のプロジェクトでは、外部コマンドを呼び出して何らかの仕事をし、その結果を返す一連のクラスがあります。それらを「レポート」と呼びましょう。
これらのレポートにロギングを追加したいのですが、具体的なロガー オブジェクトは、クラスの定義時ではなく実行時に定義されます。
したがって、今のところ、ロギングを実装する方法は 2 つあります。
I. 実行時に、ReportLogger
特定の具体的なロガーを使用してログ機能を使用して、特定のすべてのレポート インスタンスにモンキー パッチを適用できるクラス インスタンスをインスタンス化します。
長所:
- 本当に必要な子レポート クラスにログを適用し、他のクラスには触れないようにすることができます。
短所:
- 魔法!モンキーパッチは明示的な方法ではありません。
- ロギングは実際には実行時に適用されるため、クラスのコードをレポートするときに何らかのロギングがあることを理解するのはあまり明確ではありません。
Ⅱ.デコレーターReportLogger
を介して作成時にすべてのレポートをラップしますが、実行時に具体的なロガーを受け入れます。
長所:
- これらのレポートにロギングが必要であることを明示的かつ明確に示す (および実際に適用する) 方法。
短所:
- 基本クラスから継承する子クラスを扱うのは難しい
Report
です。たとえば、基本Report
クラスで のようなメソッドcollect_data()
が で装飾されている@log_collect_data
場合、子クラスのロギングは と密接に結合されcollect_data()
ます。または、実際のコードを から に分割しcollect_data()
て、たとえば、_collect_data()
子クラスで変更し、 を呼び出し_collect_data()
てからcollect_data()
でラップcollect_data()
する必要があるかもしれません@log_collect_data
。
私は 2 番目の方法が好きですが、_collect_data() を使用するよりも、子クラスを処理するためのより良い方法が必要です。どんなアドバイスも大歓迎です!