Saya ingin mulai mengutak-atik ClojureScript, tetapi saya bingung tentang beberapa poin. Masalah saya adalah apa cara yang baik untuk menghadapi perubahan status yang berasal dari interaksi pengguna, ketika Anda mencoba untuk bekerja secara fungsional.
Biarkan saya memberi beberapa contoh. Saya ada dalam pikiran aplikasi yang berjalan di browser, tapi saya pikir masalahnya lebih umum. Tentu saja sesuatu akan berubah - setidaknya DOM. Tapi saya ingin mencari tahu bagaimana mengatur sisa kode untuk bekerja dengan struktur data yang tidak berubah.
1) Katakan saya ingin melampirkan beberapa acara ke beberapa objek DOM. Ini tidak sulit dilakukan dengan cara yang sebagian besar fungsional: ketika Anda membuat node, Anda melampirkannya peta hash dengan berbagai event handler. Tetapi pertimbangkan kasus di mana Anda menggunakan delegasi acara. Kemudian ketika Anda membuat simpul baru, Anda dapat melampirkan pengendali acara ke beberapa simpul induk yang mungkin sudah ada. Jadi, Anda harus mengubah hash yang terkait dengan simpul yang sudah ada.
2) Katakanlah saya sedang merancang modul autocomplete untuk bidang input. Setiap kali pengguna menekan tombol, saya bisa melakukan panggilan ke server untuk mendapatkan saran. Ini mudah. Tapi sekarang anggaplah saya ingin mengoptimalkannya sedikit. Jika saya tahu semua hasil yang cocok foo
tidak ada gunanya bertanya lagi untuk semua hasil yang cocok foobar
; Saya bisa menyaring yang pertama. Jadi saya perlu membuat semacam cache. Tembolok ini akan diperbarui setiap kali pengguna memasukkan kata baru yang bukan superset dari kata yang dimasukkan sebelumnya. Lagi: bagaimana cara memodelkan cache? Cara yang paling masuk akal tampaknya peta hash pemetaan kata-kata untuk hasil, tetapi harus bisa berubah.
Bisakah Anda menyarankan beberapa pola yang akan membuatnya lebih mudah untuk memasukkan perubahan karena interaksi pengguna ke dalam desain fungsional?
sumber
Jawaban:
Seperti yang disebutkan dalam komentar Anda harus mencari "Pemrograman Fungsional Reaktif" dan Anda juga harus membaca beberapa posting di http://prog21.dadgum.com/archives.html . Lebih khusus lagi Anda mungkin harus membaca " Jangan Jatuh Cinta dengan Teknologi Anda ", " Tulis Kode Seperti Baru Anda Pelajari Cara Memprogram ", " Pemrograman Fungsional Tidak Bekerja (dan apa yang harus dilakukan tentang hal itu) ", dan mungkin beberapa yang lain.
Menghindari mutabilitas dan efek samping secara praktis tidak mungkin dilakukan. Bahkan programmer Haskell sesekali akan menggunakan
unsafePerformIO
untuk keluar dari paradigma yang diketik secara fungsional, bebas efek samping, statis untuk melakukan hal-hal tertentu. Jika Anda memulai proyek ini sebagai latihan akademis murni, silakan saja dan hindarkan kemungkinan berubah-ubah dan efek samping tetapi jika Anda mencoba membangun produk yang dapat digunakan pada tenggat waktu maka tidak ada pola yang akan menyelamatkan Anda.sumber