Je suis sur un projet TDD, donc j'essaie de m'en tenir le plus possible aux bonnes pratiques impliquées dans ce type de développement. L'un d'entre eux évite autant que possible statique et global.
Je suis confronté à ce problème: j'ai un objet "article" qui peut avoir des "options" (des "micro-articles" supplémentaires) qui lui sont liés.
Je ne peux pas comprendre comment avoir une bonne approche qui ne sera pas contre-productive ou générera trop de requêtes parce que je serais dans une situation où tout est tellement découplé que je devrai essentiellement faire 1 requête par objet.
De mon point de vue actuel, je vois 3 options:
1) Construire à l'intérieur de l'article:
class Article
{
//[...]
public function getArrOption(){
//Build an array of Options instance.
//return an array of Options.
}
}
Pro: simple
Const: maintenabilité: l'objet article contient désormais la logique de construction de l'objet Option. Cela entraînera probablement une duplication de code.
2) Utilisation d'une optionFactory
class Article
{
//[...]
public function getArrOption(){
return OptionFactory::buildFromArticleId($this->getId());
}
}
Pro: La logique de construction n'est pas en dehors de la classe Article
Const: J'enfreins la règle "il est difficile de se moquer de la statique", ce qui rend ma classe d'article difficile à tester.
3) Séparez toutes les logiques.
//Build the array of Option instance in a controller somewhere, using a Factory:
$arrOption = OptionFactory::buildFromArticleId($article->getId());
Pro: L'article ne gère que sa propre responsabilité et ne se soucie pas du lien de son "père" avec les options. Les choses sont vraiment découplées
Const: exigera plus de code à l'intérieur du contrôleur à chaque fois que je devrai accéder aux options. Cela signifie que je ne devrais jamais utiliser une usine à l'intérieur d'un objet, et ce genre de son est pour moi une utopie ...
Quelle est la meilleure façon de procéder? (Ai-je raté quelque chose?) Merci.
Éditer:
Sans oublier que si je ne peux pas appeler factory à l'intérieur de la classe, je ne pourrai jamais utiliser le modèle d'initialisation paresseux aussi ...