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