簡単にするための精巧な答えではありません。
質問 1:
class Dependent {
propertyA = new PropertyA();
propertyB = new PropertyB();
}
ここDependent
は と に依存しpropertyA
てpropertyB
います。上記の関係は、依存関係の例です。
これらが実行時に作成されたオブジェクトである場合は? はい。
もし、そうなら....?はい
質問 2: はい。
詳細は以下に含まれています
シナリオ 1:
class Dependent {
DBConnection connection = new OracleConnection();
}
Dependent
クラスは高度に結合されています。コードを変更しない限り、接続を変更する方法がないためです。そのため、顧客が MySQLConnection() を必要とする場合は、コードを変更して別の exe/jar を提供する必要があります。
シナリオ 2:
class Dependent {
DBConnection connection = ConnectionFactory.createConnection();
}
ConnectionFactory
これは、いくつかの構成を読み取って必要な を作成できるため、はるかに優れていますconnection
。
それでも、Dependent
クラスをモックするのはいくらか困難になります。これらのシナリオでモックを作成するのは困難です。じゃあ何?
シナリオ 3:
class Dependent {
DBConnection connection;
setConnection(DBConnection connection) {
this.connecttion = connection;
}
}
class DependencyInjector {
inject() {
// wire them together every dependent & their dependency!
Dependent dependent = indentiyDepenentSomeSmartWay();
DBConnection connection = indentiyConnectionSomeSmartWay();
dependent.setConnection(connection);
}
}
私たちDependencyInjector
のクラスは賢いクラスです。必要な情報をすべて知っています。上記Dependent
のクラスはクリーンでシンプルです。単体テスト用にそれらを簡単にモックし、構成を使用して構成できます。
それらのオブジェクトの作成と結合は切り離されています!