Я работаю над дизайном объекта, который меняет свое поведение в зависимости от его состояния. Один, если его свойства содержат объект, который может быть различных типов. Вот пример:
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
.
Что-то в проверке типа объекта таким способом кажется мне неправильным. Я чувствую запах, или я просто воображаю вещи?