Gibt es einen Begriff dafür: func1 (func2 (), func3 ());


24

Ich weiß, obj.func1().func2()das nennt man Methodenverkettung, aber was ist der Fachbegriff für:

func1(func2(), func3());

Wobei die Rückgabe einer Funktion als Argument für eine andere verwendet wird.


8
obj.func1().func2() is called method chaining- Korrektur: Es heißt ein Zugunglück.
Yam Marcovic

Das klingt sehr, sehr, sehr schwierig, es sei denn, Sie sind sich absolut sicher, dass obj.func1()immer ein Objekt zurückgegeben wird, das func2()eine Member-Funktion hat.
Shadur

8
@Yam Care zu erklären? Es wird unter anderem für flüssige Schnittstellen mit großem Gewinn eingesetzt. Beziehen Sie sich auf das Gesetz von Demeter? In diesem Fall wird das obige Muster nicht verboten, und selbst in Fällen, in denen dies der Fall ist, gibt es einen guten Fall gegen die LoD.
Konrad Rudolph

1
Die Methodenverkettung liegt mit syntaktischem Zucker auf einem Regal, und es ist nicht nötig, darüber Aufhebens zu machen.
Kos

1
@ PauliØsterø Ich dachte, dafür ist Stacktracing gedacht.
Chris C

Antworten:


38

Ich denke nicht, dass es Funktionsaufbau ist. Funktionszusammensetzung bedeutet, zwei oder mehr Funktionen zu übernehmen und in eine neue Funktion f . g . humzuwandeln , wie in Haskell. Beachten Sie, dass an dieser Stelle keine Funktion aufgerufen wird.

Persönlich würde ich Konstrukte wie func1(func2(), func3())"verschachtelte Funktionsaufrufe" bezeichnen.


+1, es wird in allen Programmierzusammenhängen, die ich gesehen habe, als "verschachtelte Funktionsaufrufe" bezeichnet.
Izkata

1
+1, diese "Funktionszusammensetzung" zu nennen, ist täuschend falsch.
Gian

+1. Alles, f(g())was Sie tun, ist das Aufrufen f()mit einem Ausdruck für das erste Argument. Der Funktionsaufruf g()qualifiziert sich also als Ausdruck. Aber wenn es einen Namen dafür geben muss, ist dieser so nah wie möglich.
Blrfl

16

In der Mathematik heißt es Funktionszusammensetzung . Ich glaube nicht, dass ich den Begriff für das Programmieren gehört habe. Dies kann daran liegen, dass die Verwendung aus einigen Gründen weitgehend vermieden wird. Es kann seltsame Fehler verursachen, wenn die Funktionen Nebenwirkungen haben, da es den Compilern freigestellt ist, func3 vor func2 auszuwerten. Es ist schwieriger zu debuggen, da Sie keine Haltepunkte setzen oder Zwischenergebnisse ausdrucken können und die meisten Leute es einfach schwerer finden zu lesen.


4
Auch in der funktionalen Programmierung nennt man das Komposition.
Chuck

8
Ich denke nicht, dass es "weitgehend vermieden" wird. IMO ist es nicht ungewöhnlich, Code zu schreiben, printf("%d %d\n", strlen(a), strlen(b));anstatt Zwischenvariablen zu verwenden.
User281377

3
Ich denke, die Lösung für die seltsamen Fehler, wenn die Funktionen Nebenwirkungen haben, besteht nicht darin, dies zu vermeiden, sondern Funktionen zu schreiben, die Werte erzeugen und Nebenwirkungen haben. In Bezug auf die Debugger sollte die Lösung darin bestehen, nach einem besseren Debugger zu fragen, der Sie nicht zwingt, Ihren Code zu ändern, damit der Debugger funktioniert.
R. Martinho Fernandes

7
Ob der Compiler func3 vor func2 auswerten kann, hängt ganz von der verwendeten Sprache ab. In Java ist beispielsweise die Auswertungsreihenfolge genau festgelegt. Ich würde tatsächlich vermuten, dass dies für die meisten Sprachen der Fall ist.
Michael Borgwardt

2
Der Begriff "Funktionszusammensetzung" in der Mathematik bezieht sich eigentlich nur auf Funktionen mit einem Argument und bezieht sich auf eine Struktur der Form func1(func2(func3(x))). Oder technisch bezieht er sich auf die Funktionen selbst: wenn g(x) = f1(f2(f3(x))), dann g( nicht g(x) ) ist die Zusammensetzung f1, f2und f3. Während ich eine Art und Weise sehen konnte, wie man die Struktur in der Frage "Funktionskomposition" nennen könnte, erscheint sie mir im mathematischen Sinne als eine sehr ungewöhnliche Verwendung des Begriffs.
David Z

2

Wie @ Karl Bielefeldt zeigt, heißt es in Mathe Funktionskomposition.

Es gibt KEINE Fachbezeichnung für diese Sache in der Programmierung. Und ich denke, das ist eine gute Sache, denn es zeigt an, dass die Operation normal und orthogonal ist .

Orthogonalität in Programmiersprachen bedeutet, dass Sie eine Anweisung / Operation unabhängig vom Kontext verwenden können . Zum Beispiel können Sie eine Funktion / Methode auf alle folgenden Arten aufrufen, und sie würde sich genauso verhalten ...

f1()(f2(), f3());

x = y + f4();

if ( f5() && !f6() ) doSomething();

f7() = f8() + f9(); // in C++ when a function returns a reference

x = f10() ? f11(f12(f13(x))) : f14();

Sie können mehr über Orthogonalität in der Programmierung auf Wikipedia lesen , und es gibt eine Frage zu StackOverflow dazu.


Es zeigt keine Orthogonalität an, sondern hängt davon ab.
Raffael

+1 du übergibst gerade Werte, es gibt keine Magie in der Aufforderung des OP
vemv

1

Ich bin wirklich nicht so gut mit Begriffen, aber ich habe gerade vor ein paar Tagen einen Artikel gelesen, der sich auf den Begriff Funktionen höherer Ordnung bezog , und hier ist eine Zusammenfassung der Definition gemäß Wikipedia:

http://en.wikipedia.org/wiki/Higher-order_function

In Mathematik und Informatik sind Funktionen höherer Ordnung, funktionale Formen oder funktionale Funktionen, die mindestens eine der folgenden Funktionen ausführen:

  • Nehmen Sie eine oder mehrere Funktionen als Eingabe
  • Funktion ausgeben

Alle anderen Funktionen sind Funktionen erster Ordnung. Funktionen höherer Ordnung werden in der Mathematik auch als Operatoren oder Funktionale bezeichnet. Die Ableitung in der Analysis ist ein gängiges Beispiel, da sie eine Funktion einer anderen Funktion zuordnet.

Da dieses Szenario in diesem Fall mindestens eine Funktion als Eingabe / Parameter übernimmt, wird es meiner Meinung nach als Funktion höherer Ordnung betrachtet.


1
Nein, der Aufruf einer Funktion höherer Ordnung würde so aussehen func1(func2, func3). Beachten Sie die fehlende Klammer.
Fredoverflow

das macht Sinn Fred. Eine ist die Adresse einer Funktion und die andere das Ergebnis der Ausführung dieser Funktion. Vielen Dank für den Hinweis.
silverCORE
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.