とき組成はobject A
含まれていobject B
とobject A
も作成する必要がありますobject B
。
構成関係
クラスBが使用するクラスAがあります。
final class A
{
}
コンポジションの外観には複数のオプションがあります。
直接初期化構成:
final class B
{
private $a = new A();
}
コンストラクター初期化構成
final class B
{
private $a;
public function __construct()
{
$this->a = new A();
}
}
遅延初期化構成
final class B
{
private $a = null;
public function useA()
{
if ($this->a === null) {
$this->a = new A();
}
/* Use $this->a */
}
}
これにより、クラスA
との間に緊密な関係が作成されますB
。クラスはB
単になしでは存在できませんA
。これは、依存性注入の原則に対する大きな違反です。
依存関係は、使用できるオブジェクト(サービス)です。インジェクションとは、依存関係を使用する依存オブジェクト(クライアント)に依存関係を渡すことです。サービスはクライアントの状態の一部になります。クライアントがサービスを構築または検索できるようにするのではなく、クライアントにサービスを渡すことが、パターンの基本的な要件です。
構成はnew DateTime
、phpまたはnew std::vector<int>
C ++で呼び出すなど、意味をなす場合があります。しかし、多くの場合、コードの設計が間違っているという警告です。
class A
がキャッシュに使用される特別なオブジェクトである場合、はのclass B
実装を使用して常にキャッシュされ、class A
動的に変更するコントロールはありません。これは悪いことです。
また、遅延初期化構成を使用した場合object B
、useA()
メソッドと呼ばれる作業が行われ、作成object A
が失敗することになり、object B
突然使用できなくなります。
一方、集約は関係の方法であり、DIの原則に従います。object B
使用する必要があるがobject A
、あなたはですでに作成されたインスタンスを渡す必要object A
にobject B
、との創設すべきであるobject A
フェイルは、何が最初の場所で渡さないであろう。
要するに、Aggregationは、依存性注入の原則(コンストラクター注入、セッター注入、またはパブリックプロパティ注入)のUML表現です。
これらはすべて集約です
最もタイトなコンストラクター注入(object B
なしでは存在できませんobject A
)。
final class B
{
private $a;
public function __construct(A $a)
{
$this->a = $a;
}
}
Looser(object A
insideを使用しても使用しなくてもかまいませんが、使用object B
する場合は、おそらく最初に設定する必要があります)。
セッター経由:
final class B
{
private $a;
public function setA(A $a)
{
$this->a = $a;
}
}
パブリックプロパティ経由:
final class B
{
public $a;
}
使用しているのがクラスの具体的な実装のみである場合、Aggregation over Compositionを使用する正当な理由はありませんが、インターフェイスの挿入を開始するか、C ++抽象クラスの場合、Aggregationが唯一の方法になります契約を履行します。