Pola UI dalam bahasa fungsional

11

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 footidak 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?

Andrea
sumber
4
Cari "Pemrograman Reaktif Fungsional".
dan_waterworth
Ini bukan hal yang sama, tetapi dengan templat XSLT (efek samping) yang cocok dengan acara DOM yang diprakarsai oleh pengguna, kami menghadapi masalah serupa di Saxon-CE. Cara saya suka melihatnya adalah bahwa pengguna memicu perubahan status, bukan XSLT jadi itu jenis Ok. Kuncinya adalah memastikan kode yang mengelola interaksi pengguna dan perubahan selanjutnya dalam keadaan sangat terpisah dari yang lain.
pgfearo
@pgfearo Apakah Anda punya saran bagaimana mengatur kode sehingga interaksi pengguna tetap terpisah dari yang lain?
Andrea
Tidak ada cara yang baik untuk menangani perubahan status saat Anda bekerja secara fungsional, karena pemrograman fungsional tidak memiliki kewarganegaraan.
Old Pro
3
@ Tua Pro: Ini tidak sepenuhnya benar. Saat dalam pemrograman fungsional Anda mendefinisikan komputasi menggunakan aplikasi fungsi alih-alih efek samping, akhirnya Anda harus menyimpan hasil perhitungan di suatu tempat. Fokus FP adalah membatasi penggunaan negara ke minimum sedangkan dalam pemrograman imperatif mengubah negara secara bertahap (dengan efek samping) adalah alat dasar untuk mendefinisikan perhitungan.
Giorgio

Jawaban:

3

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 unsafePerformIOuntuk 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.

davidk01
sumber