Je dirais de rester fidèle à la façon dont vous l'avez fait avant. Le nombre de paramètres dans votre exemple n'est pas grand, mais les alternatives sont bien plus horribles.
Carte - Il y a le problème d'efficacité que vous avez mentionné, mais le plus gros problème ici est:
- Les appelants ne savent pas quoi vous envoyer sans faire référence à
autre chose ... Avez-vous des javadocs qui indiquent exactement quelles clés et
valeurs sont utilisées? Si vous le faites (ce qui est génial), avoir beaucoup de paramètres n'est pas non plus un problème.
- Il devient très difficile d'accepter différents types d'arguments. Vous pouvez soit restreindre les paramètres d'entrée à un seul type, soit utiliser Map <String, Object> et convertir toutes les valeurs. Les deux options sont horribles la plupart du temps.
Objets wrapper - cela ne fait que déplacer le problème puisque vous devez remplir l'objet wrapper en premier lieu - au lieu de directement dans votre méthode, ce sera vers le constructeur de l'objet paramètre. Déterminer si le déplacement du problème est approprié ou non dépend de la réutilisation dudit objet. Par exemple:
Je ne l'utiliserais pas: il ne serait utilisé qu'une seule fois lors du premier appel, donc beaucoup de code supplémentaire pour traiter 1 ligne ...?
{
AnObject h = obj.callMyMethod(a, b, c, d, e, f, g);
SomeObject i = obj2.callAnotherMethod(a, b, c, h);
FinalResult j = obj3.callAFinalMethod(c, e, f, h, i);
}
Peut l'utiliser: Ici, il peut faire un peu plus. Premièrement, il peut factoriser les paramètres pour 3 appels de méthode. il peut également exécuter 2 autres lignes en lui-même ... donc il devient une variable d'état dans un sens ...
{
AnObject h = obj.callMyMethod(a, b, c, d, e, f, g);
e = h.resultOfSomeTransformation();
SomeObject i = obj2.callAnotherMethod(a, b, c, d, e, f, g);
f = i.somethingElse();
FinalResult j = obj3.callAFinalMethod(a, b, c, d, e, f, g, h, i);
}
- Modèle de constructeur - c'est un anti-modèle à mon avis. Le mécanisme de gestion des erreurs le plus souhaitable consiste à détecter plus tôt, pas plus tard; mais avec le modèle de générateur, les appels avec des paramètres obligatoires manquants (le programmeur n'a pas pensé à l'inclure) sont déplacés du moment de la compilation au moment de l'exécution. Bien sûr, si le programmeur met intentionnellement null ou tel dans le slot, ce sera le runtime, mais toujours attraper des erreurs plus tôt est un bien plus grand avantage pour les programmeurs qui refusent de regarder les noms de paramètres de la méthode qu'ils appellent. Je trouve cela approprié uniquement lorsqu'il s'agit d'un grand nombre de paramètres optionnels , et même dans ce cas, l'avantage est au mieux marginal. Je suis tout à fait contre le «modèle» du constructeur.
L'autre chose que les gens oublient de considérer est le rôle de l'IDE dans tout cela. Lorsque les méthodes ont des paramètres, les IDE génèrent la plupart du code pour vous, et vous avez des lignes rouges vous rappelant ce que vous devez fournir / définir. Lorsque vous utilisez l'option 3 ... vous perdez complètement cela. C'est maintenant au programmeur de faire les choses correctement, et il n'y a pas d'indices pendant le codage et la compilation ... le programmeur doit le tester pour le savoir.
En outre, les options 2 et 3, si elles sont adoptées largement inutilement, ont des implications négatives à long terme en termes de maintenance en raison de la grande quantité de code dupliqué qu'elles génèrent. Plus il y a de code, plus il y a à maintenir, plus on passe de temps et d'argent pour le maintenir.