Tanggung jawab tunggal (alasan untuk berubah) dari suatu entitas harus secara unik mengidentifikasi dirinya sendiri, dengan kata lain, tanggung jawabnya harus dapat ditemukan.
Buku DDD Eric Evan, hal. 93:
tanggung jawab paling mendasar dari Entitas adalah untuk membangun kesinambungan sehingga perilaku dapat menjadi jelas dan dapat diprediksi. Mereka melakukan yang terbaik jika disimpan. Daripada berfokus pada atribut atau bahkan perilaku, lepaskan definisi objek Entitas ke karakteristik yang paling intrinsik, terutama yang mengidentifikasi atau biasa digunakan untuk menemukan atau mencocokkannya. Tambahkan hanya perilaku yang penting untuk konsep dan atribut yang diperlukan oleh perilaku itu.
Di luar itu, terlihat untuk menghapus perilaku dan atribut ke objek lain yang terkait dengan Entitas inti. Selain masalah identitas, Entitas cenderung memenuhi tanggung jawab mereka dengan mengoordinasikan operasi objek yang mereka miliki.
1.
... lepaskan definisi objek ENTITY ke karakteristik paling intrinsik, terutama yang mengidentifikasinya atau yang biasa digunakan untuk menemukan atau mencocokkannya. Tambahkan hanya perilaku yang penting untuk konsep ...
Setelah suatu entitas diberi ID unik , identitasnya dibuat dan jadi saya akan berasumsi entitas seperti itu tidak memerlukan perilaku untuk mempertahankan identitasnya atau membantunya mengidentifikasi dirinya . Jadi, saya tidak mengerti perilaku seperti apa yang penulis maksudkan (selain finddan match operasi ) dengan " perilaku yang penting untuk konsep "?
2.
... lepaskan definisi objek ENTITY ke karakteristik paling intrinsik, terutama yang mengidentifikasinya atau yang biasa digunakan untuk menemukan atau mencocokkannya. ... Selain itu, lihat untuk menghapus perilaku dan atribut ke objek lain yang terkait dengan ENTITY inti.
Jadi setiap perilaku yang tidak membantu mengidentifikasi entitas, tetapi kami masih akan mencirikan perilaku itu sebagai karakteristik intrinsik dari entitas itu (yaitu menggonggong adalah intrinsik untuk anjing, terbang adalah intrinsik untuk pesawat terbang, bertelur adalah intrinsik untuk burung .. .), harus dimasukkan ke objek lain yang terkait dengan entitas itu (contoh: kita harus memasukkan perilaku menggonggong ke objek yang terkait dengan entitas anjing)?
3.
Di luar itu, lihat untuk menghapus perilaku dan atribut ke objek lain yang terkait dengan ENTITY inti.
a) MyEntitymendelegasikan tanggung jawab A_respdan B_respke objek adan b, masing-masing.
Meskipun sebagian besar A_respdan B_resppekerjaan dilakukan oleh adan bcontoh, klien masih dilayani A_respdan B_respmelalui MyEntity, yang berarti bahwa dari perspektif klien, dua tanggung jawab menjadi tanggung jawabnya MyEntity. Jadi, bukankah itu berarti MyEntityjuga memiliki A_respdan B_resptanggung jawab dan dengan demikian melanggar SRP ?
b) Bahkan jika kita menganggap itu A_respdan B_respbukan milik MyEntity, MyEntitymasih memiliki tanggung jawab AB_respuntuk mengoordinasi operasi objek adan b. Jadi tidak MyEntitymelanggar SRP karena setidaknya ia memiliki dua tanggung jawab - untuk mengidentifikasi dirinya secara unik dan juga AB_resp?
class MyEntity
{
private A a = ...
private B b = ...
public A GetA()
{ ... }
public B GetB()
{ ... }
/* coordinates operations of objects a and b */
public int AworkB()
{ ... }
}
/* A encapsulates a single responsibility resp_A*/
/* A is value object */
class A
{ ... }
/* B encapsulates a single responsibility resp_B*/
/* B is value object */
class B
{ ... }
MEMPERBARUI:
1.
Perilaku dalam konteks ini mengacu pada perilaku semantik. Misalnya, properti di kelas (yaitu atribut pada objek domain) yang digunakan untuk mengidentifikasi secara unik itu memiliki perilaku. Meskipun ini tidak direpresentasikan dalam kode secara langsung. Perilaku yang diharapkan adalah bahwa tidak akan ada nilai duplikat untuk properti itu.
Jadi dalam kode kita hampir tidak perlu benar-benar menerapkan perilaku (yaitu operasi) yang entah bagaimana akan mempertahankan identitas entitas, karena ketika Anda menjelaskan perilaku seperti itu hanya ada sebagai konsep dalam model domain (dalam bentuk atribut ID dari sebuah entitas), tetapi ketika kita menerjemahkan atribut ID ini ke dalam kode, bagian dari semantiknya hilang (yaitu bagian yang secara implisit memastikan nilai ID unik hilang)?
2.
Lebih jauh lagi, properti seperti Zaman tidak memiliki konteks di luar Entitas Orang, dan dengan demikian, tidak masuk akal untuk pindah ke objek yang berbeda ... Namun informasi tersebut dapat dengan mudah disimpan di lokasi terpisah yang merupakan pengidentifikasi unik, oleh karena itu referensi yang membingungkan untuk perilaku. Usia bisa menjadi nilai yang dimuat malas.
a) Jika Ageproperti malas dimuat, maka kita dapat menyebutnya perilaku, meskipun secara semantik Agehanya atribut?
3.
Anda dapat dengan mudah memiliki operasi khusus untuk Alamat seperti verifikasi bahwa itu adalah alamat yang valid. Anda mungkin tidak tahu itu pada waktu desain, tetapi seluruh konsep ini adalah untuk memecah benda menjadi bagian terkecil mereka
Sementara saya setuju bahwa kita akan kehilangan konteks dengan pindah Ageke objek yang berbeda, konteksnya tidak akan hilang jika kita memindahkan DateOfBirthproperti ke objek yang berbeda, tetapi kita biasanya tidak memindahkannya.
Apa alasan utama kami pindah Addresske objek lain, tetapi tidak DateOfBirth? Karena DateOfBirthlebih intrinsik ke Personentitas atau karena ada sedikit peluang di suatu tempat di masa depan kita mungkin perlu mendefinisikan operasi khusus untuk DateOfBirth?
4. Saya harus mengatakan saya masih tidak tahu apakah MyEntityjuga memiliki A_respdan B_resptanggung jawab dan mengapa MyEntityjuga AB_resptidak dianggap sebagai pelanggaran SRP
EULERFX
1)
Perilaku yang penulis maksudkan adalah perilaku yang terkait dengan entitas. Ini adalah perilaku yang mengubah keadaan entitas
a) Jika saya memahami Anda dengan benar, Anda mengatakan bahwa entitas seharusnya hanya berisi perilaku yang mengubah atributnya (yaitu keadaannya )?
b) Dan bagaimana dengan perilaku yang tidak perlu mengubah keadaan entitas , tetapi masih dianggap sebagai karakteristik intrinsik dari entitas itu (contoh: menggonggong akan menjadi karakteristik intrinsik suatu Dogentitas, bahkan jika itu tidak mengubah Kondisi anjing )? Haruskah kita memasukkan perilaku ini dalam suatu entitas atau haruskah mereka dipindahkan ke objek lain?
2)
Sejauh memindahkan perilaku ke objek lain, penulis mengacu pada objek nilai secara khusus.
Meskipun kutipan saya tidak mencantumkannya, tetapi penulis tidak menyebutkan dalam paragraf yang sama bahwa dalam beberapa kasus perilaku (dan atribut ) juga akan dipindahkan ke entitas lain (meskipun saya memahami manfaat dari memindahkan perilaku ke VO)
3) Dengan asumsi MyEntity(lihat pertanyaan 3. di posting asli saya) tidak melanggar SRP, akan kita katakan bahwa tanggung jawab dari MyEntityyang antara lain juga terdiri dari:
Sebuah. A_resp + B_resp + AB_resp ( AB_respkoordinat objek adan b)
atau
b. AB_resp + mendelegasikan A_respdan B_respke objek ( adan b) yang terkait dengan MyEntity?
4) buku DDD Eric Evan, hal. 94:
CustomerID adalah satu-satunya pengidentifikasi dari ENTITY Pelanggan (gambar 5.5), tetapi nomor telepon dan alamat akan sering digunakan untuk menemukan atau mencocokkan Pelanggan. Nama tidak mendefinisikan identitas seseorang, tetapi sering digunakan sebagai bagian dari cara untuk menentukannya.
Dalam contoh ini, atribut telepon dan alamat pindah ke Pelanggan, tetapi pada proyek nyata, pilihan itu akan tergantung pada bagaimana pelanggan domain biasanya dicocokkan atau dibedakan. Misalnya, jika Pelanggan memiliki banyak nomor telepon kontak untuk tujuan yang berbeda, maka nomor telepon tersebut tidak dikaitkan dengan identitas dan harus tetap dengan Kontak Penjualan.
Sebuah)
CustomerID adalah satu-satunya pengidentifikasi dari ENTITY Pelanggan (gambar 5.5), tetapi nomor telepon dan alamat akan sering digunakan untuk menemukan atau mencocokkan Pelanggan. Nama tidak mendefinisikan identitas seseorang, tetapi sering digunakan sebagai bagian dari cara untuk menentukannya.
Kutipan menyatakan bahwa hanya atribut yang terkait dengan identitas yang harus tetap dalam entitas . Saya berasumsi penulis berarti bahwa entitas hanya boleh berisi atribut - atribut yang sering digunakan untuk menemukan atau cocok dengan entitas ini , sedangkan SEMUA atribut lainnya harus dipindahkan?
b) Tetapi bagaimana / di mana atribut lainnya dipindahkan? Sebagai contoh (asumsi di sini adalah bahwa atribut alamat tidak digunakan untuk menemukan atau mencocokkan Customer dan dengan demikian kita ingin pindah atribut alamat dari Customer):
jika alih-alih memiliki Customer.Address(tipe string) kita membuat properti Customer.Addresstipe Address, apakah kita memindahkan atribut alamat ke objek VO terkait (yang bertipe Address) atau akankah kita mengatakan bahwa Customermasih berisi atribut alamat ?
c)
Dalam contoh ini, atribut telepon dan alamat pindah ke Pelanggan, tetapi pada proyek nyata, pilihan itu akan tergantung pada bagaimana pelanggan domain biasanya dicocokkan atau dibedakan. Misalnya, jika Pelanggan memiliki banyak nomor telepon kontak untuk tujuan yang berbeda, maka nomor telepon tersebut tidak dikaitkan dengan identitas dan harus tetap dengan Kontak Penjualan.
Bukan salah penulis di sini, karena jika kita asumsikan masing-masing dari banyak nomor telepon kontak yang Customerhanya milik nomor itu Customer, maka saya akan mengatakan nomor telepon ini terkait dengan identitas sama seperti ketika Customerhanya memiliki satu nomor telepon ?
5)
Alasan penulis menyarankan untuk melepaskan entitas adalah ketika seseorang awalnya menciptakan entitas Pelanggan, ada kecenderungan untuk mengisinya dengan atribut apa pun yang dapat dipikirkan terkait dengan pelanggan. Ini adalah pendekatan data-sentris yang mengabaikan perilaku yang pada akhirnya mengarah ke model domain anemia.
Off topic, tapi saya pikir model domain anemia hasil dari bergerak perilaku dari suatu entitas , sedangkan contoh Anda mengisi sebuah entitas dengan banyak atribut , yang akan mengakibatkan Customermemiliki terlalu banyak perilaku (karena kita mungkin juga termasuk di Customerdalam perilaku yang memodifikasi atribut tambahan ini ) dan dengan demikian melanggar SRP?
Terima kasih