web-dev-qa-db-ja.com

依存性注入:新しいオブジェクトの作成はどの時点で許可されますか?

[〜#〜] php [〜#〜] アプリケーションをリファクタリングしていますが、可能な限り 依存性注入 (DI)を実行しようとしています。

私はそれがどのように機能するかを十分に理解しているように感じ、そして私のクラスがより無駄のない、より堅牢になるのを確かに見ることができます。

クラス内に新しいオブジェクトを作成するのではなく、依存関係を注入できるようにリファクタリングしていますが、ある時点でいくつかのオブジェクトを作成する必要があります。つまり、恐ろしいnewキーワードを使用します。

私が今直面している問題は、どの時点で実際に新しいオブジェクトを作成できるかということです。他に行く場所がないので、私は最終的にトップレベルのクラスになり、新しいオブジェクトのロードを作成するように見えます。これは間違っていると感じています。

factory classes を使用してすべてのオブジェクトを作成するブログをいくつか読んだ後、ファクトリーを他のクラスに注入します。その後、ファクトリメソッドを呼び出すことができ、ファクトリは新しいオブジェクトを作成します。

これを行うことに対する私の懸念は、私のファクトリークラスがnewで無料になることです!これはファクトリークラスなので問題ないかもしれませんが、ファクトリーパターンとDIを使用する際に守るべきルールはありますか?

13
Gaz_Edge

これについてかなりググったら、(上記のコメントで述べたように)私が話していたトップレベルのクラスは Composition Root と呼ばれているようです。

これは確かに、このコンポジションルート内のすべてのオブジェクトの作成を追加する(またはここからIoCコンテナーを参照する)ために受け入れられたソリューションのようです。

これに対する私の当初の懸念は、このトップレベルのクラスが少し混乱することになるということでした。これはある程度当てはまりますが、長所は短所よりも重要です。たとえば、他のすべてのクラスの可読性、テスト容易性、保守性が向上したことがわかります。

トップレベルのクラスは少し乱雑で、newset_property()が散らばっているかもしれませんが、実際にこのコードをすべて1か所に置く方が、他の場所に散らばるのではなく、クラス

このメソッドのパフォーマンスヒットについて説明する別の有用なページ here

12
Gaz_Edge

Factoryクラスには、その全体にnewが散在しています。それはあなたが要求しているオブジェクトとおそらくそのオブジェクトの依存関係を作成するでしょう。ファクトリの仕事は、このクラスでnewを使用するための正しいオブジェクトをインスタンス化することなので、悪いことではありません。

DIは、疎結合設計を実現するためのものです。各オブジェクトに提供されている依存関係を変更することにより、アプリケーションに変更を加えることができます。アプリケーションを柔軟で拡張性が高く、テストが容易になります。

最上位には、いくつかのファクトリーをインスタンス化し、サービスへの接続をセットアップし、応答を送信するコードがあります。アプリケーションに必要なオブジェクトをインスタンス化するために、かなりの量のnewまたは静的呼び出しがあります。それが属する場所です。

2
Schleis