web-dev-qa-db-fra.com

Quel est l’utilisation/l’avantage de la surcharge de fonctions?

Quel est l’utilisation/l’avantage de la surcharge de fonctions?

22
Hari kanna

L’OMI, le principal avantage est la cohérence dans la dénomination des méthodes/fonctions qui exécutent logiquement des tâches très similaires et qui diffèrent légèrement en acceptant des paramètres différents. Cela permet de réutiliser le même nom de méthode sur plusieurs implémentations.

par exemple. Les surcharges: (bien)

function Person[] FindPersons(string nameOfPerson) { ... }
function Person[] FindPersons(date dateOfBirth) { ... }
function Person[] FindPersons(int age, string dogsName) { ... }

Sont préférables aux fonctions 'nommés de manière unique': (Pire)

function Person[] FindPersonsByName(string nameOfPerson) { ... }
function Person[] FindPersonsByDOB(date dateOfBirth) { ... }
function Person[] FindPersonsByAgeAndDogsName(int age, string dogsName) { ... }

Ainsi, le codeur qui écrit un client qui appelle/utilise ces fonctions peut opérer à un niveau plus élevé de pensée conceptuelle ("J'ai besoin de trouver une personne") et n'a pas besoin de mémoriser/localiser un nom de fonction artificiel.

Avec le typage statique, le compilateur sera laissé pour correspondre à la surcharge applicable en fonction des paramètres d'utilisation. Pour le typage dynamique, cette même correspondance aura lieu au moment de l'exécution, pouvant entraîner un échec si aucune correspondance appropriée n'est trouvée.

20
StuartLC

Question très valide.

Vous obtenez une cohérence dans la dénomination, mais au prix de l'ambiguïté sur l'implémentation exacte .

  • Le vrai problème est la mémoire humaine pour Noms de méthodes, non? nous trouvons plus facile de nous souvenir des noms couramment utilisés.

  • et économie de frappe, permettant des noms de méthode plus courts? moins de noms différents signifie (mathématiquement) que le nom lui-même contient moins d’informations.

Ces deux problèmes ne devraient pas poser de problème, avec les IDE qui recherchent/supposent/insèrent des noms de méthodes rapidement en fonction des premiers caractères, et des types paramètre/retour.

Mais je pense qu'il y a un coût, en précision de codage, ainsi qu'un avantage.

6
Sanjay Manohar

La surcharge est une forme de polymorphisme. Il permet au programmeur d'écrire des fonctions pour faire la même chose conceptuellement sur différents types de données sans changer le nom. (Cela permet également au programmeur d'écrire des fonctions pour faire différentes choses conceptuellement en fonction des paramètres, mais c'est une très mauvaise idée.)

Cela permet une cohérence dans la notation, ce qui est bon à la fois pour lire et écrire du code. I/O est une utilisation très courante. Dans la plupart des langages couramment utilisés, une fonction ou un opérateur produira ce que vous voulez, comme printf() et kin en C, operator<<() en C++, PRINT dans l'ancien BASICS que j'utilisais, peu importe. Les langues qui requièrent des fonctions telles que printint(), printstring(), printfloat(), etc., ne se sont jamais accrochées.

Cela fonctionne très bien avec les modèles C++ et toute autre construction où vous ne savez pas nécessairement quel est le type de variable au moment de l'écriture du code.

5
David Thornley
  1. Plusieurs comportements à la même fonction en fonction des paramètres.
  2. Votre fonction peut vouloir utiliser certains détails facultatifs. Par exemple, l'exemple suivant souhaite ajouter un membre à l'objet Membres, avec les détails que l'utilisateur connaît. Ici l'âge est le détail minimum pour créer un membre, age et memberOf sont facultatifs. [Remarque: la définition des fonctions n'est pas fournie dans l'extrait de code.]

    public class Members
    {
        public System.Collections.Generic.List<Member> TeamMembers;
    
        public AddMember(Member m) {}
        public AddMember(string name) {}
        public AddMember(string name, int age) {}
        public AddMember(string name, int age, string[] memberOf) {}
    
        public class Member
        {
            public string Name { get; set; }
            public int Age { get; set; }
            public string[] MemberOf { get; set; }
        }
    }
    
  3. Vous souhaiterez peut-être que votre méthode soit adaptée à plusieurs types d'objets. Ex. La méthode Console.WriteLine () est capable d'écrire une ligne vide, bool, int, chaîne, char [], float etc. sur la console. Cela a été rendu possible par une surcharge de fonctions.

4
SaravananArumugam

Une fonction/méthode est parfois capable de prendre différents types de paramètres afin de faire son travail. C'est le moment de surcharger les fonctions. Sinon, vous devriez avoir des fonctions différentes pour le même fonctionnalité , ce qui est source de confusion et de mauvaise pratique.

  • Les constructeurs sont des fonctions, ils peuvent donc être surchargés. C'est très pratique.
  • Lorsque vous commencez à être surchargé, il est facile de vous énerver en pensant que vous rendez service aux futurs développeurs en leur offrant des options plus pratiques. Essayez d'éviter cela. Les surcharges inutiles peuvent confondre les futurs développeurs et entraîner la maintenance de code inutile.
3
Patrick Karcher

Il fournit plusieurs comportements au même objet en ce qui concerne les attributs de l'objet.

Par exemple, une méthode appelée addUs(a,b) ajoute a et b.

Donc, la définition sera:

int addUs(int a, int b){
  return a+b;
}

Mais maintenant, si vous voulez que vos arguments soient des objets d'une classe, dites:

class Demo{
  int height;
  int width;
}

Vous voulez que la même fonction addUs() renvoie un nouvel objet dont les attributs hauteur et largeur ont la valeur de la somme de la hauteur et de la largeur des 2 arguments passés.

Alors maintenant, la définition serait:

Demo addUs(Demo a Demo b){
  Demo this;
  this.height = a.height + b.height;
  this.width = a.width + b.width;
  return this;
}
1
Sarfraz

Parfois, vous avez plusieurs façons d’accomplir la même chose en fonction du contexte et des entrées disponibles. Pour les langages statiques de type strict, les définitions de fonctions peuvent être assez rigides et doivent être explicitement définies à l’avance.

Les constructeurs en sont généralement le meilleur exemple classique. Si vous construisez un objet complexe et que vous ne disposez pas de toutes les pièces, vous voulez toujours pouvoir transmettre ce que vous avez à un constructeur et le laisser remplir le reste. Et ce que vous avez peut varier énormément et doit être défini de différentes manières en tant que paramètres des constructeurs.

1
David

polymorphisme ad-hoc is good stuff !!

1
jumpdart

C'est le mécanisme de fonction avec le même nom mais qui effectue une tâche différente sur une instance différente. Nous nous souvenons facilement des noms couramment utilisés.

0
Vighanesh Gursale

Vous voudrez peut-être faire des choses similaires dans le code avec des paramètres différents. Si vous deviez attribuer un nom différent à chaque fonction, la lisibilité du code serait très mauvaise.

0
LostMohican