apakah ada istilah untuk melakukan ini: func1 (func2 (), func3 ());

24

Saya tahu itu obj.func1().func2()disebut metode chaining, tetapi apa istilah teknis untuk:

func1(func2(), func3());

Di mana pengembalian fungsi digunakan sebagai argumen ke yang lain.

zhenka
sumber
8
obj.func1().func2() is called method chaining- Koreksi: Ini disebut kecelakaan kereta.
Yam Marcovic
Kedengarannya sangat, sangat, sangat rumit kecuali Anda benar-benar yakin bahwa obj.func1()selalu mengembalikan objek yang memiliki func2()fungsi anggota.
Shadur
8
@Yam Care menjelaskan? Ini digunakan untuk keuntungan besar dalam antarmuka yang lancar, antara lain. Apakah Anda mengacu pada Hukum Demeter? Jika demikian, ini tidak melarang pola di atas, dan bahkan dalam kasus di mana ada, ada kasus yang baik terhadap LoD.
Konrad Rudolph
1
Metode chaining terletak di satu rak dengan gula sintaksis, tidak perlu repot-repot.
Kos
1
@ PauliØsterø Saya pikir itulah gunanya stack tracing.
Chris C

Jawaban:

38

Saya tidak berpikir itu komposisi fungsi. Komposisi fungsi berarti mengambil dua fungsi atau lebih dan mengubahnya menjadi fungsi baru, seperti f . g . hdi Haskell. Perhatikan bahwa tidak ada fungsi yang dipanggil saat ini.

Secara pribadi, saya akan merujuk ke konstruksi seperti func1(func2(), func3())sebagai "panggilan fungsi bersarang".

fredoverflow
sumber
+1, ini disebut sebagai "panggilan fungsi bersarang" di semua konteks pemrograman yang pernah saya lihat.
Izkata
1
+1, menyebut "komposisi fungsi" ini tampak salah.
Gian
+1. Semua f(g())lakukan adalah memanggil f()dengan ekspresi untuk argumen pertama, dan itu terjadi pemanggilan fungsi g()memenuhi syarat sebagai ekspresi. Tetapi jika harus ada nama untuk itu, ini sedekat yang didapat.
Blrfl
16

Dalam matematika, ini disebut komposisi fungsi . Saya pikir saya belum pernah mendengar istilah yang diterapkan pada pemrograman. Itu mungkin karena penggunaannya sebagian besar dihindari karena beberapa alasan. Itu dapat memperkenalkan bug aneh ketika fungsi memiliki efek samping, karena kompiler bebas untuk mengevaluasi func3 sebelum func2. Lebih sulit untuk di-debug karena Anda tidak dapat mengaktifkan breakpoints atau mencetak hasil-hasil antara, dan kebanyakan orang merasa kesulitan untuk membaca.

Karl Bielefeldt
sumber
4
Ini disebut komposisi dalam pemrograman fungsional juga.
Chuck
8
Saya tidak berpikir itu "sebagian besar dihindari". IMO itu tidak biasa untuk menulis kode seperti printf("%d %d\n", strlen(a), strlen(b));daripada menggunakan variabel perantara.
user281377
3
Saya pikir solusi untuk bug aneh ketika fungsi memiliki efek samping bukan untuk menghindari ini, tetapi untuk menghindari menulis fungsi yang menghasilkan nilai dan memiliki efek samping. Demikian pula, mengenai para debugger, solusinya harus meminta debugger yang lebih baik, yang tidak memaksa Anda untuk mengubah kode Anda agar debugger berfungsi.
R. Martinho Fernandes
7
Apakah kompiler bebas untuk mengevaluasi func3 sebelum func2 sepenuhnya tergantung pada bahasa yang digunakan. Di Jawa, misalnya, urutan evaluasi ditentukan secara ketat. Saya sebenarnya menduga bahwa ini adalah kasus untuk sebagian besar bahasa.
Michael Borgwardt
2
Istilah "komposisi fungsi" dalam matematika sebenarnya hanya berlaku untuk fungsi argumen tunggal, di mana ia merujuk pada struktur bentuk func1(func2(func3(x))). Atau teknis, mengacu pada fungsi sendiri: jika g(x) = f1(f2(f3(x))), maka g( tidak g(x) ) adalah komposisi f1, f2dan f3. Sementara saya bisa melihat cara di mana Anda bisa menyebut struktur dalam pertanyaan "komposisi fungsi," itu menurut saya penggunaan istilah yang sangat tidak biasa, dalam pengertian matematika.
David Z
2

Seperti @Karl Bielefeldt tunjukkan, itu disebut komposisi fungsi dalam Matematika.

Tidak ada istilah teknis untuk pemrograman ini. Dan saya pikir ini adalah hal yang baik, karena itu menunjukkan bahwa operasi itu normal dan orthogonal .

Orthogonality dalam bahasa pemrograman berarti bahwa Anda dapat menggunakan instruksi / operasi yang terlepas dari konteksnya . Misalnya, Anda dapat memanggil fungsi / metode dalam semua cara berikut, dan itu akan berperilaku sama ...

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

Anda dapat membaca lebih lanjut tentang Orthogonality dalam Pemrograman di Wikipedia , dan ada pertanyaan tentang StackOverflow tentang ini.

treecoder
sumber
Itu tidak menunjukkan ortogonalitas tetapi tergantung pada itu.
Raffael
+1 Anda hanya melewati nilai, tidak ada keajaiban dalam panggilan OP
vemv
1

Saya benar-benar tidak begitu mahir dengan istilah-istilah, tetapi saya baru saja membaca sebuah artikel beberapa hari yang lalu yang merujuk pada istilah fungsi-fungsi Tingkat Tinggi , dan inilah abstrak definisi per Wikipedia:

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

Dalam matematika dan ilmu komputer, fungsi tingkat tinggi, bentuk fungsional, atau fungsional adalah fungsi yang melakukan setidaknya satu dari yang berikut:

  • mengambil satu atau lebih fungsi sebagai input
  • menghasilkan suatu fungsi

Semua fungsi lainnya adalah fungsi urutan pertama. Dalam matematika fungsi tingkat tinggi juga dikenal sebagai operator atau fungsional. Turunan dalam kalkulus adalah contoh umum, karena memetakan suatu fungsi ke fungsi lain.

jadi dalam kasus ini, karena skenario itu memang mengambil setidaknya satu fungsi sebagai input / param, itu akan dianggap sebagai fungsi urutan yang lebih tinggi, saya percaya.

silverCORE
sumber
1
Tidak, memanggil fungsi urutan yang lebih tinggi akan terlihat seperti func1(func2, func3). Perhatikan tanda kurung yang tidak ada.
fredoverflow
itu masuk akal Fred. yang satu adalah alamat suatu fungsi, dan yang lainnya adalah hasil dari menjalankan fungsi itu. Terima kasih telah menunjukkannya.
silverCORE