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 ...
la source
Réponses:
La statique n'est pas "mauvaise", elle est imparable. Vous pouvez toujours l'utiliser là où la moquerie n'a pas de sens.
Ce n'est pas un modèle Factory, il ressemble à un modèle Repository, bien qu'il ne le soit pas. Factory est l'endroit où vous avez plusieurs classes avec la même interface / classe de base et vous voulez séparer la logique qui décide de la classe à renvoyer. Le référentiel obtient les données de son référentiel, résumant la mise en œuvre de ce référentiel (l'article n'a pas besoin de savoir si ses options sont stockées dans la même base de données, une autre, un fichier XML, un fichier CSV, etc.).
Vous avez ignoré la possibilité de donner à la classe Article un objet ObjectFactory (ou Repository, ou autre) dans le constructeur sur lequel elle peut appeler la méthode buildFromArticle.
Mon PHP est rouillé, mais je pense qu'il ressemble à ceci:
Je pense que cela satisfait tous vos pros ci-dessus.
la source
Voici une citation tirée d'un article qui affirme que vous n'avez jamais besoin de méthodes statiques, que les usines abstraites ont été prouvées être déroutantes, et suggère un léger changement de langage vers l'injection de dépendance comme solution.
"Seuss: découpler les responsabilités des méthodes statiques pour une configurabilité fine"
Wayback Machine Link
la source