Ringkasan Eksaggitif (TM)
Anda mendapatkan beberapa hal.
- Warisan dan kloning prototipe
- Penambahan dinamis properti baru
- Keberadaan bersama dari berbagai versi (tingkat spesifikasi) yang berbeda dari kelas yang sama.
- Objek milik versi yang lebih baru (tingkat spesifikasi) akan memiliki sifat "opsional" tambahan.
- Introspeksi properti, lama dan baru
- Introspeksi aturan validasi (dibahas di bawah)
Ada satu kelemahan fatal.
- Compiler tidak memeriksa string yang salah eja untuk Anda.
- Alat refactoring otomatis tidak akan mengganti nama nama kunci properti untuk Anda - kecuali jika Anda membayar yang mewah.
Masalahnya, Anda bisa mendapatkan introspeksi dengan menggunakan, um, introspeksi. Inilah yang biasanya terjadi:
- Aktifkan refleksi.
- Tambahkan perpustakaan introspeksi besar ke dalam proyek Anda.
- Tandai berbagai metode dan properti objek dengan atribut atau anotasi.
- Biarkan perpustakaan introspeksi melakukan keajaiban.
Dengan kata lain, jika Anda tidak perlu berinteraksi dengan FP, Anda tidak harus mengikuti saran Rich Hickey.
Terakhir, tetapi tidak sedikit (atau paling cantik), meskipun menggunakan String
sebagai kunci properti masuk akal, Anda tidak harus menggunakan String
s. Banyak sistem lama, termasuk Android ™, menggunakan ID integer secara ekstensif melalui seluruh kerangka kerja untuk merujuk ke kelas, properti, sumber daya, dll.
Android adalah merek dagang dari Google Inc.
Anda juga bisa membuat kedua dunia bahagia.
Untuk dunia Jawa, terapkan getter dan setter seperti biasa.
Untuk dunia FP, terapkan
Object getPropertyByName(String name)
void setPropertyByName(String name, Object value) throws IllegalPropertyChangeException
List<String> getPropertyNames()
Class<?> getPropertyValueClass(String name)
Di dalam fungsi ini, ya, kode jelek, tetapi ada plugin IDE yang akan mengisinya untuk Anda, menggunakan ... eh, plugin pintar yang membaca kode Anda.
Sisi Jawa hal-hal akan sama seperti pemain seperti biasa. Mereka tidak akan pernah menggunakan bagian kode yang jelek itu . Anda bahkan mungkin ingin menyembunyikannya dari Javadoc.
Sisi FP dunia dapat menulis kode "leet" apa pun yang mereka inginkan, dan mereka biasanya tidak meneriaki Anda tentang kode yang lambat.
Secara umum, menggunakan peta (tas properti) di tempat objek adalah hal yang lumrah dalam pengembangan perangkat lunak. Ini tidak unik untuk pemrograman fungsional atau jenis bahasa tertentu. Ini mungkin bukan pendekatan idiomatis untuk bahasa tertentu, tetapi ada situasi yang mengharuskannya.
Secara khusus, serialisasi / deserialisasi sering membutuhkan teknik yang serupa.
Hanya beberapa pemikiran umum tentang "peta sebagai objek".
- Anda masih harus menyediakan fungsi untuk memvalidasi "peta sebagai objek". Perbedaannya adalah bahwa "peta sebagai objek" memungkinkan untuk kriteria validasi yang lebih fleksibel (kurang ketat).
- Anda dapat dengan mudah menambahkan bidang tambahan ke "peta sebagai objek".
- Untuk memberikan spesifikasi persyaratan minimum objek yang valid, Anda harus:
- Tuliskan set kunci "yang diperlukan minimal" yang diharapkan di peta
- Untuk setiap kunci yang nilainya perlu divalidasi, berikan fungsi validasi nilai
- Jika ada aturan validasi yang perlu memeriksa beberapa nilai kunci, berikan juga.
- Apa manfaatnya? Memberikan spesifikasi dengan cara ini introspektif: Anda dapat menulis sebuah program untuk menanyakan set kunci yang diperlukan minimal, dan untuk mendapatkan fungsi validasi untuk setiap kunci.
- Dalam OOP, semua ini digulung menjadi kotak hitam, atas nama "enkapsulasi". Di tempat logika validasi yang dapat dibaca mesin, pemanggil hanya dapat membaca "dokumentasi API" yang dapat dibaca manusia (jika untungnya ada).