Fungsi Murni dalam JavaScript dan Cara Membuatnya
Table of content:
Fungsi murni adalah fungsi yang tidak menghasilkan efek samping dan, ketika dipanggil dengan parameter masukan yang sama, akan selalu menghasilkan keluaran yang sama.
Anda dapat menggunakan fungsi murni untuk memastikan kode Anda bersih, dapat dipelihara, dan dapat diuji. Fungsi-fungsi ini ideal untuk tugas-tugas ini karena dapat diprediksi dan tidak mengubah keadaan eksternal.
Mereka juga lebih mudah di-debug, membuatnya membantu dalam mengembangkan sistem perangkat lunak yang kompleks. Di sini Anda akan menjelajahi fungsi murni dalam JavaScript, karakteristiknya, dan kelebihannya.
Karakteristik Fungsi Murni
Agar suatu fungsi menjadi “murni”, ia harus memenuhi beberapa persyaratan.
Nilai Pengembalian Konstan
Fungsi murni harus selalu mengembalikan nilai yang sama dengan input yang sama, terlepas dari berapa kali fungsi itu dipanggil.
Sebagai contoh, perhatikan fungsi di bawah ini:
function multiply(a, b) {
return a * b;
}
Itu berkembang biak fungsi dalam contoh di atas akan selalu mengembalikan produk dari dua argumennya. Diberikan set argumen yang sama, ia memiliki nilai pengembalian konstan.
Memanggil fungsi ini beberapa kali dengan argumen yang sama akan menghasilkan keluaran yang sama setiap waktu. Misalnya:
multiply(2, 3);
multiply(2, 3);
multiply(2, 3);
Atau, pertimbangkan contoh di bawah ini:
function multiplyRandomNumber(num) {
return num * Math.floor(Math.random() * 10);
}multiplyRandomNumber(5);
multiplyRandomNumber(5);
multiplyRandomNumber(5);
Itu perkalianBilanganAcak fungsi di atas akan mengembalikan hasil yang berbeda setiap kali Anda memanggilnya, menjadikannya tidak murni. Hasil dari fungsi ini tidak dapat diprediksi, sehingga sulit untuk menguji komponen yang mengandalkannya.
Tanpa Efek Samping
Fungsi murni tidak boleh menghasilkan efek samping apa pun. Efek samping mengacu pada setiap modifikasi status atau perilaku di luar cakupan fungsi, seperti memodifikasi variabel global, keluaran konsol, permintaan jaringan, atau manipulasi DOM.
Ketika fungsi murni memiliki efek samping, itu tidak lagi murni karena mempengaruhi keadaan eksternal dan melanggar prinsip tidak memiliki efek samping yang dapat diamati. Oleh karena itu, fungsi murni menghindari efek samping untuk memastikan bahwa mereka tidak mengubah status program.
Sebagai contoh, perhatikan contoh di bawah ini:
let count = 0;function increment() {
count++;
console.log(count);
}
increment();
increment();
increment();
Itu kenaikan fungsi dalam contoh ini memiliki efek samping memodifikasi menghitung variabel di luar ruang lingkupnya. Itu juga masuk ke konsol.
Fungsi ini tidak murni karena memiliki efek samping, yang dapat mempersulit prediksi output dan pengujiannya secara terpisah. Untuk membuatnya murni, Anda dapat memodifikasinya untuk menerima menghitung variabel sebagai argumen dan mengembalikan nilai yang bertambah tanpa mengubah keadaan eksternal apa pun.
Seperti itu:
function increment(count) {
return count + 1;
}increment(1);
increment(1);
increment(1);
Versi dari kenaikan fungsi dalam contoh di atas tidak memiliki efek samping karena tidak mengubah variabel eksternal apa pun atau mencatat nilai apa pun. Selain itu, tidak peduli berapa kali Anda memanggilnya, ia mengembalikan nilai yang sama untuk input yang sama. Oleh karena itu, ini adalah fungsi murni.
Karakteristik lain
Selain memiliki nilai pengembalian konstan dan tidak menghasilkan efek samping apa pun, Anda harus mematuhi aturan berikut saat membuat fungsi JavaScript yang Anda inginkan murni:
- Fungsi Anda tidak boleh mengubah argumennya. Alih-alih, jika ada operasi yang memerlukan mutasi, buat salinan argumen dan mutasi salinannya.
- Fungsi Anda harus selalu memiliki nilai balik. Jika fungsi Anda tidak memiliki nilai pengembalian atau efek samping apa pun, fungsi tersebut tidak dapat melakukan apa pun!
- Fungsi Anda tidak boleh bergantung pada keadaan eksternal apa pun.
Keuntungan dari Fungsi Murni
Fungsi murni memiliki manfaat tertentu dibandingkan fungsi tidak murni, beberapa di antaranya adalah sebagai berikut.
Testabilitas
Fungsi murni mudah untuk diuji karena perilaku input/outputnya terdefinisi dengan baik. Juga, fungsi murni tidak bergantung pada keadaan eksternal atau efek samping. Oleh karena itu, Anda dapat mengujinya secara terpisah tanpa mengkhawatirkan ketergantungan atau interaksi apa pun dengan bagian lain dari program.
Sebaliknya, menguji fungsi tidak murni yang bergantung pada keadaan eksternal atau menghasilkan efek samping bisa lebih menantang karena perilakunya mungkin bergantung pada keadaan program atau faktor eksternal lainnya. Hal ini dapat mempersulit pembuatan kasus pengujian yang komprehensif dan memastikan bahwa fungsi berperilaku dengan benar di semua skenario.
Memoisasi
Karena fungsi murni selalu menghasilkan keluaran yang sama untuk masukan yang sama dan tidak menghasilkan efek samping, Anda dapat dengan mudah memoisasinya.
Dengan mengandalkan properti ini dan menggunakan memoisasi, Anda dapat meng-cache hasil panggilan fungsi murni untuk input tertentu. Fungsi Anda kemudian dapat mengembalikan hasil yang di-cache saat dipanggil lagi dengan input yang sama.
Memoisasi fungsi murni dapat meningkatkan performa program, terutama untuk komputasi mahal yang berulang kali menangani input yang sama, tanpa mengkhawatirkan gangguan pada status program.
Sebaliknya, fungsi yang tidak murni dapat menghasilkan hasil yang berbeda untuk input yang sama, bergantung pada status program atau faktor eksternal. Ini membuat mereka sulit untuk memoisasi karena hasil yang di-cache mungkin tidak lagi valid jika dependensi fungsi atau status eksternal berubah di antara panggilan.
Konkurensi
Karena fungsi murni tidak mengubah keadaan eksternal apa pun atau menghasilkan efek samping apa pun, fungsi tersebut aman untuk thread. Anda dapat menjalankannya secara bersamaan tanpa mengkhawatirkan kondisi balapan atau masalah sinkronisasi.
Sebaliknya, fungsi yang tidak murni dapat menjadi tantangan untuk dieksekusi secara bersamaan karena dapat mengganggu satu sama lain atau menghasilkan perilaku yang tidak diharapkan saat dijalankan secara paralel. Misalnya, jika dua utas mengakses dan memodifikasi variabel global yang sama, mereka dapat saling menimpa perubahan atau menghasilkan hasil yang tidak konsisten.
Fungsi Murni vs. Fungsi Tidak Murni
Anda dapat menulis program menggunakan kombinasi fungsi murni dan tidak murni, karena setiap jenis memiliki kegunaannya sendiri.
Fungsi murni mudah untuk dioptimalkan, diuji, dan diparalelkan, menjadikannya cocok untuk kasus penggunaan seperti pemrograman fungsional, caching, pengujian, pemrograman paralel, dan tugas pemrosesan data.
Namun, fungsi yang tidak murni menimbulkan tantangan dalam pengujian dan konkurensi tetapi sangat membantu saat bekerja dengan struktur data yang dapat diubah atau berinteraksi dengan sistem dan sumber daya eksternal.