Funktionen und Methoden

Hai, Leute,

ich hab da 'n Nachhilfeschüler, der scheinbar einen etwas unentschiedenen Lehrer hat (OK - vielleicht kann der ja auch gar nicht dafür). Vorige Woche tauchte im Script die Aussage auf, daß „Methoden“ ein anderer Begriff für „Funktionen“ wäre, es sich also um das Gleiche handelt - gestern tauchte im Script die Aussage auf, daß man Funktionen sorgfältig von Methoden unterscheiden müsse - natürlich ohne genauere Erklärung…
Nun hab ich mich durch diverse Bücher und Unterlagen gewühlt und dabei festgestellt, daß die beiden Begriffe mal gleichgesetzt werden und mal nicht - allerdings wird der Unterscheidungsgrund, wenn überhaupt, nur schwammig definiert und z.T. sogar widersprüchlich…
Also wende ich mich an meine Lieblings-Experten:
Sind Methoden und Funktionen nun das Gleiche, oder nicht - und wenn nicht, wie definiert sich der Unterschied?

Gruß
Sibylle
PS: meine Meinung (bisher): eine Funktion wird im Zuge einer objektorientierten Programmierung Methode genannt…

Also wende ich mich an meine Lieblings-Experten:

gehoer ich dazu? *huepfFreuSpring*

PS: meine Meinung (bisher): eine Funktion wird im Zuge einer
objektorientierten Programmierung Methode genannt…

vorweg… ich weiss es nicht 100%ig … dennoch war ich bis gerade eben der 100%igen Überzeugung, dass es im Grunde das gleiche ist, mit dem kleinem Unterschied, den Du bereits nanntest… es sich bei Methoden um Objektorientierte Sprache handelt.

Bin gespannt, ob man in Javascript dann auch nur noch von
Methoden spricht, wenn das ganze Objektorientiert wird :smile:))))

Grusz mit gesundem 3/4 Wissen
:wink:

PixelKönig

Hallo,

PS: meine Meinung (bisher): eine Funktion wird im Zuge einer
objektorientierten Programmierung Methode genannt…

ja sehe ich im wesentlichen genauso, wenn diese „Funktion“ Bestandteil einer Klasse ist. Man könnte evtl. noch darüber diskutieren, ob Methoden ohne Objektbezug („statische“) evtl. den Begriff „Funktion“ verdienen.

Gruss
Enno

Hi ho,

Methoden schleppen den gesamten Klassenkontext mit sich und sind immer nur über die Klasse (bei statischen Methoden den Klassenbezeichner) aufzurufen.
Funktionen hingegen stehen für sich allein und können flapsig ausgedrückt ohne umgebende Hülle aufgerufen werden.

Ansonsten sehe ich keinen Unterschied, und ehrlich gesagt spielt es keine wirkliche Rolle, ob man das ganze nun Funktion oder Methode nennt… Hauptsache, es funktioniert :wink:

Gruss,

Herb

Hallo Sibylle,

PS: meine Meinung (bisher): eine Funktion wird im Zuge einer
objektorientierten Programmierung Methode genannt…

Fast richtig. Funktionen von Objekten nennt man Methoden. Aber: nur, weil eine Funktion in einer OO-Sprache geschrieben ist, ist es keine Methode. Sie ist nur dann eine Methode, wenn sie Teil eines Objekts ist.

Methoden sind an sich tatsächlich anders als Funktionen, weil die Verwaltung der Einsprungaddressen und die Speicherverwaltung anders ist als bei Funktionen.

Im „Hausgebrauch“ sieht man diese Unterschiede jedoch nicht, daher ist es für eben diesen „Hausgebrauch“ auch egal, ob man nun Methoden von Funktionen unterscheidet oder nicht.

Wenn man aber OOP lernt, sollte man -rein schon aus didaktischen Gründen, wie mein Lehrer immer zu sagen pflegte- Methoden und Funktionen unterscheiden. Außer einem tieferen, vielleicht etwas präziserem Verständnis der OOP-Konzepte hat es praktisch meist allerdings keinen Vorteil.

Grüße,
Jochen

Wichtiger Unterschied!
Ahoihoi,

es gibt einer ganz wichtigen Unterschied zwischen Funktionen und Methoden. Funktionen sind seiteneffektfrei. Wenn eine Funktion mehrmals aufgerufen wird, liefert sie immer das gleiche Ergebnis. Methoden können den Zustand des Objektes ändern und können sich somit bei mehrmaligen Aufrufen mit gleichen Parametern unterschiedlich verhalten.

