должен ли сборщик сбросить среду сборки после доставки продукта - PullRequest
3 голосов
/ 28 ноября 2011

Я реализую конструктор, в котором результат доставляется путем вызова Builder::getProduct(). Директор просит различные части собрать Builder::buildPartA(), Builder::buildPartB() и т. Д., Чтобы полностью построить продукт.
Мой вопрос заключается в том, что после доставки продукта Строителем по вызову Builder::getProduct() должен ли он сбросить свою среду (Builder::partA = NULL;, Builder::partB = NULL;), чтобы он был готов построить другой продукт? (с одинаковой или другой конфигурацией?)

Я спрашиваю об этом, поскольку использую PHP, в котором объекты по умолчанию передаются по ссылке (нет, я не хочу clone их, поскольку одно из их полей - Resource). Однако, даже если вы думаете с языковой точки зрения, должен ли Builder перезагружать свою среду сборки? Если ваш ответ «это зависит от случая», какие варианты использования оправдывают перезагрузку среды (и наоборот)?

Для примера кода приведу мой Builder::gerProcessor(), который показывает, что я имею в виду под перезагрузкой среды

/**
 * @see IBuilder::getProessor()
 */
public function getProcessor()
{
    if($this->_processor == NULL) {
        throw new LogicException('Processor not yet built!');
    } else {
        $retval = $this->_processor;
        $this->_product = NULL, $this->_processor = NULL;
    }
    return $retval;
}

1 Ответ

3 голосов
/ 28 ноября 2011

Сброс состояния в getProcessor() неочевиден, и если вы хотите сделать это, метод должен отразить это в своем имени, например, getProcessorAndReset(). Более чистым решением было бы просто дать строителю отдельный метод reset().

Как правило, ваш getProcessor() не должен сбрасывать свое внутреннее состояние, потому что методы не должны волшебным образом изменять поведение, но надежно делают то же самое. getProcessor() - это запрос, и этот запрос должен возвращать один и тот же сконфигурированный процессор при каждом вызове. Это не должно изменить состояние. Сброс состояния - это команда. Вы хотите разделить методы команд и запросов .

...