2つのオブジェクトを1つのオプショナルオブジェクトに結合し、一般的でクリーンなAPIを維持したいと思います。例を提供するには:PHPが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
になっていない可能性がありますが、コンストラクタのオプションとしてすべての引数を設定する必要があります。これはもはや必須の引数を持たないため、大きなノーノのように思えます。
オプションは$object2
を返すメソッドを作成することですが、これはそうのように、ユーザが連鎖する必要があります。これは許容することができ
$composition->getObject2()->getName()
が、私は私が持っているクリーンなAPIを破壊していますし、今の連鎖していますメソッド。
これを修正するためにここで行うことができるものはありますか、または単に前述のメソッドソリューションの連鎖と一緒に行く必要がありますか?
'$ object2'にアクセスしてもそれが供給されなかった場合、どのような動作が期待できますか?また、連鎖はあまり役に立ちませんが、コード内の別の箇所で失敗するだけです。 – Yoshi
'public function getName(){if($ this-> object2)は$ this-> object2-> getName()を返します。新しい\ Exception( '...')をスロー} ' –