Question

Le modèle de stratégie fonctionne bien pour éviter d'énormes si ... Else les constructions et faciliter l'ajouter ou le remplacement des 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. Par exemple, prenez 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 besoin de 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 aide quelque peu 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 toujours du code de chauffeur pour traiter le fichier de données - accordé, un code testable et relativement stable plus facilement, mais une complexité supplémentaire.

De plus, ce type de construction ne soit pas bien le test d'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 vous ne l'auriez fait si vous n'avait pas a utilisé le motif, 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 possible, et essayer d'aller plus loin ajouterait une autre couche d'abstraction pour peu ou pas d'avantages?

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
scroll top