Je travaille sur un projet qui traite les demandes, et il y a deux composants à la demande: la commande et les paramètres. Le gestionnaire de chaque commande est très simple (<10 lignes, souvent <5). Il existe au moins 20 commandes et en aura probablement plus de 50.
J'ai trouvé quelques solutions:
- un gros interrupteur / commandes if-else on
- carte des commandes aux fonctions
- mappage des commandes aux classes / singletons statiques
Chaque commande effectue une petite vérification d'erreur, et le seul bit qui peut être extrait est la vérification du nombre de paramètres, qui est défini pour chaque commande.
Quelle serait la meilleure solution à ce problème et pourquoi? Je suis également ouvert à tous les modèles de conception que j'ai pu manquer.
J'ai trouvé la liste des avantages et inconvénients suivants pour chacun:
commutateur
- avantages
- conserve toutes les commandes dans une seule fonction; car ils sont simples, cela en fait une table de recherche visuelle
- pas besoin d'encombrer la source avec des tonnes de petites fonctions / classes qui ne seront utilisées qu'en un seul endroit
- les inconvénients
- très long
- difficile d'ajouter des commandes par programme (besoin de chaîner en utilisant la casse par défaut)
commandes de carte -> fonction
- avantages
- petits morceaux de la taille d'une bouchée
- peut ajouter / supprimer des commandes par programme
- les inconvénients
- si fait en ligne, même visuellement que le commutateur
- si ce n'est pas fait en ligne, beaucoup de fonctions ne sont utilisées qu'au même endroit
commandes de carte -> classe statique / singleton
- avantages
- peut utiliser le polymorphisme pour gérer la vérification d'erreur simple (seulement comme 3 lignes, mais quand même)
- avantages similaires à la carte -> solution fonctionnelle
- les inconvénients
- beaucoup de très petites classes encombreront le projet
- implémentation pas tous au même endroit, il n'est donc pas aussi facile d'analyser les implémentations
Notes supplémentaires:
J'écris ceci dans Go, mais je ne pense pas que la solution soit spécifique à la langue. Je cherche une solution plus générale car je devrai peut-être faire quelque chose de très similaire dans d'autres langues.
Une commande est une chaîne, mais je peux facilement la mapper à un nombre si cela est pratique. La signature de fonction est quelque chose comme:
Reply Command(List<String> params)
Go a des fonctions de haut niveau, et d'autres plates-formes que j'envisage ont également des fonctions de haut niveau, d'où la différence entre les deuxième et troisième options.