Я работаю над проектом TDD, поэтому стараюсь как можно больше придерживаться хороших правил, связанных с таким развитием. Один из них - избегать как можно более статичных и глобальных.
Я сталкиваюсь с этой проблемой: у меня есть объект "article", с которым могут быть связаны "options" (дополнительная "micro-article").
Я не могу придумать, как найти хороший подход, который не будет контрпродуктивным или генерировать слишком много запросов, потому что я бы попал в ситуацию, когда все настолько разобщено, что мне в основном нужно было бы сделать 1 запрос на объект.
С моей реальной точки зрения, я вижу 3 варианта:
1) Построить внутри статьи:
class Article
{
//[...]
public function getArrOption(){
//Build an array of Options instance.
//return an array of Options.
}
}
Pro: прямо вперед
Const: Maintenability: объект article теперь содержит логику построения для объекта Option. Это, вероятно, приведет к дублированию кода.
2) Использование опции Factory
class Article
{
//[...]
public function getArrOption(){
return OptionFactory::buildFromArticleId($this->getId());
}
}
Pro: Построение логики не из класса Article
Const: Я нарушаю правило "статика трудно подделать", делая мой класс Article трудным для тестирования.
3) Разделить все логики.
//Build the array of Option instance in a controller somewhere, using a Factory:
$arrOption = OptionFactory::buildFromArticleId($article->getId());
Pro: Статья обрабатывает только его собственную ответственность и не заботится о его «отцовской» ссылке на опции. Вещи действительно отделены
Const: Потребуется больше кода внутри контроллера каждый раз, когда мне понадобится доступ к опциям. Это означает, что я никогда не должен использовать Фабрику внутри объекта, и это звучит для меня утопично ...
Какой лучший путь? (Я что-то пропустил?) Спасибо.
Редактировать:
Не говоря уже о том, что если я не могу вызвать фабрику внутри класса, я могу вообще никогда не использовать ленивый шаблон инициализации ...