Pandangan Bertolak tentang Kekekalan
TL / DR: Ketidakmampuan lebih merupakan tren mode daripada kebutuhan dalam JavaScript. Jika Anda menggunakan Bereaksi itu memang memberikan pekerjaan yang rapi untuk beberapa pilihan desain yang membingungkan dalam manajemen negara. Namun dalam kebanyakan situasi lain, ia tidak akan menambah nilai lebih dari kerumitan yang diperkenalkannya, melayani lebih banyak untuk menopang resume daripada memenuhi kebutuhan klien yang sebenarnya.
Jawaban panjang: baca di bawah.
Mengapa imutabilitas sangat penting (atau dibutuhkan) dalam javascript?
Baiklah, saya senang Anda bertanya!
Beberapa waktu yang lalu seorang pria yang sangat berbakat bernama Dan Abramov menulis perpustakaan manajemen negara javascript yang disebut Redux yang menggunakan fungsi murni dan imutabilitas. Dia juga membuat beberapa video yang sangat keren yang membuat idenya sangat mudah dimengerti (dan dijual).
Waktunya sempurna. Kebaruan Angular memudar, dan dunia JavaScript siap untuk terpaku pada hal-hal terbaru yang memiliki tingkat keren yang tepat, dan perpustakaan ini tidak hanya inovatif tetapi ditempatkan dengan sempurna dengan React yang sedang dijajakan oleh pembangkit tenaga listrik Silicon Valley lainnya .
Sedih mungkin, mode memerintah di dunia JavaScript. Sekarang Abramov dipuji sebagai manusia setengah dewa dan kita semua manusia belaka harus tunduk pada Dao Kekekalan ... Apakah itu masuk akal atau tidak.
Apa yang salah dalam bermutasi objek?
Tidak ada!
Sebenarnya programmer telah bermutasi objek untuk er ... selama ada objek untuk bermutasi. Dengan kata lain, 50+ tahun pengembangan aplikasi.
Dan mengapa menyulitkan? Ketika Anda memiliki objek cat
dan mati, apakah Anda benar-benar membutuhkan sedetik cat
untuk melacak perubahan? Kebanyakan orang hanya akan mengatakan cat.isDead = true
dan selesai dengan itu.
Bukankah (bermutasi objek) membuat hal-hal sederhana?
IYA! .. Tentu saja!
Khususnya dalam JavaScript, yang dalam praktiknya paling berguna digunakan untuk menampilkan tampilan beberapa negara yang dikelola di tempat lain (seperti dalam database).
Bagaimana jika saya memiliki objek Berita baru yang harus diperbarui? ... Bagaimana saya mencapainya dalam kasus ini? Hapus toko & buat ulang itu? Bukankah menambahkan objek ke array operasi yang lebih murah?
Nah, Anda bisa pergi dengan pendekatan tradisional dan memperbarui News
objek, sehingga representasi dalam memori Anda dari objek itu berubah (dan tampilan yang ditampilkan kepada pengguna, atau jadi orang akan berharap) ...
Atau sebagai alternatif ...
Anda dapat mencoba pendekatan FP / Ketidakmampuan yang seksi dan menambahkan perubahan Anda ke News
objek ke array yang melacak setiap perubahan historis sehingga Anda dapat mengulangi melalui array dan mencari tahu apa yang seharusnya representasi negara yang benar (Fiuh!).
Saya mencoba mempelajari apa yang ada di sini. Tolong lakukan pencerahan saya :)
Mode datang dan pergi sobat. Ada banyak cara untuk menguliti kucing.
Saya menyesal Anda harus menanggung kebingungan dari serangkaian paradigma pemrograman yang terus berubah. Tapi hei, SELAMAT DATANG DI KLUB !!
Sekarang beberapa poin penting yang perlu diingat sehubungan dengan Kekekalan, dan Anda akan mendapatkan ini dilemparkan kepada Anda dengan intensitas demam yang hanya bisa dihabiskan oleh kenaifan.
1) Kekekalan luar biasa untuk menghindari kondisi balapan di lingkungan multi-utas .
Lingkungan multi-utas (seperti C ++, Java dan C #) bersalah atas praktik mengunci objek ketika lebih dari satu utas ingin mengubahnya. Ini buruk untuk kinerja, tetapi lebih baik daripada alternatif korupsi data. Namun tidak sebagus membuat semuanya abadi (Tuhan memuji Haskell!).
TAPI ALAS! Dalam JavaScript Anda selalu beroperasi pada satu utas . Bahkan pekerja web (masing-masing berjalan dalam konteks yang terpisah ). Jadi karena Anda tidak dapat memiliki kondisi ras terkait thread di dalam konteks eksekusi Anda (semua variabel global dan penutupan yang bagus), poin utama yang mendukung Immutability keluar dari jendela.
(Karena itu, ada adalah keuntungan untuk menggunakan fungsi murni pada pekerja web, yang adalah bahwa Anda akan memiliki harapan tentang mengutak-atik benda-benda di thread utama.)
2) Ketidakmampuan dapat (entah bagaimana) menghindari kondisi balapan di negara bagian aplikasi Anda.
Dan inilah inti masalahnya, sebagian besar pengembang (React) akan memberi tahu Anda bahwa Immutability dan FP dapat mengerjakan keajaiban ini yang memungkinkan keadaan aplikasi Anda dapat diprediksi.
Tentu saja ini tidak berarti bahwa Anda dapat menghindari kondisi balapan dalam basis data , untuk menarik yang satu dari itu Anda harus mengoordinasikan semua pengguna di semua browser , dan untuk itu Anda akan memerlukan teknologi push back-end seperti WebSockets ( lebih lanjut tentang ini di bawah ini) yang akan menyiarkan perubahan kepada semua orang yang menjalankan aplikasi.
Juga tidak berarti bahwa ada beberapa masalah inheren dalam JavaScript di mana status aplikasi Anda memerlukan ketetapan agar dapat diprediksi, pengembang mana pun yang telah mengkode aplikasi front-end sebelum Bereaksi akan memberi tahu Anda hal ini.
Klaim yang agak membingungkan ini hanya berarti bahwa dengan Bereaksi status aplikasi Anda akan menjadi lebih rentan terhadap kondisi balapan , tetapi ketidakberdayaan memungkinkan Anda untuk menghilangkan rasa sakit itu. Mengapa? Karena React adalah khusus .. telah dirancang sebagai perpustakaan rendering yang sangat dioptimalkan dengan manajemen keadaan yang koheren menempati posisi kedua, dan dengan demikian status komponen dikelola melalui rangkaian peristiwa yang tidak sinkron (alias "pengikatan data satu arah") yang tidak dapat Anda kendalikan lebih dan andalkan Anda ingat untuk tidak bermutasi secara langsung ...
Dengan konteks ini, mudah untuk melihat bagaimana kebutuhan untuk ketidakberdayaan tidak ada hubungannya dengan JavaScript dan banyak hubungannya dengan kondisi balapan di Bereaksi: jika memiliki banyak perubahan yang saling bergantung dalam aplikasi Anda dan tidak ada cara mudah untuk mengetahui apa keadaan Anda saat ini, Anda akan bingung , dan dengan demikian masuk akal untuk menggunakan keabadian untuk melacak setiap perubahan historis .
3) Kondisi lomba sangat buruk.
Yah, mereka mungkin jika Anda menggunakan Bereaksi. Tetapi mereka jarang terjadi jika Anda mengambil kerangka kerja yang berbeda.
Selain itu, Anda biasanya memiliki masalah yang jauh lebih besar untuk dihadapi ... Masalah seperti neraka ketergantungan. Seperti basis kode yang membengkak. Seperti CSS Anda tidak dimuat. Seperti proses pembangunan yang lambat atau terjebak pada back-end monolitik yang membuat iterasi hampir tidak mungkin. Seperti para dev yang tidak berpengalaman, tidak mengerti apa yang sedang terjadi dan mengacaukan banyak hal.
Kamu tahu. Realitas. Tapi hei, siapa yang peduli tentang itu?
4) Ketidakmampuan memanfaatkan Jenis Referensi untuk mengurangi dampak kinerja pelacakan setiap perubahan negara.
Karena serius, jika Anda akan menyalin hal-hal setiap kali keadaan Anda berubah, lebih baik Anda memastikan Anda pintar tentang hal itu.
5) Kekekalan memungkinkan Anda untuk melakukan hal-hal yang TIDAK .
Karena er .. ini adalah fitur nomor satu yang manajer proyek Anda akan minta, kan?
6) Keadaan tidak berubah memiliki banyak potensi keren dalam kombinasi dengan WebSockets
Last but not least, akumulasi delta negara membuat kasus yang cukup menarik dalam kombinasi dengan WebSockets, yang memungkinkan untuk konsumsi yang mudah dari negara sebagai aliran peristiwa abadi ...
Begitu uang jatuh pada konsep ini (negara menjadi aliran peristiwa - daripada set rekaman kasar mewakili pandangan terbaru), dunia abadi menjadi tempat ajaib untuk dihuni. Sebuah tanah event-bersumber heran dan kemungkinan bahwa melampaui waktu itu sendiri . Dan bila dilakukan dengan benar ini pasti dapat membuat real-time aplikasi easi er untuk mencapai, Anda hanya menyiarkan aliran acara untuk semua orang tertarik sehingga mereka dapat membangun representasi mereka sendiri dari sekarang dan menulis kembali perubahan mereka sendiri ke dalam aliran komunal.
Tetapi pada titik tertentu Anda bangun dan menyadari bahwa semua keajaiban dan keajaiban itu tidak datang secara gratis. Tidak seperti kolega Anda yang bersemangat, pemangku kepentingan Anda (ya, orang-orang yang membayar Anda) tidak terlalu peduli dengan filsafat atau mode dan banyak tentang uang yang mereka bayarkan untuk membangun produk yang dapat mereka jual. Dan intinya adalah bahwa lebih sulit untuk menulis kode abadi dan lebih mudah untuk memecahkannya, ditambah ada sedikit gunanya memiliki front-end abadi jika Anda tidak memiliki back-end untuk mendukungnya. Ketika (dan jika!) Anda akhirnya meyakinkan pemangku kepentingan Anda bahwa Anda harus mempublikasikan dan mengonsumsi acara melalui teknologi push seperti WebSockets, Anda akan tahu betapa sulitnya mengukur dalam produksi .
Sekarang untuk beberapa saran, sebaiknya Anda memilih untuk menerimanya.
Pilihan untuk menulis JavaScript menggunakan FP / Immutability juga merupakan pilihan untuk membuat basis kode aplikasi Anda lebih besar, lebih kompleks dan lebih sulit untuk dikelola. Saya akan sangat berpendapat untuk membatasi pendekatan ini untuk reduksi Redux Anda, kecuali jika Anda tahu apa yang Anda lakukan ... Dan JIKA Anda akan terus maju dan menggunakan immutability terlepas, maka terapkan keadaan tidak berubah ke seluruh tumpukan aplikasi Anda , dan bukan hanya sisi klien, karena Anda kehilangan nilai sebenarnya dari sebaliknya.
Sekarang, jika Anda cukup beruntung untuk dapat membuat pilihan dalam pekerjaan Anda, maka cobalah dan gunakan kebijaksanaan Anda (atau tidak) dan lakukan apa yang benar oleh orang yang membayar Anda . Anda dapat mendasarkan ini pada pengalaman Anda, pada usus Anda, atau apa yang terjadi di sekitar Anda (diakui jika semua orang menggunakan React / Redux maka ada argumen yang valid bahwa akan lebih mudah untuk menemukan sumber daya untuk melanjutkan pekerjaan Anda) .. Atau, Anda dapat mencoba baik Resume Driven Development atau Hype Driven Development . Mereka mungkin lebih seperti Anda.
Singkatnya, hal yang bisa dikatakan tentang kekekalan adalah bahwa hal itu akan membuat Anda modis dengan teman-teman Anda, setidaknya sampai kegilaan berikutnya muncul, pada titik mana Anda akan senang untuk melanjutkan.
Sekarang setelah sesi terapi diri ini saya ingin menunjukkan bahwa saya telah menambahkan ini sebagai artikel di blog saya => Kekekalan dalam JavaScript: A Contrarian View . Jangan ragu untuk menjawab di sana jika Anda memiliki perasaan yang kuat, Anda ingin melepaskan diri juga;).