Apa manfaat utama dari memiliki model POCO murni? Saya mendapatkan bahwa Model harus bersih dan sederhana, tetapi saya cenderung suka menjaga pemeliharaan objek anak di dalam kelas model. Sebagai contoh jika saya memiliki ClassA
dan ClassB
mendefinisikan sebagai berikut:
public class ClassA
{
public string MyProp { get; set; }
public IEnumerable<ClassB> Children { get; }
public void AddChild(ClassB newChild) { /*... */ }
public void RemoveChild(ClassB child) { /* ... */ }
}
public class ClassB
{
public string SomeProp { get; set; }
}
Apakah ada sesuatu yang salah dengan memiliki metode add and remove? Haruskah saya hanya membuka daftar dan memperbolehkan kode klien untuk menambahkan apa pun yang melewati tanggung jawab validasi data sederhana seperti tidak nol, dan tidak menduplikasi ke kelas lain?
Setiap bantuan sangat dihargai. Terima kasih.
AddChild(ClassB newChild) => Children.Add(newChild ?? new NullClassB())
Jawaban:
Dua pertanyaan Anda tidak berhubungan.
POCO murni tidak tergantung pada beberapa kerangka kerja, konvensi, [] thingy, atau terkait erat dengan beberapa objek yang sama-sama bergantung. Dengan kata lain, dunia dapat benar-benar berubah di sekitar POCO dan terus melakukan apa yang dilakukannya tanpa peduli. Anda tidak dapat merusaknya dengan memperbarui kerangka kerja, dengan memindahkannya ke sistem baru, atau melihatnya lucu. Itu terus bekerja. Satu-satunya dependensi adalah hal-hal yang diminta secara eksplisit.
POCO tidak lebih dari ide POJO. J diubah menjadi C karena orang-orang melihat Anda lucu ketika Anda menjelaskan konsep yang memiliki Java dalam namanya jika orang-orang tersebut menggunakan C #. Idenya tidak tergantung pada bahasa. Mereka bisa saja menyebutnya Benda Tua Biasa. Tetapi siapa yang ingin membual tentang penggunaan POO?
Saya akan membiarkan Fowler menjelaskan asal-usulnya:
Adapun pertanyaan Anda yang lain:
Saya tidak suka
A
langsung tahu tentangB
. Tapi itu hal DIP bukan hal POJO .sumber
B
untuk kesederhanaan, Idealnya keduanya akan mengimplementasikan antarmuka. TetapiA
masih memiliki daftarIInterfaceB
. Apakah ada yang salah denganAddChild
metode ini jika anak-anak longgar digabungkan melalui referensi antarmuka?Dengan Tambah dan Hapus Anda menerapkan
Collection<T>
fitur. Tanyakan kepada diri sendiri mengapa Anda menggunakanIEnumerable<T>
alih-alihList<T>
atau kelas yang bisa berubah-ubah lainnya? Ternyata bukan karena koleksi Anda harus dibaca saja.Satu-satunya alasan yang dapat saya pikirkan adalah Anda ingin mengontrol metode akses apa yang ingin Anda terbitkan. Dalam hal itu akan lebih baik untuk membuat kelas koleksi Anda sendiri, merangkum daftar, menerapkan metode pilih Anda Tambah dan Hapus dan terapkan
IEnumerable<T>
. Kemudian gunakan itu bukanIEnumerable<T>
untuk jenis koleksi anak-anak Anda.Tapi menurut saya
List<ClassB>
mungkin hanya akan melayani Anda dengan baik.sumber
Apa yang
AddChild
ditambahkan, danRemoveChild
dihapus dari? Jika itu dari database (atau toko kegigihan dalam bentuk apa pun), Anda semacam mendapat Rekaman Aktif. Tidak selalu selalu merupakan hal yang buruk, tetapi pasti membuat Anda hampir harus khawatir tentang kerangka kerja, konvensi, dependensi, dll, seperti yang disebutkan @CandiedOrange.Pada saat yang sama, apa gunanya menghindari ketergantungan dari ClassA ke ClassB (atau setidaknya InterfaceB) jika mereka semua ada dalam aplikasi yang sama? Dalam domain dunia nyata yang dimodelkan oleh aplikasi Anda, banyak hal bergantung satu sama lain. Objek dunia nyata memang memiliki koleksi benda lain yang "milik" mereka. Sepenuhnya tepat untuk mewakili hubungan-hubungan itu dalam kode Anda.
Satu-satunya alasan bahkan menjadi sedikit rumit adalah karena Anda memiliki kebutuhan untuk mengelola dengan tepat bagaimana ClassB menjadi terkait dengan dan terlepas dari ClassA. Jadi, Anda memiliki sedikit perilaku untuk diterapkan. Anda dapat mengimplementasikannya di dalam kelas (yang benar-benar "legal"; lihat /programming//a/725365/44586 ), atau Anda dapat memiliki semacam kelas terpisah yang berisi perilaku itu. Lakukan apa yang paling masuk akal untuk keadaan pribadi Anda.
Bagaimanapun, POJO / POCO benar-benar hanya OOP sebagaimana seharusnya, tanpa hiasan dan tidak terbebani. Ikuti prinsip OOP dan Anda akan aman.
sumber