Objek yang Tidak Berubah vs Koleksi yang Tidak Berubah
Salah satu poin penting dalam debat tentang objek yang dapat berubah dan tidak berubah adalah kemungkinan memperluas konsep keabadian ke koleksi. Objek yang tidak dapat diubah adalah objek yang sering mewakili struktur logis data tunggal (misalnya string yang tidak dapat diubah). Ketika Anda memiliki referensi ke objek abadi, konten objek tidak akan berubah.
Koleksi abadi adalah koleksi yang tidak pernah berubah.
Ketika saya melakukan operasi pada koleksi yang bisa diubah, maka saya mengubah koleksi di tempat, dan semua entitas yang memiliki referensi ke koleksi akan melihat perubahan.
Ketika saya melakukan operasi pada koleksi yang tidak dapat diubah, referensi dikembalikan ke koleksi baru yang mencerminkan perubahan. Semua entitas yang memiliki referensi ke versi koleksi sebelumnya tidak akan melihat perubahan.
Implementasi yang cerdik tidak perlu menyalin (mengkloning) seluruh koleksi untuk memberikan keabadian itu. Contoh paling sederhana adalah stack diimplementasikan sebagai daftar yang terhubung secara tunggal dan operasi push / pop. Anda dapat menggunakan kembali semua node dari koleksi sebelumnya di koleksi baru, menambahkan hanya satu node untuk push, dan kloning tidak ada node untuk pop. Operasi push_tail pada daftar yang terhubung sendiri, di sisi lain, tidak begitu sederhana atau efisien.
Variabel / referensi tidak berubah vs dapat diubah
Beberapa bahasa fungsional mengambil konsep immutability ke objek referensi sendiri, hanya memungkinkan penugasan referensi tunggal.
- Di Erlang ini berlaku untuk semua "variabel". Saya hanya bisa menetapkan objek ke referensi satu kali. Jika saya mengoperasikan koleksi, saya tidak akan dapat menetapkan kembali koleksi baru ke referensi lama (nama variabel).
- Scala juga membangun ini ke dalam bahasa dengan semua referensi dideklarasikan dengan var atau val , vals hanya menjadi penugasan tunggal dan mempromosikan gaya fungsional, tetapi vars memungkinkan struktur program yang lebih mirip C atau mirip Java.
- Deklarasi var / val diperlukan, sementara banyak bahasa tradisional menggunakan pengubah opsional seperti final di java dan const di C.
Kemudahan Pengembangan vs. Kinerja
Hampir selalu alasan untuk menggunakan objek yang tidak dapat diubah adalah untuk mempromosikan pemrograman bebas efek samping dan alasan sederhana tentang kode (terutama dalam lingkungan paralel / sangat bersamaan). Anda tidak perlu khawatir tentang data dasar yang diubah oleh entitas lain jika objek tidak berubah.
Kelemahan utama adalah kinerja. Berikut ini adalah tulisan pada tes sederhana yang saya lakukan di Jawa membandingkan beberapa objek yang tidak berubah vs bisa berubah dalam masalah mainan.
Masalah kinerja diperdebatkan di banyak aplikasi, tetapi tidak semua, itulah sebabnya banyak paket numerik besar, seperti kelas Numpy Array di Python, memungkinkan pembaruan In-Place dari array besar. Ini akan menjadi penting untuk area aplikasi yang memanfaatkan operasi matriks dan vektor yang besar. Masalah paralel-data dan intensif komputasi yang besar ini mencapai kecepatan tinggi dengan beroperasi di tempat.
string
tidak berubah, setidaknya dalam. NET, dan saya pikir dalam banyak bahasa modern lainnya juga.