是否根据类型确定状态检查代码气味?

时间:2012-02-10 05:11:54

标签: oop design-patterns

我正在设计一个基于其状态改变其行为的对象。一个如果它的属性包含一个可以是各种类型的对象。这是一个例子:

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的状态也会受到影响

以这种方式检查对象类型的东西对我来说是错误的。我是否发现了异味,或者我只想到了什么?

1 个答案:

答案 0 :(得分:2)

对我来说似乎有点臭。更好的选择是使用眼镜的某些多态行为。也许像......这样的虚拟方法。

bool goesWithBoots()

在大多数情况下返回TRUE,但太阳镜返回FALSE。

优点是您可以通过添加其他类型的眼镜来扩展代码,他们可以自己决定是否“随身携带” - 而且您不必担心是否需要修改每次添加其他类型的眼镜时都会使用putOnBoots()方法。