Méthode vs Fonction vs Procédure

107

Question simple, mais j’entends souvent ces trois termes définis avec une telle férocité, mais qui m’ont appris à signifier différentes choses au fil des ans.

Quelles sont les définitions "correctes" de "Procédures", "Méthodes", "Fonction", "Sous-programmes", etc.?

Django Reinhardt
la source
4
vous
renoncez
1
@teresko: Je pense que le "sous-programme" est plus courant.
mk12

Réponses:

108

Je vais avec une réponse différente ici: pratiquement, il n'y a vraiment aucune différence , à la légère exception que "méthode" se réfère généralement à un sous-programme associé à un objet dans les langages OO.

Les termes "procédure, fonction, sous-programme, sous-programme et méthode" signifient vraiment la même chose: un sous-programme appelable dans un programme plus vaste. Mais il est difficile de trouver une définition qui capture toutes les variantes d'utilisation de ces termes, car ils ne sont pas utilisés de manière uniforme dans les langages de programmation ou les paradigmes.

Vous pourriez dire qu'une fonction renvoie une valeur. Eh bien, la fonction C suivante ne renvoie pas de valeur:

void f() { return; }

... mais je doute que vous trouviez quelqu'un qui pourrait appeler cela une procédure.

Bien sûr, en Pascal, les procédures ne renvoient pas de valeurs et les fonctions renvoient des valeurs, mais cela reflète simplement la façon dont Pascal a été conçu. En Fortran, une fonction renvoie une valeur et un sous-programme renvoie plusieurs valeurs. Pourtant, rien de tout cela ne nous permet vraiment de proposer une définition "universelle" de ces termes.

En fait, le terme "programmation procédurale" désigne toute une classe de langages, notamment le C, le Fortran et le Pascal, dont un seul utilise le terme "procédure" pour signifier n'importe quoi.

Donc, rien de tout cela n’est vraiment cohérent. La seule exception est probablement "méthode", qui semble être utilisée presque entièrement avec les langages OO, en référence à une fonction associée à un objet. Même si cela n’est pas toujours cohérent. C ++, par exemple, utilise généralement le terme "fonction membre" plutôt que le terme méthode (même si le terme "méthode" est entré dans la langue vernaculaire C ++ parmi les programmeurs).

Le fait est que rien de tout cela n’est vraiment cohérent. Cela reflète simplement la terminologie employée par les langues en vogue à l’époque.

Charles Salvia
la source
C'est précisément ce que je pensais que la réponse était. (J'aurais dû ajouter "sous-programme" après coup). Puis-je demander: pourquoi ne trouveriez-vous pas quelqu'un qui appelle cette fonction C une "procédure"? Parce que c'est techniquement incorrect, ou parce que le terme "procédure" n'est plus à la mode?
Django Reinhardt
7
Les programmeurs C utilisent le terme "fonction" simplement parce que les concepteurs de C ont utilisé ce terme.
Charles Salvia
15
Ne jetons pas le bébé avec l'eau du bain. Le fait que la terminologie ne soit pas utilisée de manière cohérente ne signifie pas que les différents termes n'ont pas de signification différente. Les définitions de @ Bruce et de Frank sont largement reconnues et non idiosyncratiques. Le fait que les significations ne soient pas universelles est important, mais cela ne justifie pas le saut: "pratiquement, il n'y a pas de différence". (@Django)
LarsH
9
Type de dual en C ++, qui appelle les méthodes "fonctions membres", les fonctions d'appel Java et C # "méthodes statiques".
Jörg W Mittag
2
La réponse de Bruce est sans aucun doute celle que vous devriez choisir si vous débutez dans la programmation. Ses définitions seront tout à fait correctes dans 99% des cas. Mais je cherchais davantage une réponse technique / théorique. Parfois, les nouveaux programmeurs ne connaissent que leur propre domaine, et insistent sur le fait qu’il n’ya que cela. En réalité, il y a des programmeurs travaillant aujourd'hui qui utilisent encore des langages plus anciens et qui ne se trompent pas pour utiliser des définitions différentes. C'est ce qui m'intéressait le plus.
Django Reinhardt Le
67

