czy istnieje na to termin: func1 (func2 (), func3 ());

24

Wiem, że obj.func1().func2()nazywa się to łączeniem metod, ale jaki jest termin techniczny na:

func1(func2(), func3());

Gdzie zwracanie funkcji jest używane jako argument do innego.

zhenka
źródło
8
obj.func1().func2() is called method chaining- Korekta: nazywa się to wrakiem pociągu.
Yam Marcovic,
Brzmi to bardzo, bardzo, bardzo podchwytliwie, chyba że masz absolutną pewność, że obj.func1()zawsze zwraca obiekt, który pełni func2()funkcję członka.
Shadur
8
@Yam Chcesz to wyjaśnić? Jest stosowany między innymi z dużym zyskiem w płynnych interfejsach. Czy masz na myśli Prawo Demeter? Jeśli tak, nie zabrania to powyższego wzoru, a nawet w przypadkach, w których tak się dzieje, istnieje dobry argument przeciwko LoD.
Konrad Rudolph
1
Metoda łączenia łańcuchów leży na jednej półce z cukrem syntaktycznym, bez potrzeby robienia z tego zamieszania.
Kos
1
@ PauliØsterø Myślałem, że do tego właśnie służy śledzenie stosu.
Chris C

Odpowiedzi:

38

Nie sądzę, żeby była to kompozycja funkcji. Kompozycja funkcji oznacza przejęcie dwóch lub więcej funkcji i przekształcenie ich w nową funkcję, jak f . g . hw Haskell. Zauważ, że w tym momencie nie jest wywoływana żadna funkcja.

Osobiście odnosiłbym się do konstrukcji takich func1(func2(), func3())jak „zagnieżdżone wywołania funkcji”.

fredoverflow
źródło
+1, nazywane jest „zagnieżdżonymi wywołaniami funkcji” we wszystkich kontekstach programowania, jakie widziałem.
Izkata,
1
+1, nazywanie tej „kompozycji funkcji” jest zwodniczo błędne.
Gian,
+1. Wystarczy f(g())zadzwonić f()z wyrażeniem pierwszego argumentu i tak się dzieje, że wywołanie funkcji g()kwalifikuje się jako wyrażenie. Ale jeśli musi być na to nazwa, jest tak blisko, jak to tylko możliwe.
Blrfl,
16

W matematyce nazywa się to składem funkcji . Wydaje mi się jednak, że nie słyszałem o tym znaczeniu w programowaniu. Może to wynikać z tego, że korzystanie jest w dużej mierze unikane z kilku powodów. Może wprowadzać dziwne błędy, gdy funkcje mają skutki uboczne, ponieważ kompilatory mają swobodę oceny func3 przed func2. Trudniej jest debugować, ponieważ nie można ustawić punktów przerwania ani wydrukować wyników pośrednich, a większości osób po prostu trudniej jest odczytać.

Karl Bielefeldt
źródło
4
Nazywa się to także kompozycją w programowaniu funkcjonalnym.
Chuck,
8
Nie sądzę, że „w dużej mierze można tego uniknąć”. IMO nierzadko pisze kod jak printf("%d %d\n", strlen(a), strlen(b));zamiast używać zmiennych pośrednich.
user281377,
3
Myślę, że rozwiązaniem dziwnych błędów, gdy funkcje wywołują skutki uboczne, jest nie unikanie tego, ale unikanie pisania funkcji generujących wartości i wywołujących skutki uboczne. Podobnie w przypadku debuggerów rozwiązaniem powinno być poproszenie o lepszy debugger, który nie zmusza cię do zmiany kodu, aby debugger działał.
R. Martinho Fernandes,
7
To, czy kompilator może swobodnie oceniać func3 przed func2, zależy całkowicie od używanego języka. Na przykład w Javie kolejność oceny jest ściśle określona. Podejrzewam, że tak jest w przypadku większości języków.
Michael Borgwardt,
2
Termin „skład funkcji” w matematyce faktycznie dotyczy tylko funkcji jednoparierowych, gdzie odnosi się do struktury postaci func1(func2(func3(x))). Lub technicznie, to odnosi się do funkcji sobie pytanie: jeśli g(x) = f1(f2(f3(x))), to g( nie g(x) ) jest skład f1, f2oraz f3. Chociaż widziałem sposób, w jaki można nazwać strukturę w pytaniu „kompozycja funkcji”, uderza mnie to bardzo nietypowe użycie tego terminu, w sensie matematycznym.
David Z
2

Jak wskazuje @Karl Bielefeldt, w Math nazywa się to składaniem funkcji.

W programowaniu nie ma ŻADNEGO terminu technicznego. I myślę, że jest to dobra rzecz, ponieważ wskazuje, że operacja jest normalna i ortogonalna .

Ortogonalność w językach programowania oznacza, że ​​możesz używać instrukcji / operacji niezależnie od jej kontekstu . Na przykład możesz wywołać funkcję / metodę na wszystkie poniższe sposoby i zachowa się tak samo ...

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();

Możesz przeczytać więcej na temat Ortogonalności w Programowaniu na Wikipedii , a na tej stronie jest pytanie dotyczące StackOverflow .

treecoder
źródło
Nie oznacza to ortogonalności, ale w zależności od tego.
Raffael,
+1, po prostu przekazujesz wartości, w wezwaniu PO nie ma magii
vemv,
1

Naprawdę nie jestem zbyt dobry w terminach, ale kilka dni temu właśnie przeczytałem artykuł, który odwoływał się do terminu Funkcje wyższego rzędu , a oto streszczenie definicji z Wikipedii:

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

W matematyce i informatyce funkcje wyższego rzędu, formy funkcjonalne lub funkcjonale to funkcje, które wykonują co najmniej jedną z następujących czynności:

  • weź jedną lub więcej funkcji jako dane wejściowe
  • wyprowadza funkcję

Wszystkie pozostałe funkcje są funkcjami pierwszego rzędu. W matematyce funkcje wyższego rzędu są również znane jako operatory lub funkcjonały. Pochodna w rachunku różniczkowym jest częstym przykładem, ponieważ odwzorowuje funkcję na inną funkcję.

więc w tym przypadku, ponieważ ten scenariusz przyjmuje co najmniej jedną funkcję jako parametr wejściowy / parametr, uważam, że będzie to funkcja wyższego rzędu.

silverCORE
źródło
1
Nie, mogłoby wyglądać wywołanie funkcji wyższego rzędu func1(func2, func3). Zwróć uwagę na nieobecny nawias.
fredoverflow
to ma sens Fred. jeden jest adresem funkcji, a drugi wynikiem wykonania tej funkcji. Dzięki za zwrócenie na to uwagi.
silverCORE,