とき組成は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 Ainsideを使用しても使用しなくてもかまいませんが、使用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が唯一の方法になります契約を履行します。