Является ли определение состояния по типу проверяет запах кода? - PullRequest
2 голосов
/ 10 февраля 2012

Я работаю над дизайном объекта, который меняет свое поведение в зависимости от его состояния. Один, если его свойства содержат объект, который может быть различных типов. Вот пример:

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 Ответ

2 голосов
/ 10 февраля 2012

Это кажется мне немного вонючим.Лучшим вариантом было бы использовать некоторое полиморфное поведение очков.Возможно, виртуальный метод, такой как ...

bool goesWithBoots()

, который в большинстве случаев возвращает TRUE, но для солнцезащитных очков возвращает FALSE.

Преимущество заключается в том, что вы можете расширить код, добавив другие типыочки, и они могут самостоятельно решать, «идут ли они с ботинками» или нет - и вам не нужно беспокоиться о том, нужно ли вам модифицировать метод putOnBoots () каждый раз, когда вы добавляете очки другого типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...