2012-02-10 10 views
2

私はその状態に基づいて動作を変更するオブジェクトの設計に取り組んでいます。 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()など)があります。

このようにオブジェクトタイプをチェックすると何かが間違って感じられます。私は匂いを検出するのですか、それとも私は物事を想像していますか?

答えて

2

私にはちょっと臭いようです。より良い選択肢は、眼鏡のいくつかの多形性の動作を使用することです。おそらく仮想メソッド...

は、ほとんどの場合TRUEを返しますが、サングラスの場合はFALSEを返します。

利点は、他のタイプのメガネを追加することでコードを拡張でき、「ブーツと一緒に行く」かどうかを自分で決めることができ、必要があるかどうか心配する必要はありません別のタイプのメガネを追加するたびにputOnBoots()メソッドを変更してください。

+0

悪くない - 私はそれが好きです!私が気にしていたのは、明示的な型チェックをしていて、あなたの提案がそれをうまく取り除くことでした。それはしかしブーツにカップルのメガネを行います。眼鏡がブーツについて何か知っているとは思えません。それは本当に組み合わせを気にする人です。 – dellsala

+0

私はその後、それが...眼鏡ではなく人物の好みであれば、これは機能しません。ブーツ付きサングラスを着用している人がいれば、別の解決策が必要になります。 :(私はそこに1つはあると確信していますが、現時点では私の心には来ていません。 – aldo

関連する問題