Lorsqu'une méthode a trop de paramètres?
Lors du débogage d'un web-service client code aujourd'hui (en Java, avec jax-ws), j'ai couru à travers un web-service méthode avec l'esprit de soufflage montant de 97 paramètres!
J'ai dû créer un cas de test qui appelle cette méthode, et j'ai remarqué plusieurs choses:
- assistance de code/hover n'est pas à l'échelle. Je suis à l'aide d'Eclipse, et l'info-bulle sur la méthode est aussi large que l'écran, et s'étend sur plusieurs lignes.
- J'ai dû copier les valeurs des paramètres à partir d'un xml précédente capture, et il était pratiquement impossible de se souvenir "où suis-je" - quand j'ai eu le curseur se trouve après la virgule et avant de taper une certaine valeur, j'ai souvent eu le type de données de mal - j'ai tapé un Entier au lieu d'une Chaîne de caractères et vice versa.
- Même après que j'ai écrit à tous les paramètres, j'avais encore quelques erreurs et que la signature n'a pas de match. Malheureusement Eclipse marques de l'ensemble de la ligne en rouge comme ayant une erreur, afin de trouver où l'erreur a été pris encore plus de temps 🙁
Donc cela m'a fait penser, que pensez-vous est le maximum sane nombre de paramètres d'une méthode? Et si vous pouviez changer cette web-service de signature, comment pensez vous que cela peut-il être amélioré?
- Passer une dict de paramètre noms/valeurs à la place?
- J'ai pensé que, peut-être que c'est utile pour les méthodes ordinaires, mais avec web-service, il sape le point de l'ensemble du contrat. Vous obtenez également dans le problème de savoir comment sérialiser le dict en xml, et votre modèle de données devient beaucoup plus détendu (le dict peuvent avoir des valeurs manquantes, etc.).
- La meilleure chose est de faire passer un dataset fortement typé. Ensuite, le contrat est dans et coups de pied.
- 97 params!? Sonne comme un quotidien WTF.
- stackoverflow.com/questions/174968/...
- Btw, vous dites que c'est Java, mais étiquette d'indépendant de la langue, donc je vais prendre la liberté de donner un C idée (et l'espoir qu'il peut être utilisé dans d'autres langues. Tout d'abord, bien sûr, utiliser CONST où, éventuellement, & de sens, ne le laissez pas douter. Même si il est habituellement possible de savoir si une valeur est entrée, sortie et entrée/sortie (modifié par la fonction) ne sont pas si faciles à détecter, de manière générale, j' #define ENTRÉE et de SORTIE et de MODIFIER pour être les cordes à vide et d'utilisation avant chaque paramètre pour le rendre immédiatement évident pour le lecteur.
- Et il ne fait pas de mal d'avoir une norme de codage. Dire, l'entrée de tous les params d'abord, puis ceux qui sont in/out et enfin la sortie de données.
- 97 est excessive et un meilleur modèle d'objet peut aider, mais c'est un service web où seul les appels sont encouragés. Cela étant dit, je serais prêt à parier que la méthode est sans doute de façon trop.
- Une autre application est de le décomposer en
RESTful
appelle xfront.com/REST-Web-Services.html - 97?! Ne pas le modifier, et de les appliquer pour le livre guinness des records!
- Pas un record: stackoverflow.com/questions/174968/....
- escargot: OMG! Comment peut-on faire une telle chose!
- Je parie que le projet a été un projet Cobol et ils sont de la réécrire en Java.
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de limite claire, mais je suis mal à l'aise avec plus de 3 à 4 paramètres. AFAIR Oncle Bob Martin dans Code Propre recommande max 3.
Il y a plusieurs refactorings de réduire le nombre de paramètres de la méthode (voir Travailler Efficacement avec le Code existant, par Michael Plumes pour plus de détails). Ceux-ci viennent à mon esprit:
String surName, String firstName, String streetAddress, String phoneNumber
passer unPerson
objet contenant ces champs)Lorsque vous devez vous demander, il est probablement trop nombreux.
Que Steve McConnell mentionne dans Le Code Complet, règle d'or est de 4 +/-3 paramètres. En moyenne pour l'humain, il est difficile de se souvenir de plus de 4 paramètres, 5-7 devrait être utilisé seulement dans des cas particuliers, et vous ne devez jamais utiliser de 8 ou plus.
Grand Bouddha!! Quatre-vingt-dix-sept????
De bonne pratique généralement le conseille à propos de max. de six à huit. Bien sûr, ymmv, et il y a peut être une raison valable, de temps à autre, pour une neuvième. Mais 97??!!
Quelques pensées ... sont simplement ces données, ou sont les décisions soient fondées sur leurs valeurs?
Si un grand nombre de/la plus grande incidence sur les flux de contrôle, vous avez presque désuète (même compréhensible, ou testables) "conception" (pour de petites valeurs de la "conception").
Si elles sont tout simplement des données, peuvent-ils être regroupés dans des structures et pointeurs ot ces structures passé?
Avez vous de la documentation sur la conception? Peut-être que d'expliquer ce qui se passe.
Oh, et, "le Danger, will Robinson" - quelqu'un qui va passer de 97 paramètres ouvertement pourrait aussi passer n'importe quel nombre - pas alors, évidemment - comme des variables globales.
P. s ne savent pas comment Eclipse fonctionne sur Java, mais avec le C/C++, si vous mettez le paramaeters sur des lignes distinctes
Éclipse sera réellement identifier la ligne avec le mauvais paramètre
Bien, si vous en faites un objet JSON, vous pouvez envelopper tous les 97 (ou plus) dans l'objet et envoyer un seul objet.
Si plus de 5-10 paramètres, puis créer un objet qui prend les paramètres au lieu de cela, il pourrait être un dataset typé, de structure ou de quoi que ce soit.
Au lieu de :
Faire:
Dans ma propre expérience, j'ai constaté que les signatures de méthode de commencer à obtenir confuse et difficile à retenir avec plus de 5 ou 6 paramètres. Et une fois que vous avez passé de 10 paramètres c'est juste ridicule.
Ces paramètres ont vraiment besoin d'être combinés en un objet (ou d'un petit ensemble d'objets) qui détiennent toutes les données. Dans les services que j'utilise, chaque opération de service prend toujours un seul objet de Requête et renvoie une Réponse unique de l'objet.
Autant que les services web aller, je préfère gérer les paramètres comme un seul objet. Alors que votre contrat de données peut changer, vos prolongée contrat ne sera pas. Cela rend vos services dans l'avenir.
Pour tout le reste, je suis pour les 3 paramètres et occasionnellement aller aussi haut que 5.
Bien, je suggère de surcharger la méthode de sorte que vous avez de plus simple, les implémentations de la méthode. Cela peut être particulièrement utile si le nombre de paramètres changent rarement et peuvent être affectés par défaut. Cependant, si ma mémoire est bonne, je ne pense pas que vous pouvez surcharger un appel de service web (vous devez utiliser un distinct du nom de la méthode).
Une autre solution possible consiste à encapsuler les paramètres dans une sorte de métadonnées de classe dont le but est de maintenir les paramètres. Cela permettrait de simplifier la signature de la méthode. Cependant, à certains égards, vous êtes juste le déchargement le problème de la classe de paramètres. Mais, si les paramètres peuvent être catagorized dans des sujets de cette technique peut être employée en utilisant plusieurs classes de métadonnées, chaque qui serait inclus en tant que paramètre pour le service web. Cela devrait simplfy les choses et vous aider à obtenir votre tête autour de ce monstre.
Enfin, c'est difficile à dire sans plus de détails, mais il semble bien que ce code est un candidat sérieux pour le refactoring. Je n'ai pas une règle dure et rapide sur le nombre de paramètres d'une méthode autre que d'accepter le principe général de la simplicité et de la lisibilité.