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 find
dan 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) MyEntity
mendelegasikan tanggung jawab A_resp
dan B_resp
ke objek a
dan b
, masing-masing.
Meskipun sebagian besar A_resp
dan B_resp
pekerjaan dilakukan oleh a
dan b
contoh, klien masih dilayani A_resp
dan B_resp
melalui MyEntity
, yang berarti bahwa dari perspektif klien, dua tanggung jawab menjadi tanggung jawabnya MyEntity
. Jadi, bukankah itu berarti MyEntity
juga memiliki A_resp
dan B_resp
tanggung jawab dan dengan demikian melanggar SRP ?
b) Bahkan jika kita menganggap itu A_resp
dan B_resp
bukan milik MyEntity
, MyEntity
masih memiliki tanggung jawab AB_resp
untuk mengoordinasi operasi objek a
dan b
. Jadi tidak MyEntity
melanggar 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 Age
properti malas dimuat, maka kita dapat menyebutnya perilaku, meskipun secara semantik Age
hanya 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 Age
ke objek yang berbeda, konteksnya tidak akan hilang jika kita memindahkan DateOfBirth
properti ke objek yang berbeda, tetapi kita biasanya tidak memindahkannya.
Apa alasan utama kami pindah Address
ke objek lain, tetapi tidak DateOfBirth
? Karena DateOfBirth
lebih intrinsik ke Person
entitas 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 MyEntity
juga memiliki A_resp
dan B_resp
tanggung jawab dan mengapa MyEntity
juga AB_resp
tidak 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 Dog
entitas, 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 MyEntity
yang antara lain juga terdiri dari:
Sebuah. A_resp
+ B_resp
+ AB_resp
( AB_resp
koordinat objek a
dan b
)
atau
b. AB_resp
+ mendelegasikan A_resp
dan B_resp
ke objek ( a
dan 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.Address
tipe Address
, apakah kita memindahkan atribut alamat ke objek VO terkait (yang bertipe Address
) atau akankah kita mengatakan bahwa Customer
masih 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 Customer
hanya milik nomor itu Customer
, maka saya akan mengatakan nomor telepon ini terkait dengan identitas sama seperti ketika Customer
hanya 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 Customer
memiliki terlalu banyak perilaku (karena kita mungkin juga termasuk di Customer
dalam perilaku yang memodifikasi atribut tambahan ini ) dan dengan demikian melanggar SRP?
Terima kasih