Bir işletmenin tek sorumluluğu (değişim nedeni), kendisini benzersiz bir şekilde tanımlamak, diğer bir deyişle sorumluluğunun anlaşılabilir olması olmalıdır.
Eric Evan'ın DDD kitabı, sf. 93:
İşletmelerin en temel sorumluluğu, davranışın açık ve öngörülebilir olabilmesi için süreklilik sağlamaktır. Yedek tutulursa bunu en iyi şekilde yaparlar. Özniteliklere ve hatta davranışa odaklanmak yerine, Entity nesnesinin tanımını en içkin özelliklere, özellikle onu tanımlayan veya bulmak veya eşleştirmek için yaygın olarak kullanılan karakterlere ayırın. Yalnızca bu davranış için gerekli olan kavram ve öznitelikler için gerekli olan davranışı ekleyin.
Bunun ötesinde, temel Varlık ile ilişkili diğer nesnelere davranış ve nitelikleri kaldırmaya bakın. Kimlik sorunlarının ötesinde, Varlıklar sahip oldukları nesnelerin işlemlerini koordine ederek sorumluluklarını yerine getirme eğilimindedir.
1.
... ENTITY nesnesinin tanımını, özellikle onu tanımlayan ya da onu bulmak ya da eşleştirmek için yaygın olarak kullanılanlar olmak üzere, en içsel özelliklere ayırın. Yalnızca kavram için gerekli olan davranışı ekleyin ...
Bir varlığa benzersiz bir kimlik atandığında , kimliği oluşturulur ve bu nedenle böyle bir varlığın kimliğini korumak veya kendini tanımlamasına yardımcı olmak için herhangi bir davranışa ihtiyaç duymadığını varsayarım . Böylece, ben ne tür davranışların yazar (yanında atıfta olduğunu anlamıyorum find
ve match
operasyonlar ) "ile kavramına esastır davranışı "?
2.
... ENTITY nesnesinin tanımını, özellikle onu tanımlayan ya da onu bulmak ya da eşleştirmek için yaygın olarak kullanılanlar olmak üzere, en içsel özelliklere ayırın. ... Bunun ötesinde, çekirdek ENTITY ile ilişkili diğer nesnelere ilişkin davranış ve nitelikleri kaldırmaya bakın.
Yani varlığı tanımlamaya yardımcı olmayan herhangi bir davranış, ama biz yine de bu davranışı o varlığın kendine özgü bir özelliği olarak nitelendiririz (yani havlama köpeklere özgüdür, uçmak uçaklara özgüdür, yumurtlamak kuşlara özgüdür. .), bu varlıkla ilişkili diğer nesnelere konulmalıdır (örnek: havlayan davranışı bir köpek varlığıyla ilişkili bir nesneye koymalıyız)?
3.
Bunun ötesinde, çekirdek ENTITY ile ilişkili diğer nesnelere yönelik davranış ve nitelikleri kaldırmaya bakın.
a) MyEntity
delegeler sorumlulukları A_resp
ve B_resp
nesnelere a
ve b
sırasıyla.
Çoğu rağmen A_resp
ve B_resp
çalışma yapılır a
ve b
örneklerini, müşteriler hala servis edilir A_resp
ve B_resp
içinden MyEntity
müşterinin bakış açısından iki sorumlulukları ait olduğunu, hangi araçlar MyEntity
. Böylece, ortalama etmediğini MyEntity
de vardır A_resp
ve B_resp
sorumluluklar ve bu şekilde ihlal SRP ?
b) Bunu varsaysak A_resp
ve B_resp
ait olmasak bile MyEntity
, MyEntity
hala AB_resp
nesnelerin a
ve operasyonlarının koordinasyonundan sorumludur b
. Yani SRP'yiMyEntity
ihlal etmiyor çünkü en azından iki sorumluluğu var - kendini benzersiz olarak tanımlamak ve ayrıca ?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
{ ... }
GÜNCELLEME:
1.
Bu bağlamdaki davranış semantik davranışa atıfta bulunmaktadır. Örneğin, bir sınıftaki bir özelliğinin (yani bir etki alanı nesnesindeki özniteliğin) benzersiz bir şekilde tanımlanması için kullanılan bir davranışı vardır. Bu doğrudan kodda temsil edilmese de. Beklenen davranış, söz konusu özellik için yinelenen değerlerin olmamasıdır.
Bu nedenle, kodda, neredeyse hiçbir zaman gerçekte varlığın kimliğini koruyacak bir davranış (yani bir işlem) uygulamamız gerekmeyecektir, çünkü böyle bir davranışın yalnızca bir etki alanı modelinde (ID özniteliği şeklinde) ancak bu kimlik niteliğini koda çevirdiğimizde, anlambiliminin bir kısmı kaybolur (yani, kimlik değerinin benzersiz olduğundan dolaylı olarak emin olunan kısım kaybolur)?
2.
Ayrıca, Yaş gibi bir mülkün bir Kişi Varlığı dışında bir bağlamı yoktur ve bu nedenle, farklı bir nesneye taşınmak mantıklı değildir ... Ancak bu bilgiler, benzersiz tanımlayıcının ayrı bir yerde kolayca saklanabilir, dolayısıyla davranışa kafa karıştırıcı referans. Yaş tembel bir yük değeri olabilir.
a) Age
Özellik tembel yüklüyse, anlamsal Age
olarak sadece bir özellik olsa da, buna bir davranış diyebiliriz ?
3.
Adrese özgü, geçerli bir adres olduğunu doğrulama gibi işlemleri kolayca yapabilirsiniz. Bunu tasarım zamanında bilmiyor olabilirsiniz, ancak tüm bu kavram nesneleri en küçük parçalarına ayırmaktır
Age
Farklı bir nesneye geçerek bağlamı kaybedeceğimizi kabul etsem de , DateOfBirth
mülkü farklı bir nesneye taşırsak bağlam kaybolmaz , ancak genellikle onu taşımayız.
Address
Başka bir nesneye taşınmamızın ana nedeni nedir, değil DateOfBirth
mi? Çünkü varlık DateOfBirth
için daha içsel Person
ya da gelecekte bir yerde belirli operasyonları tanımlamamız gerekebileceğimiz için daha az şans var DateOfBirth
mı?
4. Ben hala bilmiyorum söylemeliyim MyEntity
da vardır A_resp
ve B_resp
sorumlulukları ve neden MyEntity
de sahip AB_resp
ihlali olarak kabul edilmez SRP
EULERFX
1)
Yazarın bahsettiği davranışlar, varlıkla ilişkili davranışlardır. Bunlar, varlığın durumunu değiştiren davranışlardır
a) Sizi doğru anlarsam, varlığın yalnızca niteliklerini değiştiren davranışları (yani durumunu ) içermesi gerektiğini mi söylüyorsunuz ?
b) Ve varlığın durumunu değiştirmesi zorunlu olmayan , ancak yine de o varlığın içsel bir özelliği olduğu düşünülen davranışlar hakkında (örnek: havlama , bir varlığın değişmemiş olsa bile içsel bir özelliği olacaktır) Köpeğin durumu )? Bu davranışları bir varlığa dahil etmeli miyiz yoksa başka nesnelere mi taşınmalı? Dog
2)
Davranışı diğer nesnelere taşıma konusunda, yazar özellikle değer nesnelerine atıfta bulunmaktadır.
Alıntımda yer almasa da, yazar aynı paragrafta bazı durumlarda davranışların (ve niteliklerin ) diğer varlıklara da taşınacağından bahsediyor (ancak davranışları VO'lara taşımanın faydalarını anlıyorum )
3) varsayarsak MyEntity
(soruya bakın 3. benim orijinal sonrası) biz demek olur, SRP ihlal etmez sorumluluk ait MyEntity
ayrıca oluşan diğer şeyler arasında yer alıyor:
a. A_resp
+ B_resp
+ AB_resp
( AB_resp
nesneleri koordine eder a
ve b
)
veya
b. AB_resp
+ temsilci seçme A_resp
ve ilişkili B_resp
nesnelere ( a
ve b
) MyEntity
?
4) Eric Evan'ın DDD kitabı, s. 94:
CustomerID, Müşteri ENTITY ürününün tek ve tek tanımlayıcısıdır (şekil 5.5), ancak bir Müşteri bulmak veya eşleştirmek için genellikle telefon numarası ve adres kullanılır. İsim, bir kişinin kimliğini tanımlamaz, ancak genellikle onu belirleme yollarının bir parçası olarak kullanılır.
Bu örnekte, telefon ve adres özellikleri Müşteri'ye taşındı, ancak gerçek bir projede bu seçim, alan adının müşterilerinin tipik olarak nasıl eşleştirildiğine veya ayırt edildiğine bağlı olacaktır. Örneğin, Müşterinin farklı amaçlarla birçok kişi telefon numarası varsa, telefon numarası kimlikle ilişkilendirilmez ve Satış Kişisi'nde kalmalıdır.
a)
CustomerID, Müşteri ENTITY ürününün tek ve tek tanımlayıcısıdır (şekil 5.5), ancak bir Müşteri bulmak veya eşleştirmek için genellikle telefon numarası ve adres kullanılır. İsim, bir kişinin kimliğini tanımlamaz, ancak genellikle onu belirleme yollarının bir parçası olarak kullanılır.
Alıntı, yalnızca kimlikle ilişkili niteliklerin bir varlıkta kalması gerektiğini belirtir . O yazar araçlarını varsayalım varlık sadece bu içermelidir özelliklerini sıklıkla kullanılır bulabilir veya maç bu varlık TÜM diğeri ise, nitelikleri taşınmış olmalıdır?
b) Peki diğer özellikler nasıl / nereye taşınmalı? Örneğin (Buradaki varsayım yani adres niteliği için kullanılmaz bulmak veya maç Customer
ve böylece biz taşımak istediğiniz adresi özelliğini dışına Customer
):
eğer yerine sahip Customer.Address
(Çeşidi string
) bir özellik oluşturmak Customer.Address
Çeşidi Address
biz hareket etmedi, adresi özelliğini (tipidir ilişkili VO nesnesine Address
) ya da biz söyleyebilirim Customer
hala içeren adres niteliğini ?
c)
Bu örnekte, telefon ve adres özellikleri Müşteri'ye taşındı, ancak gerçek bir projede bu seçim, alan adının müşterilerinin tipik olarak nasıl eşleştirildiğine veya ayırt edildiğine bağlı olacaktır. Örneğin, Müşterinin farklı amaçlarla birçok kişi telefon numarası varsa, telefon numarası kimlikle ilişkilendirilmez ve Satış Kişisi'nde kalmalıdır.
Birçok her varsayarsak, çünkü burada haksız yazar değil mi irtibat numaralarınıCustomer
yalnızca o belirli aittir vardır Customer
, o zaman ben bu derdim telefon numaraları ile ilişkili kimlik tıpkı olduğu gibi Customer
sadece vardı bir telefon numarası ?
5)
Yazarın varlığı kaldırmayı önermesinin nedeni, başlangıçta bir Müşteri varlığı oluşturduğunda, onu bir müşteriyle ilişkilendirmeyi düşünebileceği herhangi bir nitelikle doldurma eğilimi olmasıdır. Bu, nihayetinde anemik etki alanı modeline yol açan davranışları gözden geçiren veri merkezli bir yaklaşımdır.
Konu dışı ama düşündüm anemik alanı modeli hareketli sonuçları davranışlarını bir takım varlık senin örneğin bir doldurma iken, varlık ve birçok niteliklerini neden olacaktır, Customer
çok fazla sahip davranışı muhtemelen de dahil ediyorum çünkü ( davranışların hangi bu ek özellikleri değiştirebilir ) ve böylece SRP'yi ihlal ediyor musunuz?Customer
Teşekkürler