Le modèle de stratégie fonctionne bien pour éviter les énormes constructions if ... else et faciliter l'ajout ou le remplacement de fonctionnalités. Cependant, cela laisse toujours un défaut à mon avis. Il semble que dans chaque implémentation, il doit encore y avoir une construction de branchement. Il peut s'agir d'une usine ou d'un fichier de données. Prenons par exemple un système de commande.
Usine:
// All of these classes implement OrderStrategy
switch (orderType) {
case NEW_ORDER: return new NewOrder();
case CANCELLATION: return new Cancellation();
case RETURN: return new Return();
}
Le code après cela n'a pas à s'inquiéter, et il n'y a qu'un seul endroit pour ajouter un nouveau type de commande maintenant, mais cette section de code n'est toujours pas extensible. Le retirer dans un fichier de données améliore la lisibilité (discutable, je sais):
<strategies>
<order type="NEW_ORDER">com.company.NewOrder</order>
<order type="CANCELLATION">com.company.Cancellation</order>
<order type="RETURN">com.company.Return</order>
</strategies>
Mais cela ajoute encore du code standard pour traiter le fichier de données - accordé, plus facilement testable unitaire et code relativement stable, mais une complexité supplémentaire néanmoins.
De plus, ce type de construction ne teste pas bien l'intégration. Chaque stratégie individuelle peut être plus facile à tester maintenant, mais chaque nouvelle stratégie que vous ajoutez est une complexité supplémentaire à tester. C'est moins que ce que vous auriez si vous n'aviez pas utilisé le modèle, mais il est toujours là.
Existe-t-il un moyen de mettre en œuvre le modèle de stratégie qui atténue cette complexité? Ou est-ce aussi simple que cela, et essayer d'aller plus loin ne ferait qu'ajouter une autre couche d'abstraction pour peu ou pas d'avantages?
eval
... pourrait ne pas fonctionner en Java mais peut-être dans d'autres langages?