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