Une fonction renvoie une valeur, mais pas une procédure .

Une méthode est similaire à une fonction, mais interne à une partie d'une classe. Le terme méthode est utilisé presque exclusivement dans la programmation orientée objet.

Bruce Alderman
la source
8
Pas exactement interne. Une méthode est une fonction ou une procédure qui fait partie d'une classe.
Scott Whitlock
8
Donc, une "procédure stockée" en SQL ne renvoie aucune valeur? Qu'en est-il d'une "procédure" dans quelque chose comme Pascal? Vos définitions sont-elles basées sur les tendances actuelles ou doivent-elles être considérées comme des définitions universelles? Merci!
Django Reinhardt
3
@ Django: En Pascal, une procédure ne peut pas avoir de valeur de retour et une fonction doit avoir une valeur de retour. Dans d'autres langues, la terminologie peut être utilisée de manière plus vague.
Bruce Alderman
1
FWIW, FORTRAN avait des SUBROUTINES et des FONCTIONS des tout premiers jours, la différence étant qu’une SUBROUTINE ne retournait pas de valeur. Je ne me souviens pas d’ALGOL, dont Pascal est issu.
David Thornley
2
@ 3p1c_d3m0n Certes, les functiondeux rôles sont remplis dans JS, mais toutes les fonctions de JS reviennent. Lorsqu'une instruction return n'a pas de valeur, la valeur est implicitement undefined. Lorsqu'une instruction return est absente, l'interprète ajoute une instruction return implicite. Esotérique, peut-être, mais cela correspond à la définition donnée ici. C'est pourquoi var x = function() {}();est légal dans JS; sinon pour les retours implicites, il faudrait que ce soit une erreur, comme ce serait le cas en Pascal.
Point
52

Une fonction est quelque chose qui prend un tas d’intrants et renvoie une ou plusieurs valeurs. Si les valeurs renvoyées sont entièrement déterminées par les entrées et si la fonction n'a aucun effet secondaire (journalisation, peut-être, ou provoquant des changements d'état en dehors de lui-même), cela s'appelle une fonction pure.

Une procédure est une fonction qui ne renvoie pas de valeur. Cela signifie notamment qu'une procédure ne peut que provoquer des effets secondaires. (Cela pourrait inclure la mutation d'un paramètre d'entrée!)

Une méthode est une fonction qui ferme sur un ensemble de variables, c'est-à-dire une fermeture . Il prend zéro ou plus de paramètres d'entrée, a accès à cet ensemble de variables et renvoie zéro ou plus de valeurs. Dans les langages OO, ces méthodes sont attachées à des objets ou à des classes.

Dans la plupart des langages OO classiques, ces variables fermées sont appelées champs membres, ou variables d'instance, d'un objet. Une méthode peut être une fonction pure, une fonction impure ou une procédure.

Cette dernière définition conduit à la correspondance objet = struct + fermures .

Frank Shearar
la source
5
Ainsi, un objet est un ensemble de variables et un ensemble de fermetures sur ces variables communes. Fondamentalement, les langages orientés objet ont toujours eu des fermetures et personne ne le savait? Vue intéressante! +1
Giorgio
1
Je ne crois pas que la plupart des méthodes ferment sur rien. foo.doSomething()n'est pas sans paramètre. Il a un paramètre (l'objet foo) avec donné avec du sucre syntaxique. Une fermeture serait capable de référencer son objet sans avoir besoin d'un tel paramètre. Cela ne veut pas dire que les méthodes ne peuvent pas être des fermetures, mais que la plupart ne le sont pas, et qu'être OO n'est pas suffisant pour qu'un langage prenne en charge les fermetures.
8bittree
3
foo.doSomething()ferme sur la foovariable. Toute déclaration en doSomethingpeut accéder foovia thisou self, en fonction de votre langue. C’est la définition même de «fermer par-dessus». Les classes se ferment sur leurs variables de membre, donc (en ignorant "qu'est-ce que OO"), OO est suffisant. C'est assez connu dans la littérature ...
Frank Shearar
1
Euh non. Vous voyez ce petit foo.à l'avant foo.doSomething()? C'est vous qui passez doSomething()un paramètre. Le fait que ce ne soit pas entre parenthèses ne signifie pas que ce n'est pas un paramètre. La méthode thisou selfà l'intérieur de la méthode est simplement un sucre syntaxique pour référencer ce paramètre.
8bittree
1
@ FrankShearar, je dirais qu'il n'y a que deux distinctions raisonnablement claires en informatique: les données et les instructions. Même cela sort par la fenêtre dans le cas (inhabituel) de code à modification automatique. Dans OO, ce que l'on appelle généralement une "méthode" (ou une "fonction membre") ne doit pas nécessairement être une méthode ou une fonction selon votre définition - tous ces mots d'usage courant sont en réalité des synonymes ayant une signification générale et interchangeable. La "fonction impure", dont vous faites allusion à l'existence, est simplement un autre synonyme (et aussi le plus long et le plus jargoniste) du même concept général "d'instructions".
Steve
14

