Methode vs Funktion vs Prozedur

107

Einfache Frage, aber ich höre oft diese drei Begriffe, die mit solcher Wildheit definiert wurden, aber von denen ich wusste, dass sie im Laufe der Jahre unterschiedliche Bedeutungen hatten.

Was sind die "richtigen" Definitionen von "Prozeduren", "Methoden", "Funktionen", "Unterprogrammen" usw.?

Django Reinhardt
quelle
4
Sie verzichten auf "Routine"
Mefisto
1
@teresko: Ich denke, "Unterprogramm" ist häufiger.
mk12

Antworten:

108

Ich gehe hier mit einer anderen Antwort vor: In der Praxis gibt es keinen Unterschied , mit der geringfügigen Ausnahme, dass "Methode" sich normalerweise auf ein Unterprogramm bezieht, das einem Objekt in OO-Sprachen zugeordnet ist.

Die Begriffe "Prozedur, Funktion, Unterprogramm, Unterprogramm und Methode" bedeuten alle dasselbe: ein aufrufbares Unterprogramm innerhalb eines größeren Programms. Es ist jedoch schwierig, eine Definition zu finden, die alle Variantennutzungen dieser Begriffe erfasst, da sie nicht konsistent in allen Programmiersprachen oder Paradigmen verwendet werden.

Man könnte sagen, eine Funktion gibt einen Wert zurück. Die folgende C-Funktion gibt keinen Wert zurück:

void f() { return; }

... aber ich bezweifle, dass Sie jemanden finden würden, der es eine Prozedur nennen würde.

Sicher, in Pascal geben Prozeduren keine Werte zurück, und Funktionen geben Werte zurück, aber das ist nur eine Widerspiegelung dessen, wie Pascal entworfen wurde. In Fortran gibt eine Funktion einen Wert zurück und eine Unterroutine gibt mehrere Werte zurück. Nichts davon erlaubt es uns jedoch, eine "universelle" Definition für diese Begriffe zu finden.

Tatsächlich bezieht sich der Begriff "prozedurale Programmierung" auf eine ganze Klasse von Sprachen, einschließlich C, Fortran und Pascal, von denen nur eine den Begriff "Prozedur" verwendet, um etwas zu bedeuten.

Nichts davon ist also wirklich konsistent. Die einzige Ausnahme ist wahrscheinlich "Methode", die fast ausschließlich für OO-Sprachen verwendet wird und sich auf eine Funktion bezieht, die einem Objekt zugeordnet ist. Obwohl auch dies nicht immer konsistent ist. Beispielsweise wird in C ++ normalerweise der Begriff "Elementfunktion" anstelle von "Methode" verwendet (obwohl sich der Begriff "Methode" unter Programmierern in die Umgangssprache von C ++ eingeschlichen hat).

Der Punkt ist, nichts davon ist wirklich konsistent. Es spiegelt einfach die Terminologie wider, die von den jeweils aktuellen Sprachen verwendet wird.

Charles Salvia
quelle
Genau das habe ich für die Antwort gehalten. (Ich hätte im Nachhinein "Subroutine" als weitere Variante hinzufügen sollen.) Kann ich fragen: Warum würden Sie niemanden finden, der diese C-Funktion eine "Prozedur" nennt? Weil es technisch inkorrekt ist oder weil der Begriff "Verfahren" derzeit nicht in Mode ist?
Django Reinhardt
7
C-Programmierer verwenden den Begriff "Funktion", weil die Designer von C diesen Begriff verwendet haben.
Charles Salvia
15
Werfen wir das Baby nicht mit dem Badewasser raus. Nur weil die Terminologie nicht mit voller Konsistenz verwendet wird, heißt das nicht, dass die verschiedenen Begriffe keine unterschiedlichen Bedeutungen haben. Die Definitionen von @ Bruce und @ Frank sind weithin anerkannt und nicht eigenwillig. Die Tatsache, dass die Bedeutungen nicht universell sind, ist wichtig, aber es rechtfertigt nicht den Sprung zu "praktisch gibt es wirklich keinen Unterschied". (@Django)
LarsH
9
Art von Dual zu C ++, das Methoden "Mitgliedsfunktionen" aufruft, Java- und C # -Aufruffunktionen "statische Methoden".
Jörg W Mittag
2
Die Antwort von Bruce ist definitiv die, für die Sie sich entscheiden sollten, wenn Sie neu in der Programmierung sind. Seine Definitionen sind in 99% der Fälle absolut korrekt. Aber ich suchte eher nach einer technischen / theoretischen Antwort. Manchmal kennen neuere Programmierer nur ihre eigene Domäne und bestehen darauf, dass alles vorhanden ist. In Wirklichkeit gibt es heute Programmierer, die noch ältere Sprachen verwenden und die nicht "falsch" sind, wenn sie unterschiedliche Definitionen verwenden. Das hat mich am meisten interessiert.
Django Reinhardt
67

