Komposisi Fungsi di JavaScript

Komposisi fungsi adalah penerapan tepat dari satu fungsi ke hasil yang lain. Pengembang melakukannya secara manual setiap hari saat sarang berfungsi:

compose = (fn1, fn2) => value => fn2(fn1(value))

Tapi ini sulit dibaca. Ada cara yang lebih baik dengan menggunakan komposisi fungsi. Alih-alih membacanya dari dalam ke luar:

add2AndSquare = (n) => square(add2(n))

Kita bisa menggunakan fungsi orde tinggi untuk merantai mereka secara berurutan.

add2AndSquare = compose( add2, square)

Implementasi sederhana dari penulisan adalah:

compose = (f1, f2) => value => f2( f1(value) );

Untuk mendapatkan lebih banyak fleksibilitas, kita dapat menggunakan fungsi reduceRight:

compose = (...fns) => (initialVal) => fns.reduceRight((val, fn) => fn(val), initialVal);

Membaca tulis dari kiri ke kanan memungkinkan rangkaian yang jelas dari fungsi urutan yang lebih tinggi. Contoh dunia nyata menambahkan otentikasi, logging dan properti konteks. Ini adalah teknik yang memungkinkan penggunaan kembali pada level tertinggi. Berikut beberapa contoh cara menggunakannya:

// example const add2 = (n) => n + 2; const times2 = (n) => n * 2; const times2add2 = compose(add2, times2); const add6 = compose(add2, add2, add2); times2add2(2); // 6 add2tiems2(2); // 8 add6(2); // 8

Anda mungkin mengira ini adalah pemrograman fungsional tingkat lanjut dan tidak relevan untuk pemrograman frontend. Tapi itu juga berguna dalam Aplikasi Halaman Tunggal. Misalnya Anda dapat menambahkan perilaku ke komponen React dengan menggunakan komponen orde tinggi:

function logProps(InputComponent) { InputComponent.prototype.componentWillReceiveProps = function(nextProps) { console.log('Current props: ', this.props); console.log('Next props: ', nextProps); }; return InputComponent; } // EnhancedComponent will log whenever props are received const EnhancedComponent = logProps(InputComponent);

Kesimpulannya, komposisi fungsi memungkinkan fungsionalitas dapat digunakan kembali pada tingkat yang sangat tinggi. Jika fungsi terstruktur dengan baik, ini memungkinkan pengembang untuk menciptakan perilaku baru berdasarkan perilaku yang ada.

Ini juga meningkatkan keterbacaan implementasi. Alih-alih fungsi bertingkat, Anda dapat dengan jelas merangkai fungsi dan membuat fungsi urutan yang lebih tinggi dengan nama yang bermakna.