2012-02-10 70 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