Eine Funktion gibt einen Wert zurück, eine Prozedur jedoch nicht.

Eine Methode ähnelt einer Funktion, ist jedoch Teil einer Klasse. Der Begriff Methode wird fast ausschließlich in der objektorientierten Programmierung verwendet.

Bruce Alderman
quelle
8
Nicht genau intern. Eine Methode ist eine Funktion oder Prozedur, die Teil einer Klasse ist.
Scott Whitlock
8
Gibt eine "gespeicherte Prozedur" in SQL also keine Werte zurück? Was ist mit einer "Prozedur" in so etwas wie Pascal? Basieren Ihre Definitionen auf aktuellen Trends oder sollten sie als universelle Definitionen betrachtet werden? Vielen Dank!
Django Reinhardt
3
@Django: In Pascal kann eine Prozedur keinen Rückgabewert haben, und eine Funktion muss einen Rückgabewert haben. In einigen anderen Sprachen wird die Terminologie möglicherweise lockerer verwendet.
Bruce Alderman
1
FWIW, FORTRAN hatte von Anfang an SUBROUTINEN und FUNKTIONEN, mit dem Unterschied, dass eine SUBROUTINE keinen Wert zurückgab. Ich erinnere mich nicht an ALGOL, von dem Pascal abstammt.
David Thornley
2
@ 3p1c_d3m0n Es ist sicher richtig, dass functionbeide Rollen in JS erfüllt werden, aber JS-Funktionen kehren alle zurück. Wenn eine return-Anweisung keinen Wert hat, ist der Wert implizit undefined. Wenn eine return-Anweisung fehlt, fügt der Interpreter eine implizite return-Anweisung hinzu. Vielleicht esoterisch, aber es stimmt mit der hier gegebenen Definition überein. Dies ist der Grund, warum var x = function() {}();JS legal ist. Ohne implizite Rückgaben müsste dies ein Fehler sein, wie es bei Pascal der Fall wäre.
Semikolon
52

Eine Funktion benötigt eine Reihe von Eingaben und gibt einen oder mehrere Werte zurück. Wenn die zurückgegebenen Werte vollständig von den Eingaben bestimmt werden und die Funktion keine Nebenwirkungen hat (Protokollierung möglicherweise oder Verursachen von Zustandsänderungen außerhalb von sich selbst), wird sie als reine Funktion bezeichnet.

Eine Prozedur ist eine Funktion, die keinen Wert zurückgibt. Dies bedeutet insbesondere, dass ein Eingriff nur Nebenwirkungen hervorrufen kann. (Das könnte das Mutieren eines Eingabeparameters beinhalten!)

Eine Methode ist eine Funktion, die über eine Reihe von Variablen geschlossen wird, dh über einen Abschluss . Es akzeptiert null oder mehr Eingabeparameter, hat Zugriff auf diesen Variablensatz und gibt null oder mehr Werte zurück. In OO-Sprachen werden diese Methoden an Objekte oder Klassen angehängt.

In den meisten gängigen OO-Sprachen werden diese geschlossenen Variablen als Mitgliedsfelder oder Instanzvariablen eines Objekts bezeichnet. Eine Methode kann eine reine Funktion, eine unreine Funktion oder eine Prozedur sein.

Die letztere Definition führt zu der Entsprechung object = struct + closures .

Frank Shearar
quelle
5
Ein Objekt ist also eine Sammlung von Variablen und eine Sammlung von Closures über diese gemeinsamen Variablen. Grundsätzlich hatten objektorientierte Sprachen schon immer Abschlüsse und niemand wusste es? Interessante Aussicht! +1
Giorgio
1
Ich glaube nicht, dass die meisten Methoden über irgendetwas schließen. foo.doSomething()ist nicht parameterlos. Es hat einen Parameter (das Objekt foo) mit etwas syntaktischem Zucker. Ein Abschluss kann auf sein Objekt verweisen, ohne dass ein solcher Parameter erforderlich ist. Das heißt nicht, dass Methoden keine Closures sein können, die meisten jedoch nicht, und dass OO für eine Sprache nicht ausreicht, um Closures zu unterstützen.
8bittree
3
foo.doSomething()schließt über der fooVariablen. Jede Anweisung in doSomethingkann je nach Sprache fooüber thisoder selfabgerufen werden. Dies ist die eigentliche Definition von "close over". Klassen schließen über ihren Mitgliedsvariablen, daher ist OO ausreichend ("was ist OO" ignorierend). Dies ist in der Literatur ziemlich bekannt ...
Frank Shearar
1
Äh, nein. Sehen Sie das kleine foo.vorne foo.doSomething()? Damit übergeben Sie doSomething()einen Parameter. Nur weil es nicht in Klammern steht, heißt das nicht, dass es kein Parameter ist. Das thisoder selfinnerhalb der Methode ist einfach syntaktischer Zucker, um auf diesen Parameter zu verweisen.
8bittree
1
@FrankShearar, ich würde sagen, es gibt nur zwei einigermaßen klare Unterschiede bei der Datenverarbeitung - Daten und Anweisungen. Auch das geht im (ungewöhnlichen) Fall von selbstmodifizierendem Code aus dem Fenster. In OO muss das, was allgemein als "Methode" (oder "Elementfunktion") bezeichnet wird, nach Ihrer Definition weder eine Methode noch eine Funktion sein - alle diese allgemein verwendeten Wörter sind im Grunde genommen Synonyme mit einer allgemeinen und austauschbaren Bedeutung. Die "unreine Funktion", auf deren Existenz Sie anspielen, ist einfach ein weiteres (und auch umständlichstes und umgangssprachlichstes) Synonym für denselben allgemeinen Begriff von "Anweisungen".
Steve
14

