Surcharge ou paramètres facultatifs

10

Lorsque j'ai une fonction qui pourrait recevoir ou non un certain paramètre, est-il préférable de surcharger la fonction ou d'ajouter des arguments facultatifs?

Si chacun a ses hauts et ses bas - quand devrais-je les utiliser?

JNF
la source
Du point de vue de l'optimisation, avoir des paramètres facultatifs est une meilleure option.
Maneet Puri

Réponses:

12

Si le langage les prend en charge correctement (par exemple, la sécurité de type, le cas échéant), je préférerais des arguments facultatifs pour les raisons suivantes:

  • Ils transmettent mieux votre intention afin que personne ne soupçonne que votre surcharge de fonction fera quelque chose de différent (ce qui ne devrait probablement pas de toute façon).
  • Moins de code à maintenir, même si la surcharge de fonction ne délègue que la plus complète. Si vous souhaitez renommer la fonction ultérieurement, vous avez au moins 3 emplacements pour le faire (deux définitions + un appel).
  • Le compilateur (le cas échéant) peut générer des binaires plus petits.
  • Les arguments facultatifs évoluent mieux, au moins dans certaines langues. Et si vous voulez avoir 3 arguments optionnels avec la possibilité de mélanger et assortir? Pour une flexibilité totale, vous auriez besoin de 6 surcharges pour ce faire.
  • S'il s'agit d'une méthode objet, plusieurs surcharges entraveront considérablement la mise en œuvre des remplacements dans les sous-classes.
Benjamin Kloster
la source
N'auriez-vous pas besoin de 8? Trois arguments optionnels a, bet ca ces possibilités: rien, a, b, c, ab, ac, bc, abc. C'est 2^npour différents types, pasn!
Mark
0

En supposant une situation de constructeur: je choisis souvent un modèle de constructeur fluide pour éviter les situations avec de nombreuses options.

Par exemple. Ordering.natural().onResultOf(function).reverse().compound(Ordering.natural().onResultOf(function2))est un exemple d'appel d'une interface de générateur fluide implémentée dans Guava.

Bien sûr, vous avez maintenant besoin d'un objet séparé pour conserver l'état de votre générateur, mais vous réduisez la complexité globale en séparant le comportement de la construction du comportement du construit.

Dibbeke
la source
Cela ne répond pas à la question.
Andy