컴포지션은 object A포함 object B하고 object A를 생성 할 책임이 있습니다 object B.
구성 관계
우리는 클래스 A가 사용할 클래스 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 DateTimePHP 나 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실패는 아무것도 처음에 전달되지 것입니다.
간단히 말해 집계는 생성자 주입, 세터 주입 또는 공용 속성 주입 등 종속성 주입 원칙에 대한 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;
}
사용하는 모든 클래스의 구체적인 구현 인 경우 컴포지션보다 집계의 사용법을 정당화하는 좋은 방법은 없지만 인터페이스를 주입하기 시작하거나 C ++ 추상 클래스의 경우 갑자기 집계가 유일한 방법이 될 것입니다 계약을 이행하십시오.