Ketidaktahuan persistensi biasanya didefinisikan sebagai kemampuan untuk bertahan & mengambil objek .NET standar (atau POCO jika Anda benar-benar bersikeras untuk memberinya nama). Dan definisi objek .NET standar yang tampaknya diterima dengan baik adalah :
"...kelas biasa di mana Anda fokus pada masalah bisnis yang ada tanpa menambahkan hal-hal karena alasan terkait infrastruktur..."
Namun, saya melihat orang menggambarkan NHibernate sebagai kerangka kerja yang memungkinkan ketidaktahuan persistensi, namun ini adalah kerangka kerja yang tidak dapat bekerja pada objek .NET standar apa pun, hanya objek .NET standar yang mematuhi persyaratan desain tertentu, misalnya (sumber):
- Semua kelas harus memiliki konstruktor default
- Beberapa fitur tidak berfungsi kecuali kelas dibuka segelnya dan semua anggotanya virtual
- Identitas objek tidak berfungsi dengan baik kecuali Anda menyalahgunakan Equals/GetHashCode
(Selain itu: Sebelum ada yang marah, saya tidak bermaksud memilih NHibernate di sini, ini hanya contoh kerangka kerja yang sering dikutip yang konon mengizinkan ketidaktahuan persistensi. Saya yakin argumen serupa dapat diterapkan pada ORM lain yang mengklaim hal yang sama.)
Sekarang meskipun kelas itu sendiri tidak memiliki atribut khusus kerangka kerja persistensi atau kelas dasar, dll., bagi saya kelas ini sebenarnya bukan "ketidaktahuan persistensi" karena kelas tersebut harus mengikuti serangkaian pedoman desain untuk memfasilitasi digunakan oleh kerangka persistensi yang dipilih. Anda harus merancang dan mengimplementasikan kelas dengan mempertimbangkan persyaratan kerangka persistensi; jika Anda tidak mengetahuinya, kelas mungkin tidak akan mengerjakannya.
Masalah yang saya hadapi dengan definisi "ketidaktahuan kegigihan"/"POCO" adalah saya tidak melihat bagaimana, secara konseptual, ini benar-benar berbeda dengan menambahkan atribut seperti [Serializable]
atau [DataContract]
atau [XmlType]
atau kerangka kegigihan lainnya - anotasi spesifik yang memfasilitasi persistensi dan pengambilan entitas menggunakan kerangka kerja tersebut.
Jadi, apa sebenarnya "ketidaktahuan yang terus-menerus" itu?
Jelas definisinya sebagai kemampuan untuk mempertahankan "kelas biasa" adalah sebuah kekeliruan karena kelas NHibernate hanya biasa sejauh tidak mereferensikan kelas khusus kerangka kerja, padahal kelas tersebut luar biasa karena memerlukan pilihan desain yang tidak biasa seperti konstruktor default dan semuanya. -anggota virtual dan implementasi Equals/GetHashCode pada tipe yang bisa berubah.
Oleh karena itu, apakah masuk akal untuk mengatakan bahwa "ketidaktahuan persistensi" benar ketika objek memfasilitasi penggunaan kerangka persistensi (baik dalam desain dan struktur atau dengan menggunakan anotasi khusus kerangka kerja) tetapi tidak menjalankan logika persistensi itu sendiri?