私はその状態に基づいて動作を変更するオブジェクトの設計に取り組んでいます。 1つのプロパティにさまざまな種類のオブジェクトが含まれている場合は1つタイプのチェックに基づいてコードの匂いに基づいて状態を判断していますか?
class Person {
// many types of glasses available
protected $glasses;
public function putOnBoots()
{
// does this type check smell?
if ($this->glasses instanceof SunGlasses) {
trigger_error('never wear boots with sunglasses');
return false;
}
// [...] put on boots
return true;
}
public function lookAtStuff ($stuff)
{
// glasses provides polymorphic behavior here
return $this->glasses->filter($stuff);
}
}
種類が大きな目的を果たすよう$glasses
は、クラス内の他の場所で独自の多型動作を提供しないことに留意すべきである:ここでは例です。しかしPerson
の状態を示す方法の型によって影響を受ける可能性があるにもかかわらず、$glasses
に属していないと思われるいくつかの動作(putOnBoots()
など)があります。
このようにオブジェクトタイプをチェックすると何かが間違って感じられます。私は匂いを検出するのですか、それとも私は物事を想像していますか?
悪くない - 私はそれが好きです!私が気にしていたのは、明示的な型チェックをしていて、あなたの提案がそれをうまく取り除くことでした。それはしかしブーツにカップルのメガネを行います。眼鏡がブーツについて何か知っているとは思えません。それは本当に組み合わせを気にする人です。 – dellsala
私はその後、それが...眼鏡ではなく人物の好みであれば、これは機能しません。ブーツ付きサングラスを着用している人がいれば、別の解決策が必要になります。 :(私はそこに1つはあると確信していますが、現時点では私の心には来ていません。 – aldo