Bruce a une bonne réponse . J'ajouterais sémantiquement:

  • Une procédure doit "faire quelque chose" aux arguments ou provoquer un autre effet secondaire (par exemple printf)
  • Une fonction devrait (a) répondre à une question sur les arguments, ou (b) calculer une nouvelle valeur en fonction des arguments
  • Une méthode de fonction devrait répondre à une question sur l'état de l'objet
  • Une méthode procédurale devrait changer l'état de l'objet
Scott Whitlock
la source
Très bonne réponse! Juste un petit ajout: A procedure should "do something" to the arguments- ou causer un autre effet secondaire (par exemple printf).
Allon Guralnek,
1
@Allon Notez que printfrenvoie une valeur - le nombre de caractères imprimés - est donc techniquement une fonction.
Sjoerd
@Sjoerd Je ne suis pas d'accord pour dire que printfc'est une valeur. Il a eu un effet secondaire spécifique en dehors de sa portée d’invocation: à savoir l’entrée / sortie sur la sortie standard supposée. Même si Scott n’était pas explicite à propos de cette distinction, les fonctions de programmation fonctionnelle ne sont pas censées avoir d’effets secondaires et devraient pouvoir répondre aux questions comme si vous aviez les données qu’elles renvoient.
Alan
4

bonnes réponses détaillées ci-dessus; la nouvelle est qu'ils vont tous les goûts de sous-routines; la signification de chaque terme varie en fonction du contexte du langage de programmation

en général, les fonctions retournent une valeur, mais elles n'ont pas à

les méthodes sont un termes génériques de POO à l'heure actuelle

en SQL, les procédures stockées ont des sorties mais ne renvoient généralement qu'un code d'erreur, tandis que les fonctions définies par l'utilisateur doivent renvoyer une valeur (qui peut être un ensemble de résultats)

encore une fois, la différence précise entre ces termes dépend de votre interlocuteur!

Steven A. Lowe
la source
2

80% des compétences sont directement liées à la connaissance de la nomenclature,

95% de la productivité est la capacité d'identifier ce qui est utile pour le moment malgré les termes utilisés pour le décrire

Je préfère plutôt appeler toutes les méthodes en c #, sauf lorsque j’utilisais MSSQL, nous avions des sproc, mais bien sûr, nous utilisons maintenant Postgres, qui sont appelées fonctions.

MvcCmsJon
la source
13
83,5% de toutes les statistiques sont composées sur place ;-P
Django Reinhardt
1
Je dois admettre que je suis nerveux lorsque j'entends quelqu'un parler du mot "méthode" lorsque je travaille dans une langue autre que OO. Il semble être fortement corrélé avec le fait de rencontrer du code non idiomatique.
Racheet
J'utilise «Méthode» pour faire référence au code C, car de nombreux programmeurs orientés objet avec lesquels j'ai affaire ont une dépression mentale en entendant les termes procédure ou fonction. Pour le plaisir, si je veux vraiment les déconner, je pourrais échanger les termes de manière aléatoire. Ce n'est pas bon, un peu comme inviter un poltergeist chez vous ... :)
mattnz