1

クラス間のコミュニケーションを行うための良い方法はありますか?

たとえば、私が取り組んでいる CMS があります。メインクラスでは、2 つの新しいクラスThemeManagerModuleManagerをインスタンス化します。ここで、テーマ マネージャーがモジュール マネージャーにアクセスできるようにして、ロードされたモジュールを読み取ってそのコンテンツをページに出力できるようにする必要があります。

これでよろしいですか?これら 2 つのクラスをメインクラスのパブリック プロパティにします。これにより、双方向通信が可能になります (この状況では必ずしも必要ではありません)。

class MainClass {
    public $ThemeManager;
    public $ModuleManager;

    ..........

    function instantiate_managers() {
         $this->ThemeManager = new ThemeManager($this);
         $this->ModuleManager = new ModuleManager($this);
    }
}

それともこのほうがいいですか?一方向の通信は私の目的には問題ないので、既にインスタンス化されているものを別のものに渡します。

class MainClass {
    private $ThemeManager;
    private $ModuleManager;

    ..........

    function instantiate_managers() {
         $this->ModuleManager = new ModuleManager();
         $this->ThemeManager = new ThemeManager($this->ModuleManager);
    }
}

どちらの方法でも、これらの参照をModuleクラスとTheme -> Layoutクラスにさらに渡す必要があることに注意してください。

いずれにしてもインスタンス化されるのは 1 回だけであり、それぞれの__構造を介して参照を渡す手間が省けるため、グローバル スコープでThemeManagerModuleManagerを宣言する方がよいでしょうか? これは OOP の悪い習慣であり、回避しようとしているところをどこかで読んだことがありますが、このような状況では、これが最もハッキリしない方法のようです。

私が考えていないコミュニケーションを処理するための4番目の良い方法はありますか?

答え

最も自然に感じられ、両方の回答で提案されたので、依存性注入方法にPimpleを使用することになりました。

4

2 に答える 2

0

あなたが求めているのは、依存性注入を行う最良の方法です。

それにアプローチする方法はたくさんありますが、あなたの特定のケースでは、オプション#2を選択してください。テーマはモジュールを認識する必要がありますが、その逆ではないため、これが最も簡単な方法で問題を解決します。

ただし、これを将来の依存関係の問題に対する「一般的な回答」と見なさないでください。それについて考える最良の方法は、それぞれのケースを個別に検討することです。

これを行うには、さらに 2 つの方法があります。

  1. コンストラクターで何かを渡す代わりに、個別の set メソッドを作成できます。(例: setModuleManager)。
  2. 依存性注入コンテナーを使用することもできます。

あなたが学ぶとき、2番目は魅力的に見えるかもしれません. シンプルで中心的です。しかし、私はまだ用心深いでしょう。これはちょっとした大ハンマーであり、実際にはあまりにも緊密な依存関係を作成する原因となる可能性があります。(疎結合は非常に良いことと見なされます)。

セッター メソッドまたはコンストラクターの引数を使用すると、非常に明示的であることが強制されます。これは、このことを学ぶための最良の方法だと思います。

于 2012-11-24T17:44:32.860 に答える
-2

あなたのアプローチはすべて悪く聞こえます。これについて詳しく説明することもできますが、正直なところ、OOP に関する本を読んでから、ZF2 のような最新の PHP (5.3+) フレームワークを使い始めて、それがどのように行われるかを理解するのが一番だと思います。

依存性注入、高度にモジュール化された MVC など、すべてを学ぶことができます。

ただし、初期設計の制限内で、次のようにします。

ここに画像の説明を入力

Applicationオブジェクトが残りのコンポーネントを調整する場所。Application::render()ページによって生成された html 全体を返すメソッドに注意してください。

繰り返しますが、 「モジュール」や「テーマ」と言うとき、あなたが正しいことを意味しているとは思いません。最新の PHP フレームワーク (PHP 5.3+) を実際に見て、ソフトウェア エンジニアがどのようにこれらを設計したかを確認する必要があります。

たとえば、ルーティングの概念がありません。

于 2012-11-24T17:30:06.880 に答える