4

依存性注入の場合、メインクラスが独自のインスタンスを作成するのではなく、1つのクラスのインスタンスをメインインスタンスに渡す必要があることを理解しています(php):

class Class_One {
  protected $_other;
  public function setOtherClass( An_Interface $other_class ) {
    $this->_other_class = $other_class;
  }
  public function doWhateverYouHaveToDoWithTheOtherClass() {
    $this->_other_class->doYourThing();
  }
}

interface An_Interface {
  public function doYourThing();
}

class Class_Two implements An_Interface {
    public function doYourThing() { }
}

class Class_Three implements An_Interface {
    public function doYourThing() { }
}


// Implementation:
$class_one = new Class_One();
$class_two = new Class_Two();
$class_three = new Class_Three();
$class_one->setOtherClass( $class_two );
$class_one->doWhateverYouHaveToDoWithTheOtherClass();
$class_one->setOtherClass( $class_three );
$class_one->doWhateverYouHaveToDoWithTheOtherClass();

これはすべて問題ありません。Class_TwoとClass_ThreeはどちらもAn_Interfaceを実装しているため、Class_Oneでは同じように使用できることを私は知っています。Class_Oneはそれらの違いを知りません。

私の質問は、インスタンスをsetOtherClassに渡す代わりに、「Class_Two」などの文字列を渡し、Class_OneのsetOtherClassメソッドに実際に次のようにインスタンス自体を作成させることをお勧めします。

class Class_One {
  ...
  public function setOtherClass( $other_class_name ) {
    $this->_other_class = new $other_class_name();
  }
  ...
}

この種の依存性注入の目的は無効になりますか、それとも完全に有効ですか?このタイプのセットアップは、ユーザーが以前に文字列で使用するクラスを指定でき、後でこれをClass_Oneに渡すことができる構成に役立つと思いました。

実際、これを書き出すことはおそらく良い解決策ではないと私に思わせましたが、誰かが私がこれをすべき/すべきでない理由についていくつかの良いフィードバックを私に与えることができる場合に備えて、私はまだこれを投稿します。

ありがとう=)

ライアン

4

3 に答える 3

5

これは、理論的には依存性注入の目的を無効にします。あなたはClass_Oneに伝えています。これはAn_Interfaceに依存しており、インスタンス化する必要があるそのインターフェイスの具体的な実装です。そのためには、Class_OneがAn_Interface実装をインスタンス化する方法を知っている必要があり、Class_OneをすべてのAn_Interface実装に緊密に結合します。新しいAn_InterfaceClass_Fourを追加する場合は、戻ってClass_OneにClass_Fourをインスタンス化する方法を指示する必要があります。

PHPでは、すべてのAn_Interface実装にパラメーターなしのコンストラクターがあるので、これをできるだけ長く回避できます。ただし、実装に他の依存関係を挿入する必要がある場合は、失敗します。Class_FourがClass_Oneが知らないClass_Fiveを必要とする場合、Class_FourにClass_Fourを新しくするように指示することはできません。

于 2011-02-16T18:23:02.920 に答える
3

インターフェイスによって指定されたオブジェクトを渡します。そうでなければ、オブジェクトを構築するために何が必要かを常に100%の精度でどのように知ることができますか?

public function __construct(MyInterface $object) {
}

そうすれば、オブジェクトをどのように作成するかは問題ではありません。必要な方法(プログラミング対象のインターフェイス)でオブジェクトを使用できるかどうかを知る必要があります...

于 2011-02-16T18:20:40.240 に答える
0

どちらの方法も技術的に同等のIMOです。依存性注入を正しく行っているかどうかを確認する主なテストは、「new」または静的メソッド呼び出しで定数文字列を使用しているかどうかを確認することです。実装セクションで、構成またはその他のメカニズムを介してクラスを変更できる限り、コードは見栄えがします。クラスの文字列名を渡すことの唯一の欠点は、クラスが特定のインターフェイスを実装していることや、他のオブジェクトを拡張していることを確認できないことです。これのチェックは面倒になる可能性があります。ただし、アプリケーションがこの問題を適切に処理できる場合は、問題ないはずです。ただし、実際にインスタンス化されたオブジェクトを渡すのが最善の方法です。

于 2011-02-16T18:22:52.467 に答える