Bruce hat eine gute Antwort . Ich würde semantisch hinzufügen:

  • Eine Prozedur sollte etwas mit den Argumenten "machen" oder eine andere Nebenwirkung verursachen (zB printf)
  • Eine Funktion sollte (a) eine Frage zu den Argumenten beantworten oder (b) einen neuen Wert basierend auf den Argumenten berechnen
  • Eine Funktionsmethode sollte eine Frage zum Status des Objekts beantworten
  • Eine Prozedurmethode sollte den Status des Objekts ändern
Scott Whitlock
quelle
Gute Antwort! Nur ein winziger Zusatz: A procedure should "do something" to the arguments- oder eine andere Nebenwirkung verursachen (zB printf).
Allon Guralnek
1
@Allon Beachten Sie, dass printfein Wert zurückgegeben wird - die Anzahl der gedruckten Zeichen -, sodass es sich technisch um eine Funktion handelt.
Sjoerd
@Sjoerd Ich stimme nicht zu, dass dies printfein Wert ist. Es hatte einen bestimmten Nebeneffekt außerhalb seines Aufrufbereichs: nämlich E / A für jede Standardausgabe, die es sein sollte. Obwohl Scott diese Unterscheidung nicht explizit gemacht hat, sollten Funktionen in der funktionalen Programmierung keine Nebenwirkungen haben und in der Lage sein, Fragen so zu beantworten, als ob Sie die tatsächlichen Daten hätten, die sie zurückgeben.
Alan
4

gute detaillierte Antworten oben; die kurze Geschichte ist, dass sie alle Aromen von Unterprogrammen werden; Was mit jedem Begriff gemeint ist, hängt vom Kontext der Programmiersprache ab

Im Allgemeinen geben Funktionen einen Wert zurück, müssen dies jedoch nicht

Methoden sind derzeit allgemeine OOP-Begriffe

In SQL haben gespeicherte Prozeduren Ausgaben, geben jedoch normalerweise nur einen Fehlercode zurück, während benutzerdefinierte Funktionen einen Wert zurückgeben müssen (möglicherweise eine Ergebnismenge).

Auch hier hängt der genaue Unterschied zwischen diesen Begriffen davon ab, mit wem Sie sprechen!

Steven A. Lowe
quelle
2

80% der Kenntnisse stehen in direktem Zusammenhang mit der Kenntnis der Nomenklatur.

95% der Produktivität ist die Fähigkeit zu identifizieren, was im Moment nützlich ist, trotz der Begriffe, die verwendet werden, um es zu beschreiben

Ich bevorzuge es ziemlich, sie alle Methoden in c # aufzurufen, außer als ich MSSQL benutzte, hatten wir Sprocs, aber jetzt benutzen wir natürlich Postgres und sie heißen Funktionen.

MvcCmsJon
quelle
13
83,5% aller Statistiken werden vor Ort erstellt ;-P
Django Reinhardt
1
Ich muss zugeben, dass ich nervös werde, wenn ich jemanden höre, der den Begriff "Methode" umkreist, wenn er in einer Nicht-OO-Sprache arbeitet. Es scheint stark mit der Begegnung mit nicht-idiomatischem Code zu korrelieren.
Racheet
Ich verwende 'Methode', wenn ich mich auf C-Code beziehe, weil viele OO-Programmierer, mit denen ich zu tun habe, beim Hören der Begriffe Prozedur oder Funktion einen Nervenzusammenbruch haben. Zum Spaß, wenn ich mich wirklich mit ihnen anlegen möchte, kann ich die Begriffe zufällig austauschen. Es ist nicht gut, so als würde man einen Poltergeist nach Hause einladen ... :)
Mattnz