[〜#〜] php [〜#〜] アプリケーションをリファクタリングしていますが、可能な限り 依存性注入 (DI)を実行しようとしています。
私はそれがどのように機能するかを十分に理解しているように感じ、そして私のクラスがより無駄のない、より堅牢になるのを確かに見ることができます。
クラス内に新しいオブジェクトを作成するのではなく、依存関係を注入できるようにリファクタリングしていますが、ある時点でいくつかのオブジェクトを作成する必要があります。つまり、恐ろしいnew
キーワードを使用します。
私が今直面している問題は、どの時点で実際に新しいオブジェクトを作成できるかということです。他に行く場所がないので、私は最終的にトップレベルのクラスになり、新しいオブジェクトのロードを作成するように見えます。これは間違っていると感じています。
factory classes を使用してすべてのオブジェクトを作成するブログをいくつか読んだ後、ファクトリーを他のクラスに注入します。その後、ファクトリメソッドを呼び出すことができ、ファクトリは新しいオブジェクトを作成します。
これを行うことに対する私の懸念は、私のファクトリークラスがnew
で無料になることです!これはファクトリークラスなので問題ないかもしれませんが、ファクトリーパターンとDIを使用する際に守るべきルールはありますか?
これについてかなりググったら、(上記のコメントで述べたように)私が話していたトップレベルのクラスは Composition Root と呼ばれているようです。
これは確かに、このコンポジションルート内のすべてのオブジェクトの作成を追加する(またはここからIoCコンテナーを参照する)ために受け入れられたソリューションのようです。
これに対する私の当初の懸念は、このトップレベルのクラスが少し混乱することになるということでした。これはある程度当てはまりますが、長所は短所よりも重要です。たとえば、他のすべてのクラスの可読性、テスト容易性、保守性が向上したことがわかります。
トップレベルのクラスは少し乱雑で、new
とset_property()
が散らばっているかもしれませんが、実際にこのコードをすべて1か所に置く方が、他の場所に散らばるのではなく、クラス
このメソッドのパフォーマンスヒットについて説明する別の有用なページ here
Factoryクラスには、その全体にnew
が散在しています。それはあなたが要求しているオブジェクトとおそらくそのオブジェクトの依存関係を作成するでしょう。ファクトリの仕事は、このクラスでnew
を使用するための正しいオブジェクトをインスタンス化することなので、悪いことではありません。
DIは、疎結合設計を実現するためのものです。各オブジェクトに提供されている依存関係を変更することにより、アプリケーションに変更を加えることができます。アプリケーションを柔軟で拡張性が高く、テストが容易になります。
最上位には、いくつかのファクトリーをインスタンス化し、サービスへの接続をセットアップし、応答を送信するコードがあります。アプリケーションに必要なオブジェクトをインスタンス化するために、かなりの量のnew
または静的呼び出しがあります。それが属する場所です。