7

PHPアプリケーションの循環依存の問題であると私が信じていることを経験しています。これが正しくない場合はお知らせください。状況は次のとおりです。

LogManagerとDBSessionの2つのクラス。

DBSessionはデータベースとの対話に使用され、LogManagerはファイルへのログ記録に使用されます。どちらも私のアプリケーションで広く使用されています。DBSessionのインスタンスを作成するときは、コンストラクターパラメーターを介してLogManagerのインスタンスを指定する必要があります。これは、DBSessionが情報をファイルに記録し、LogManagerインスタンスを使用してこれを行うためです。

ここで、LogManagerを拡張して、テキストファイルではなくデータベーステーブルにもログを記録できるようにしたいと思いました。当然、既存のクラスを再利用するのが好きですが、これが面白い状況をもたらすことにすぐに気づきました。

DBSessionは、構築のためにLogManagerのインスタンスをすでに必要とします。LogManagerでDBSessionクラスを再利用する場合は、DBSessionのインスタンスが必要になります。どうすれば両方の要求を満たすことができますか?明らかに、私のアプローチには何か問題があるに違いありません。

これを修正することをどのように提案しますか?

よろしくお願いします。

4

4 に答える 4

8

LogManagerを拡張せず、集約型にします。そして、ログに記録する場所の選択を遅らせます。

$logManager = new LogManager();
$dbSession = new DbSession($logManager);
$logManager->add(new FileLog($filename) );
$logManager->add(new DBLog($dbSession) );

もちろん、FileLogとDBLogは共通のインターフェースを共有しています。これはオブザーバーパターンのアプリケーションであり、add()は「サブスクライブ」操作であり、FileLog/DBLogはロギングイベントのオブザーバーです。(このようにして、多くの場所にログを保存することもできます。)

オーウェン編集:php構文に調整。

于 2008-10-12T04:11:16.057 に答える
2

これらのオブジェクトの1つは、実際には他のオブジェクトを必要としません。ご想像のとおり、これはDBSessionです。そのオブジェクトを変更して、構築後にロガーをオブジェクトにアタッチできるようにします。

于 2008-10-12T04:11:25.167 に答える
2

たまにファイルに書き込むだけの場合、DbSessionオブジェクトの作成にLogManagerオブジェクトを要求するのはなぜですか?代わりに、必要な場合にのみ遅延ロードしてください。また、私の意見では、両方が互いに独立している必要があります。それぞれが必要に応じて他方をインスタンス化できます。

于 2008-10-12T04:14:28.640 に答える
1

たとえば、シングルトンパターンなどのパターンを適用して、LogManagerクラスのインスタンスが1つだけになるようにすることができます。

于 2008-10-12T04:02:57.603 に答える