2012-02-10 74 views
2

我正在研究一個對象的設計,該對象根據其狀態改變其行爲。一個如果它的屬性擁有可以是各種類型的對象。這裏有一個例子:正在確定基於類型檢查代碼的狀態嗎?

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沒有其他地方提供了自成一多態行爲,因此類型更大的目的。但是有一些行爲(如putOnBoots())並不覺得他們應該屬於$glasses,即使他們可能受其類型的影響,如何表示Person的狀態。

以這種方式檢查對象類型的東西感覺不對我。我是否會檢測到異味,或者我只是想象中的東西?

回答

2

它似乎有點臭我。更好的選擇是使用眼鏡的一些多態行爲。也許像...

bool goesWithBoots() 

在大多數情況下返回TRUE,但太陽鏡返回FALSE。

好處是您可以通過添加其他類型的眼鏡來擴展代碼,並且他們可以自己決定他們是否「穿靴子」 - 而且您不必擔心是否需要每次添加其他類型的眼鏡時都要修改putOnBoots()方法。

+0

不錯 - 我喜歡它!我的擔心是有明確的類型檢查,你的建議很好地消除了。它確實把眼鏡和靴子搭配在一起。我不確定眼鏡應該知道關於靴子的任何事情。真正關心組合的人。 – dellsala 2012-02-10 05:26:01

+0

後來我意識到......如果是人物的偏好,而不是眼鏡,那麼這是行不通的。如果其他人喜歡戴着帶靴子的太陽鏡,那麼你需要一個不同的解決方案。 :(我確信有一個,但目前我還沒有想到。 – aldo 2012-02-10 05:49:31