Methoden sind also eher eine Zusammenfassung von Prozeduren und Funktionen von Objekten. Wenn man im eigentlichen Sinne von Objektorientierung spricht, kommunizieren die Objekte ja, indem sie sich Nachrichten zusenden. Und das sind gerade Methodenaufrufe. Und deshalb sind es auch nur Methoden, wenn sie an Objekte (oder bei statischen an Objektklassen) gebunden sind, da es sonst kein Nachrichtenaustausch zwischen Objekten wäre.

Hoffe zur allgemeinen Verwirrung beigetragen zu haben,

Ralph

Huhu,

Hoffe zur allgemeinen Verwirrung beigetragen zu haben,

das kann ich toppen:

es gibt einer ganz wichtigen Unterschied zwischen Funktionen
und Methoden. Funktionen sind seiteneffektfrei. Wenn eine
Funktion mehrmals aufgerufen wird, liefert sie immer das
gleiche Ergebnis. Methoden können den Zustand des Objektes
ändern und können sich somit bei mehrmaligen Aufrufen mit
gleichen Parametern unterschiedlich verhalten.

Nein, weil: Du kannst auch in Funktionen den Zustand von Objekten ändern!! Direkt geht das, wenn Objekte nicht sauber gekapselt sind, also einen nicht-kontrollierten Zugriff auf die Felder erlauben. Indirekt geht das, wenn innerhalb einer Funktion Methoden von Objekten aufgerufen werden.

Ok, ok, das ist alles keine gute Programmierpraxis, aber trotzdem. Und daher muß ich deine Aussage einschränken:

Funktionen sind seiteneffektfrei, sofern sauber programmiert wurde.

Grüße,
Jochen

Huhu,

Hoffe zur allgemeinen Verwirrung beigetragen zu haben,

das kann ich toppen:

Ich liebe es, wenn jemand nur einfach seinen Senf dazugeben will und damit die Leute verwirrt. Konzeptionell sind alle Funktionen seiteneffektfrei. Dass in den meisten Programmiersprachen ein Seiteneffekt (Änderung einer globalen Variable, Aufruf von Prozeduren, …) möglich ist, weil die Leute Funktionen und Prozeduren mit out-Parametern in einen Pott schmeissen u.ä. heisst nicht, dass es nicht so sein sollte. Genauso könntest du behaupten, dass man keine Konstanten braucht, weil man überall auch Werte einsezten kann oder keine lokalen Variablen weil man ja auch globale nehmen kann. Nur weil die meisten Programmiersprachen dies erlauben, heisst das noch lange nicht, dass das auch was mit vernünftigen Programmieren zu tun hat.

Ralph

P.S. Du sagst, Funktionen können Seiteneffekte haben? Wie ist das denn beim Lambda-Kalkül, bei Haskell oder bei LISP?

Hiho

P.S. Du sagst, Funktionen können Seiteneffekte haben? Wie ist
das denn beim Lambda-Kalkül, bei Haskell oder bei LISP?

Oh my god! Ich dachte, ich würde Haskell oder Lisp nie wieder antreffen… Hier ist wohl ein eifriger Informatik-Student zu Gange?

Wie dem auch sei… Wegen Funktionen und Methoden eine Flame zu starten… lol.

lg, J.P.Jarolim
„program long and prosper.“

Ich liebe es, wenn jemand nur einfach seinen Senf dazugeben
will und damit die Leute verwirrt.

Ja, ich hab dich auch lieb… :wink:

Gruß,
Jochen

Thanks @ all…
Hai, liebste Antwortende,

dann werd’ ich mal versuchen, rauszukriegen, ob ich nun Funktionen oder Methoden schreibe…

Wobei ich schon anmerken muß, daß einige Erklärungen für jemanden, der die OOP-spezifischen Fachbegriffe nicht von der Pike auf gelernt, schon etwas metaphysisch klingen…vor allem, wenn man was von sekteneffektfrei liest :wink:
„…und so mögen dann die Götter, genannt Objekte, miteinander kommunizieren, ohne der dunkle Seite der Funktionen zu verfallen, doch mit Hilfe der niederen Geister der Prozeduren…“ *Ommmm*

Gruß
Sibylle

Hallo,
so verkehrt ist Jo’s Antwort nicht. Sie zeigt nämlich, daß Deine Charakterisierung (die ich gut finde) im Prinzip semantisch ist und nicht pur syntaktisch. Erst durch Programmierparadigmen oder Einschränkungen der Programmiersprache kann man aus der puren Syntax eines Konstrukts darauf schließen, ob Seiteneffekte auftreten können oder nicht.

Gruss
Enno

Hi Sibylle,

da ich jetzt schon eine Weile bei WWW vor allem mitlese, will ich mal ein wenig Schreiben – und versuchen ein paar Antworten zu geben.

