web-dev-qa-db-fra.com

Méthode vs fonction vs procédure

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

Quelles sont les définitions "correctes" de "procédures", "méthodes", "fonction", "sous-programmes", etc.?

113
Django Reinhardt

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

Les termes "procédure, fonction, sous-programme, sous-programme et méthode" signifient tous 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 cohérente 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 ce n'est qu'un reflet de la façon dont Pascal a été conçu. Dans Fortran, une fonction renvoie une valeur et un sous-programme renvoie plusieurs valeurs. Pourtant, rien de tout cela ne nous permet vraiment de trouver une définition "universelle" de ces termes.

En fait, le terme "programmation procédurale" fait référence à toute une classe de langages, dont C, Fortran et Pascal, dont un seul utilise réellement le terme "procédure" pour signifier quoi que ce soit.

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

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

109
Charles Salvia

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

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

69
Bruce Alderman

Une fonction est quelque chose qui prend un tas d'entrées et renvoie une ou plusieurs valeurs. Si les valeurs renvoyées sont entièrement déterminées par les entrées, et que la fonction n'a pas d'effets secondaires (enregistrement, peut-être, ou provoquant des changements d'état en dehors d'elle-même), alors cela s'appelle une fonction pure.

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

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

Dans la plupart des langages courants OO, 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 + fermetures .

53
Frank Shearar

Bruce a un 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 doit (a) répondre à une question sur les arguments, ou (b) calculer une nouvelle valeur basée sur les arguments
  • Une méthode de fonction doit répondre à une question sur l'état de l'objet
  • Une méthode de procédure doit changer l'état de l'objet
14
Scott Whitlock

bonnes réponses détaillées ci-dessus; la courte histoire est qu'ils auront tous des saveurs de sous-programmes; la signification de chaque terme variera selon le contexte du langage de programmation

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

les méthodes sont des termes génériques OOP actuellement

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 qui vous parlez!

4
Steven A. Lowe

80% de la compétence est directement liée à la familiarité avec 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 de loin les appeler toutes les méthodes en c #, sauf lorsque j'ai utilisé MSSQL, nous avions des sproc, mais bien sûr, nous utilisons maintenant Postgres et elles sont appelées fonctions.

2
MvcCmsJon