Macam benda
Untuk keperluan diskusi kita, mari kita pisahkan objek kita menjadi tiga jenis:
Ini adalah objek yang selesai dikerjakan. Mereka memindahkan uang dari satu akun ke yang lain, memenuhi pesanan, dan semua tindakan lain yang kami harapkan dilakukan oleh perangkat lunak bisnis.
Objek logika domain biasanya tidak memerlukan aksesor (getter dan setter). Sebaliknya, Anda membuat objek dengan menyerahkan dependensi melalui konstruktor, dan kemudian memanipulasi objek melalui metode (katakan, jangan tanya).
Objek Transfer Data adalah keadaan murni; mereka tidak mengandung logika bisnis. Mereka akan selalu memiliki aksesor. Mereka mungkin atau mungkin tidak memiliki setter, tergantung pada apakah Anda sedang menulisnya atau tidak . Anda akan mengatur bidang Anda di konstruktor dan nilainya tidak akan berubah selama masa objek, atau pengakses Anda akan membaca / menulis. Dalam praktiknya, objek-objek ini biasanya bisa berubah, sehingga pengguna dapat mengeditnya.
Lihat Model objek berisi representasi data yang dapat ditampilkan / diedit. Mereka mungkin berisi logika bisnis, biasanya terbatas pada validasi data. Contoh objek Model Tampilan mungkin adalah InvoiceViewModel, berisi objek Pelanggan, objek Header Faktur, dan Item Baris Faktur. Lihat objek Model selalu mengandung accessors.
Jadi satu-satunya jenis objek yang akan "murni" dalam arti bahwa itu tidak mengandung accessors bidang akan menjadi objek Domain Logic. Membuat serial objek seperti itu menyimpan "keadaan komputasi" saat ini, sehingga ia dapat diambil nanti untuk menyelesaikan pemrosesan. Lihat Model dan DTO dapat dengan bebas diserialisasi, tetapi dalam praktiknya data mereka biasanya disimpan ke database.
Serialisasi, dependensi dan sambungan
Memang benar bahwa serialisasi menciptakan dependensi, dalam arti bahwa Anda harus deserialize ke objek yang kompatibel, itu tidak selalu berarti bahwa Anda harus mengubah konfigurasi serialisasi Anda. Mekanisme serialisasi yang baik adalah tujuan umum; mereka tidak peduli jika Anda mengubah nama properti atau anggota, asalkan masih dapat memetakan nilai kepada anggota. Dalam praktiknya, ini hanya berarti bahwa Anda harus membuat ulang serialisasi objek contoh untuk membuat representasi serialisasi (xml, json, apa pun) yang kompatibel dengan objek baru Anda; tidak perlu ada perubahan konfigurasi pada serializer.
Memang benar bahwa objek tidak harus peduli dengan bagaimana mereka serial. Anda telah menjelaskan satu cara masalah tersebut dapat dipisahkan dari kelas domain: refleksi. Tapi serializer harus peduli tentang bagaimana serialisasi dan deserializes objek; itu, bagaimanapun, adalah fungsinya. Cara Anda menjaga objek Anda dipisahkan dari proses serialisasi Anda adalah membuat serialisasi fungsi tujuan umum , mampu bekerja di semua jenis objek.
Salah satu hal yang membuat orang bingung adalah decoupling harus terjadi di kedua arah. Itu tidak; itu hanya harus bekerja dalam satu arah. Dalam praktiknya, Anda tidak akan pernah bisa lepas sepenuhnya; selalu ada beberapa kopling. Tujuan dari kopling longgar adalah untuk membuat pemeliharaan kode lebih mudah, bukan untuk menghapus semua dependensi.