Ich habe auf Deine Frage jetzt schon mehrere Antworten gelesen, die alle irgendwie richtig waren – aber irgendwie schien mir doch das Gesamtbild ein wenig zu fehlen – vor allem, da das Programmieren – vor allem bei der Masse an verschiedenen Programmiersprachen und Paradigmen – doch recht unuebersichtlich geworden ist.

Also gehen wir mal zurueck zum strukturierten Programmieren (also ganz ohne Objekte). Damals gab es zwei Arten, bestimmte Funktionalitaeten so zu kapseln, dass man sie immer wieder verwenden kann: Prozeduren und Funktionen (beides Auspraegungen von „Unterprogrammen“). Wie einer der Poster richtig schrieb, war es (teilweise?) anfaenglich so gedacht, dass Funktionen eben nebeneffektfrei – d.h. man kann Funktionen so oft man will hintereinander aufrufen und sie haben immer das selbe Ergebnis und veraendern auch nichts am Gesamtprogrammzustand (z.B. globale Variablen) – sind. Diese Regel wurde aber recht schnell verwaessert. Die meisten Programmiersprachen die Funktionen haben, erlauben Nebeneffekte. Der kleinste Gemeinsame Nenner im Unterschied zwischen Funktionen und Prozeduren ist, dass Funktionen einen Rueckgabewert haben und Prozeduren keinen.

Anmerkung:
Die urspruengliche (?) Definition von „Funktion“ entspricht der mathematischen Funktion – aber diese Definition ist heute nur noch selten gueltig (in den real existierenden Programmiersprachen).

Aber selbst dieser minimale Unterschied (mit dem Rueckgabewert) wird von manchen Programmierstprachen unterwandert. Die beliebte Programmiersprache C kennt z.B. nur Funktionen. Dafuer koennen Funktionen in C auch keinen Rueckgabewert haben – was sie im Prinzip den Prozeduren gleichstellt. Im Prinzip hat man den Namen „Funktion“ einfach anders verwendet – allgemeiner. Dadurch kommt wohl auch einiges an Verwirrung rein.

Noch mehr Verwirrung gibt es durch das Aufkommen der Objektorientierung. Anfaenglich war die Objektorientierung ein ganz anderes Konzept. Man hatte „Nachrichten“ die man an Objekte gesandt hatte – bei Smalltalk ist das z.B. so. Man spricht in manchen Programmiersprachen auch von „Methoden“ fuer diese „Nachrichten“ (ganz am Anfang war der richtige Begriff aber m.W. schon Nachricht). Die C-Welt hat hier die Begrifflichkeiten wieder total verdorben. Bei der Entstehung von C++ musste man Funktionen, die es in C schon gab, und Methoden (Nachrichten) irgendwie vereinheitlichen. Also hat man Funktionen erschaffen, die den Nachrichten entsprechen – Methoden eben.

In C++ sind deshalb Funktionen und Methoden sehr aehnlich – um nicht zu sagen das selbe. Methoden haben nur die Spezialitaet, dass es sozusagen „objektorientierte Funktionen“ sind. D.h. sie gehoeren zu einer Klasse. Beim Aufruf einer solchen Funktion wird (ausser bei statischen Methoden) der Objektkontext mitgegeben.

Also: In C++ verschwimmt alles. Es gibt nur Funktionen. Manche Funktionen entsprechen Prozeduren (die dem klassischen Funktionssinn widersprechen) und manche Funktionen sind Methoden – also objektorientierte „Nachrichten“.

Deshalb wahrscheinlich auch die Sprachverwirrung, wenn man als Anfaenger mit Programmierern spricht – oder manche Buecher liest. Man kann schon ganzschoen durcheinander kommen …

Du kannst gerne noch nachfragen, wenn noch Fragen offen geblieben sind.

Viele Gruesse,

/juergen

Hai, Juergen,

ich danke Dir für den Versuch, Übersicht ins Chaos zu bringen…
Zusammengefasst würde ich das so ausdrücken: strenge Definition und starre Regeln behagen dem Menschen als solchem nicht und wenn Programme selbst schon so widerlich logisch sind, dann muß man doch wenigstens rundrum ein wenig Durcheinander unterbringen…

Gruß
Sibylle

Hai, Sibylle,

Zusammengefasst würde ich das so ausdrücken: strenge
Definition und starre Regeln behagen dem Menschen als solchem
nicht und wenn Programme selbst schon so widerlich logisch
sind, dann muß man doch wenigstens rundrum ein wenig
Durcheinander unterbringen…

kuerzer und treffender kann man es kaum ausdruecken!

Viele Gruesse,

/juergen