Saya melihat manfaat membuat objek dalam program saya tidak berubah. Ketika saya benar-benar berpikir mendalam tentang desain yang baik untuk aplikasi saya, saya sering secara alami tiba di banyak objek saya menjadi tidak berubah. Sering sampai pada titik di mana saya ingin semua benda saya berubah.
Pertanyaan ini berkaitan dengan ide yang sama tetapi tidak ada jawaban yang menunjukkan apa pendekatan yang baik untuk ketetapan dan kapan benar-benar menggunakannya. Apakah ada beberapa pola desain yang tidak berubah? Gagasan umum tampaknya adalah "membuat objek tidak berubah kecuali Anda benar-benar membutuhkannya untuk berubah" yang tidak berguna dalam praktiknya.
Pengalaman saya adalah bahwa ketidakmampuan mendorong kode saya semakin banyak ke paradigma fungsional dan perkembangan ini selalu terjadi:
- Saya mulai membutuhkan struktur data yang persisten (dalam arti fungsional) seperti daftar, peta, dll.
- Sangat tidak nyaman untuk bekerja dengan referensi silang (mis. Simpul pohon mereferensikan anak-anaknya sementara anak-anak mereferensikan orang tua mereka) yang membuat saya tidak menggunakan referensi silang sama sekali, yang sekali lagi membuat struktur data dan kode saya lebih fungsional.
- Warisan berhenti masuk akal dan saya mulai menggunakan komposisi sebagai gantinya.
- Seluruh ide dasar OOP seperti enkapsulasi mulai berantakan dan objek saya mulai terlihat seperti fungsi.
Pada titik ini saya praktis tidak menggunakan apa pun dari paradigma OOP lagi dan hanya bisa beralih ke bahasa yang murni fungsional. Jadi pertanyaan saya: apakah ada pendekatan yang konsisten untuk desain OOP abadi yang baik atau apakah selalu jika Anda mengambil ide abadi ke potensi maksimalnya, Anda selalu berakhir pemrograman dalam bahasa fungsional yang tidak memerlukan apa pun dari dunia OOP lagi? Adakah pedoman yang baik untuk memutuskan kelas mana yang harus tidak berubah dan mana yang harus tetap bisa berubah untuk memastikan bahwa OOP tidak berantakan?
Hanya untuk kenyamanan, saya akan memberikan contoh. Mari kita memiliki ChessBoard
koleksi bidak catur abadi (memperluas kelas abstrak)Piece
). Dari sudut pandang OOP, sepotong bertanggung jawab untuk menghasilkan gerakan yang valid dari posisinya di papan tulis. Tetapi untuk menghasilkan gerakan potongan membutuhkan referensi ke papannya sementara papan harus memiliki referensi ke potongan-potongannya. Nah, ada beberapa trik untuk membuat referensi silang yang tidak dapat diubah ini tergantung pada bahasa OOP Anda tetapi mereka sulit untuk dikelola, lebih baik tidak memiliki bagian untuk referensi papannya. Tapi kemudian potongan itu tidak dapat menghasilkan gerakannya karena ia tidak tahu keadaan papan. Kemudian potongan menjadi hanya struktur data yang memegang jenis potongan dan posisinya. Anda kemudian dapat menggunakan fungsi polimorfik untuk menghasilkan gerakan untuk semua jenis karya. Ini sangat mungkin dicapai dalam pemrograman fungsional tetapi hampir mustahil di OOP tanpa pemeriksaan jenis runtime dan praktik OOP buruk lainnya ... Lalu,