컴포지션을 통해 2 개의 오브젝트를 하나의 선택적 오브젝트와 결합하고 일반적이고 깨끗한 API를 유지하고자합니다. 예를 들면 다음과 같습니다.2 개의 클래스를 결합한 PHP 1은 선택 사항 일 수 있습니다.
class Composition implements Object1Interface, Object2Interface
{
private $object1;
private $object2;
public function __construct($object1, $object2 = null)
{
$this->$object1 = $object1;
$this->$object2 = $object2;
}
// This will always work since the object is mandatory.
public function getId() {
return $this->object1->getId();
}
// This may fail because the object2 can be null.
public function getName() {
return $this->object2->getName();
}
}
null 개체를 프록시 할 수 있기 때문에 꽤 빨리 실패합니다. 이것을 해결할 수있는 좋은 방법은 무엇입니까?
$object2
을 작성해야하며 $object2
을 채우기 위해 항상 모든 생성자 데이터를 준비하지 못한 경우 선택적 생성자에 대한 모든 인수를 만들어야합니다. 이것은 더 이상 필수 인수를 갖지 않을 것이기 때문에 커다란 노 - no처럼 보인다. 나는 이제 체인
$composition->getObject2()->getName()
이 허용 될 수 있지만, 내가 가지고 깨끗한 API를 파괴하고 있습니다 :
옵션이 $object2
을 반환하는 방법을 생성하는 것입니다하지만 지금과 같은 사용자에 의해 체인이 필요합니다 행동 양식.
문제를 해결하기 위해 여기에서 수행 할 수있는 것이 있습니까? 아니면 간단히 말하면 솔루션 솔루션의 체인을 따라 가야합니까?
'$ object2'에 액세스 할 때 예상 동작이 제공되지 않았습니까? 또한 체인이 도움이되지 않는다면 코드의 다른 지점에서 실패 할 것입니다. – Yoshi
'public function getName() {if ($ this-> object2)는 $ this-> object2-> getName();을 반환합니다. new \ Exception ('...')을 던지십시오.'' –