Apa fungsi murni dalam JavaScript?

Fungsi murni adalah blok bangunan dalam pemrograman fungsional. Mereka dipuja karena kesederhanaan dan kemudahan ujian.

Dalam artikel ini, Anda akan menemukan daftar periksa yang akan membantu menentukan apakah suatu fungsi murni atau tidak.

gambar

Periksa daftar


Suatu fungsi harus memenuhi dua kondisi agar dianggap “murni”:

- Setiap kali fungsi mengembalikan hasil yang sama ketika dipanggil dengan set argumen yang sama

- tidak ada efek samping

Mari kita pertimbangkan lebih detail.

1. Input yang sama => Output yang sama


Bandingkan ini:

const add = (x, y) => x + y; add(2, 4); // 6 

Dengan ini:

 let x = 2; const add = (y) => { x += y; }; add(4); // x === 6 (the first time) 

Dalam kasus pertama, nilai dikembalikan berdasarkan parameter yang ditentukan, terlepas dari di mana / kapan Anda menyebutnya.

Jika Anda menambahkan 2 dan 4, Anda selalu mendapatkan 6.

Tidak ada yang mempengaruhi hasilnya.

Fungsi tidak murni = hasil yang tidak konsisten

Contoh kedua tidak menghasilkan apa-apa. Dia mengandalkan kondisi umum untuk melakukan pekerjaannya dengan meningkatkan variabel di luar bidangnya.

Model ini adalah mimpi buruk bagi pengembang.

Keadaan bersama memperkenalkan ketergantungan waktu. Anda mendapatkan hasil yang berbeda tergantung pada saat Anda memanggil fungsi. Pertama kali hasilnya adalah 6, waktu berikutnya 10 dan seterusnya.

Mana yang lebih baik?

Dalam hal apa Anda akan mendapatkan lebih sedikit bug yang muncul hanya dalam kondisi tertentu?

Dalam hal apa Anda lebih mungkin berhasil dalam lingkungan multi-threaded di mana ketergantungan waktu dapat merusak sistem?

Jelas di yang pertama.

2. Tidak ada efek samping


gambar

Tes ini sendiri merupakan daftar periksa.

Contoh efek samping:

  1. Modifikasi parameter input
  2. console.log
  3. Panggilan HTTP (AJAX / ambil)
  4. Perubahan sistem file
  5. Permintaan DOM

Faktanya, setiap pekerjaan yang dilakukan oleh suatu fungsi tidak terkait dengan penghitungan hasil akhir.

Saya menyarankan Anda untuk menonton video Bob Martin.

Ini adalah fungsi "kotor" dengan efek samping.

 const impureDouble = (x) => { console.log('doubling', x); return x * 2; }; const result = impureDouble(4); console.log({ result }); 

console.log di sini adalah efek samping, tetapi tidak ada salahnya. Kami masih akan mendapatkan hasil yang sama, mengingat data yang sama.

Namun, ini bisa menimbulkan masalah.

"Tidak murni" objek berubah

 const impureAssoc = (key, value, object) => { object[key] = value; }; const person = { name: 'Bobo' }; const result = impureAssoc('shoeSize', 400, person); console.log({ person, result }); 

Variabel orang diubah selamanya karena fungsinya dinyatakan melalui pernyataan tugas.

Status bersama berarti bahwa dampak impureAssoc tidak lagi sepenuhnya terlihat. Memahami efek pada sistem sekarang termasuk melacak setiap variabel yang pernah disentuh dan mengetahui sejarahnya.

Status bersama = ketergantungan waktu.

Kami dapat menghapus impureAssoc dengan hanya mengembalikan objek baru dengan properti yang diinginkan.

"Kami membersihkannya"

 const pureAssoc = (key, value, object) => ({ ...object, [key]: value }); const person = { name: 'Bobo' }; const result = pureAssoc('shoeSize', 400, person); console.log({ person, result }); 

PureAssoc sekarang mengembalikan hasil tes, jadi Anda tidak perlu khawatir jika itu berubah di tempat lain.

Itu bisa dilakukan seperti ini:

 const pureAssoc = (key, value, object) => { const newObject = { ...object }; newObject[key] = value; return newObject; }; const person = { name: 'Bobo' }; const result = pureAssoc('shoeSize', 400, person); console.log({ person, result }); 

Mengubah input bisa berbahaya, tetapi mengubah salinan tidak menjadi masalah. Hasil akhirnya adalah fungsi yang dapat diuji dan dapat diprediksi yang berfungsi di mana pun dan kapan pun Anda menyebutnya.

Perubahan terbatas pada area kecil ini, dan Anda masih mengembalikan nilainya.

Ringkasan

  • Suatu fungsi murni jika tidak memiliki efek samping dan setiap kali mengembalikan hasil yang sama ketika dipanggil dengan serangkaian argumen yang sama.
  • Efek samping termasuk: mengubah input, panggilan HTTP, menulis ke disk, output ke layar.
  • Anda dapat mengkloning dengan aman dan kemudian mengubah parameter input. Biarkan saja yang asli tidak berubah.
  • Sintaks distribusi (... sintaks) adalah cara termudah untuk mengkloning objek dan array.

Source: https://habr.com/ru/post/id437512/


All Articles