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.?
programming-practices
coding-standards
terminology
Django Reinhardt
quelle
quelle
Antworten:
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:
... 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.
quelle
Eine Funktion gibt einen Wert zurück, eine Prozedur jedoch nicht.
Eine Methode ähnelt einer Funktion, ist
jedochTeil einer Klasse. Der Begriff Methode wird fast ausschließlich in der objektorientierten Programmierung verwendet.quelle
function
beide Rollen in JS erfüllt werden, aber JS-Funktionen kehren alle zurück. Wenn eine return-Anweisung keinen Wert hat, ist der Wert implizitundefined
. 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, warumvar x = function() {}();
JS legal ist. Ohne implizite Rückgaben müsste dies ein Fehler sein, wie es bei Pascal der Fall wäre.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 .
quelle
foo.doSomething()
ist nicht parameterlos. Es hat einen Parameter (das Objektfoo
) 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.foo.doSomething()
schließt über derfoo
Variablen. Jede Anweisung indoSomething
kann je nach Sprachefoo
überthis
oderself
abgerufen 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 ...foo.
vornefoo.doSomething()
? Damit übergeben SiedoSomething()
einen Parameter. Nur weil es nicht in Klammern steht, heißt das nicht, dass es kein Parameter ist. Dasthis
oderself
innerhalb der Methode ist einfach syntaktischer Zucker, um auf diesen Parameter zu verweisen.Bruce hat eine gute Antwort . Ich würde semantisch hinzufügen:
printf
)quelle
A procedure should "do something" to the arguments
- oder eine andere Nebenwirkung verursachen (zBprintf
).printf
ein Wert zurückgegeben wird - die Anzahl der gedruckten Zeichen -, sodass es sich technisch um eine Funktion handelt.printf
ein 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.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!
quelle
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.
quelle