2009-11-14 5 views
1

Lorsque j'essaie de refactoriser mes fonctions, pour de nouveaux besoins, je trébuche de temps en temps sur la question cruciale:Comment remettre des variables à une fonction? Avec un tableau ou des variables?

Dois-je ajouter une autre variable avec une valeur par défaut? Ou dois-je utiliser un seul tableau, où je peux ajouter une variable supplémentaire sans casser l'API?

+3

Dans quelle langue programmez-vous? Je soupçonne Javascript. – bmargulies

+0

Pouvez-vous donner un exemple d'une fonction que vous voulez refactoriser? – Ether

Répondre

1

Sauf si vous avez besoin de prendre en charge un nombre variable de variables, je pense qu'il est préférable d'identifier explicitement chaque paramètre. Dans la plupart des cas, vous pouvez ajouter une méthode surchargée avec une signature différente pour prendre en charge le paramètre supplémentaire tout en prenant en charge la signature de la méthode d'origine. Si vous utilisez un tableau pour transmettre des variables, cela le rendra trop confus pour les utilisateurs de votre API. Évidemment, il y a des entrées qui se prêtent à un tableau (une liste de points dans un polygone, une liste d'ID de compte sur laquelle vous souhaitez effectuer une action, etc.) mais si ce n'est pas une variable array ou list, vous devez le passer dans la méthode en tant que paramètre séparé.

0

Cela dépend du langage de programmation utilisé.

Si vous avez un langage OO classique, vous devez utiliser un objet que vous pouvez facilement étendre, si vous êtes vraiment préoccupé par la cohérence de l'API.

Si cela n'a pas tellement d'importance, il est possible de modifier la signature de la méthode et de surcharger la méthode avec plus de/différents paramètres.

Si votre langage ne supporte pas non plus et que vous voulez que l'API soit binaire, utilisez un tableau.

0

Plusieurs considérations doivent être prises en compte.

  • Où est la fonction utilisée? - Seulement dans le code que vous avez créé? Une place ou des centaines de places? La quantité de travail qui devra être faite pour maintenir le code existant est importante. N'oubliez pas d'inclure le temps nécessaire pour communiquer avec d'autres programmeurs qui utilisent actuellement votre fonction.
  • Quelle est la criticité du nouveau paramètre? - Voulez-vous l'exiger pour être utilisé? Si elle a une valeur par défaut, cette valeur par défaut va-t-elle interrompre l'utilisation existante de la fonction de manière subtile? Facilité de compréhension - Combien de paramètres sont déjà passés dans la fonction? Plus le nombre est grand, plus le risque de confusion et d'erreur est grand. Code Complete recommande de limiter le nombre de paramètres à 7 ou moins. Si vous avez besoin de plus que cela, vous devriez essayer de résumer certains ou tous les paramètres liés en un seul objet.
  • Autres considérations spéciales - Voulez-vous optimiser vos efforts pour toutes les conditions spéciales telles que la vitesse ou la taille du code? Y a-t-il des considérations spéciales qui doivent être prises en compte pour votre environnement d'exécution? Gardez à l'esprit vos objectifs pour le projet et assurez-vous que vous ne travaillez pas contre eux avec le choix de design que vous faites.
+0

Si je ne devais pas donner plus de 7 paramètres à une fonction, avec une fonction de base de données, disons 10 ou plus de lignes? Je dois donner tous les paramètres à la fonction, dont'I? – MaikL80

+0

La ligne directrice est là pour vous permettre de concevoir des fonctions qui réduisent la confusion en réduisant la complexité.Cela ne garantit pas que vous utiliserez toujours des fonctions qui suivent les mêmes principes. Transmettez définitivement plus de 7 paramètres à une fonction si quelqu'un d'autre l'a écrit et que vous avez besoin de la fonction. Si la plupart des paramètres ne sont pas utilisés ou sont définis sur des valeurs par défaut, vous pouvez envelopper la fonction dans une autre fonction qui vous permet de masquer ces détails. De cette façon, vous pouvez y penser en un seul endroit et réduire la complexité ailleurs. –

+0

Ok, je vois. Mais la question principale reste pour moi. Comment puis-je écrire une fonction d'insertion/mise à jour de base de données avec plus de 7 valeurs? S'il vous plaît ne dites pas, que je devrais normaliser la base de données, il est déjà fait assez bien (je pense). Mais dans certains cas, vous avez un tas de contenu, que vous voulez donner à la fonction de base de données. Vous voyez mon problème? – MaikL80

1

Tout comme de nombreuses questions en programmation, la bonne réponse est "ça dépend". Pour prendre l'exemple Javascript/jQuery, une bonne règle est de savoir si le paramètre sera requis chaque fois que la fonction est appelée ou si elle est facultative.Par exemple, la fonction principale jQuery elle-même nécessite une expression pour déterminer quel élément (s) l'opération aura une incidence sur:

jQuery(expresssion) 

Il n'a pas de sens d'essayer de passer ce paramètre dans le cadre d'un tableau comme il sera nécessaire chaque heure à laquelle cette fonction est appelée. D'autre part, de nombreux plugins jQuery nécessitent plusieurs paramètres divers qui peuvent être optionnels. Par convention, ceux-ci sont passés en paramètres via un tableau 'options'. Comme vous l'avez dit, cela fournit une interface agréable car de nouveaux paramètres peuvent être ajoutés sans affecter l'API existante. Cela rend l'API propre, car l'utilisateur peut ignorer les options qui ne sont pas applicables.

En général, lorsque plusieurs paramètres sont impliqués, les transmettre en tant que tableau est une bonne convention car beaucoup d'entre eux seront certainement optionnels. Cela aurait aidé à nettoyer de nombreuses API WIN32, bien qu'il soit plus difficile de gérer les tableaux en C/C++ qu'en Javascript.

0

Dans son livre Code complet, Steve McConnell décrète qu'une fonction ne devrait jamais avoir plus de 7 arguments, et rarement même plusieurs. Il présente des arguments convaincants - que je ne peux pas citer de mémoire, hélas.

Le code de nettoyage, plus récemment, préconise encore moins d'arguments. Donc, à moins que le nombre de choses à passer est vraiment petit, ils devraient être passés dans une structure enveloppante. Si elles sont homogènes, un tableau. Si non, alors un objet raisonnablement léger devrait être construit à cet effet.

0

Vous ne devriez faire ni l'un ni l'autre. Il suffit d'ajouter le paramètre et de changer tous les appelants pour fournir la valeur par défaut. La raison en est que les paramètres avec des valeurs par défaut peuvent seulement être à la fin, et ne pourront plus ajouter paramètres requis n'importe où dans la liste des paramètres, sans risque d'erreur d'interprétation. 1.12 ajouter un ou deux paramètres avec les valeurs par défaut 2. certains appelants le fourniront, et d'autres s'appuieront sur les valeurs par défaut. [une demi-année est passée] 3. ajouter un paramètre requis (avant eux) 4. changer tous les appelants pour accepter le paramètre requis 5. recevoir un appel téléphonique, ou un autre événement qui vous fera oublier de changer l'un des instances dans la partie n ° 2 6. maintenant votre programme compile parfaitement, mais n'est pas valide.

Malheureusement, en sémantique d'appel de fonction, nous n'avons généralement pas la possibilité de dire, par nom, quelle valeur va où.

Array n'est pas non plus une solution appropriée. Array devrait être utilisé comme une connexion d'objets similaires, sur lesquels une activité uniforme est effectuée. Comme ils disent here, si cela vaut la peine de refactoring, cela vaut la peine de refactoring maintenant.

Questions connexes