Değer ve Varlık nesneleri (Etki Alanı Odaklı Tasarım)


92

DDD'yi yeni okumaya başladım. Varlık ve Değer nesneleri kavramını tam olarak kavrayamıyorum .. Biri, bir Değer nesnesi bir Varlık nesnesi olarak tasarlandığında bir sistemin karşılaşabileceği sorunları (sürdürülebilirlik, performans ... vb.) Açıklayabilir mi? Örnek harika olur ...


3
Burada ikisi arasındaki farklılıkların tam bir listesini (IMO) yazdım: enterprisecraftsmanship.com/2016/01/11/…
Vladimir

Yanıtlar:


109

Temel ayrıma indirgendiğinde, kimlik varlıklar için önemlidir, ancak değer nesneleri için önemli değildir. Örneğin, birinin Adı bir değer nesnesidir. Bir Müşteri varlığı, bir müşteri Adı (değer nesnesi), Liste <Sipariş> Sipariş Geçmişi (Varlıkların Listesi) ve belki bir varsayılan Adresten (tipik olarak bir değer nesnesi) oluşabilir. Müşteri Varlığının bir Kimliği olur ve her siparişin bir Kimliği olur, ancak bir Ad olmamalıdır; genel olarak, nesne modelinde zaten bir Adresin kimliği muhtemelen önemli değildir.

Değer nesneleri tipik olarak değişmez nesneler olarak temsil edilebilir; Bir değer nesnesinin bir özelliğini değiştirmek, esas olarak eski nesneyi yok eder ve yeni bir tane yaratır, çünkü siz içerik kadar kimlikle ilgilenmezsiniz. Düzgün bir şekilde, Nesnenin özellikleri başka bir örneğin özellikleriyle aynı olduğu sürece, Name üzerindeki Equals örnek yöntemi "true" değerini döndürür.

Ancak, Müşteri gibi bir varlığın bazı özelliklerini değiştirmek müşteriyi yok etmez; bir Müşteri varlığı tipik olarak değiştirilebilir. Kimlik aynı kalır (en azından nesne ısrar ettikten sonra).

Muhtemelen farkında olmadan değerli nesneler yaratırsınız; İnce taneli bir sınıf oluşturarak bir Varlığın bazı yönlerini temsil ettiğinizde, bir değer nesnesine sahip olursunuz. Örneğin, geçerli değerler üzerinde bazı kısıtlamalara sahip olan ancak daha basit veri türlerinden oluşan bir IPAdresi sınıfı bir değer nesnesi olacaktır. Bir EmailAddress bir dize olabilir veya kendi davranış kümesine sahip bir değer nesnesi olabilir.

Veritabanınızda kimliği olan öğelerin bile nesne modelinizde bir kimliği olmaması oldukça olasıdır. Ancak en basit durum, birlikte anlam ifade eden bazı özelliklerin birleşimidir. Muhtemelen Customer.FirstName, Customer.LastName, Customer.MiddleInitial ve Customer.Title'a sahip olmak istemiyorsunuz, bunları Customer.Name olarak birlikte oluşturabiliyorsanız; Kalıcılık hakkında düşündüğünüz zaman muhtemelen veritabanınızda birden çok alan olacaktır, ancak nesne modeliniz umursamıyor.


Paylaşılmayan değiştirilebilir nesneler nereye sığar? Tüm evrende bir nesneye yalnızca bir referans varsa, nesnenin kimliği değişebilir olsa bile ilgisiz olacaktır. Gördüğüm kadarıyla, bir şey, o referans onu değiştirmek için kullanılmadan, durumun bir yönünü gözlemlemek için kullanılabilecek bir referans varsa, bir varlıktır . Bir şey dış dünyaya bağlı değilse ve ya değişmez ise ya da evrenin herhangi bir yerinde ona tek bir gönderme varsa, o zaman yukarıdaki senaryo gerçekleşemez ve bir değerdir.
supercat

An gibi bir şey int[1]paylaşılmamış değişken bir değer, paylaşılabilir değişmez bir değer (referansları tutan hiçbir şey ona yazmayacaksa) veya bir varlık (iki veya daha fazla referans varsa ve bunlardan biri yazmak için kullanılabilirse) diğeri kullanılarak okunabilen değerler). Ne yazık ki, değişken değerleri içeren sınıf nesnelerinin yanlışlıkla varlıklara dönüşmesini önlemek için Java veya .NET'te dil desteği bilmiyorum.
supercat

@supercat, Doğrudan basit bir destek istemiyorsanız, kabul ediyorum, ancak bunu yapıcılara genel erişimi ortadan kaldırarak, yeni örnekler oluşturmak için yalnızca statik fabrikaları kullanarak ve salt okunur özellikler aracılığıyla duruma tüm erişimi kısıtlayarak yapıyorum (Ayarlayıcı yok) .
Charles Bretana

40

Tüm öznitelikleri tarafından toplu olarak tanımlanan herhangi bir nesne, bir değer nesnesidir. Niteliklerden herhangi biri değişirse, yeni bir değer nesnesi örneğiniz olur. Değer nesnelerinin değişmez olarak tanımlanmasının nedeni budur.

Nesne, tüm öznitelikleri tarafından tam olarak tanımlanmamışsa, nesnenin kimliğini oluşturan bir öznitelikler alt kümesi vardır. Kalan nitelikler, nesneyi yeniden tanımlamadan değişebilir. Bu tür bir nesne değişmez olarak tanımlanamaz.

Ayrımı yapmanın daha basit bir yolu, değer nesnelerini asla değişmeyecek statik veriler ve varlıkları uygulamanızda gelişen veriler olarak düşünmektir.


7

Değer Türleri:

  • Değer türleri kendi başına mevcut değildir, Varlık türlerine bağlıdır.
  • Değer Türü nesnesi, Varlık Türü Nesnesine aittir.
  • Bir değer türü örneğinin ömrü, sahip olan varlık örneğinin yaşam süresiyle sınırlıdır.
  • Üç Değer türü: Temel (ilkel veri türleri), Bileşik (Adres) ve Koleksiyon (Harita, Liste, Diziler)

Varlıklar:

  • Varlık türleri kendi başına var olabilir (Kimlik)
  • Bir varlığın kendi yaşam döngüsü vardır. Başka herhangi bir varlıktan bağımsız olarak var olabilir.
  • Örneğin: Kişi, Kuruluş, Üniversite, Mobil, Ev vb .. her nesnenin kendi kimliği vardır

DDD ile ilgili değil :(
HydTechie

6

Aşağıdakilerin doğru olup olmadığını bilmiyorum, ancak bir Adres nesnesi durumunda, onu bir Varlık yerine bir Değer Nesnesi olarak kullanmak istediğimizi söyleyebilirim çünkü varlıktaki değişiklikler tüm bağlantılı nesnelere yansıtılır ( örneğin bir Kişi).

Şu durumu ele alalım: Evinizde başka insanlarla birlikte yaşıyorsunuz. Adres için Varlık kullanacak olsaydık, tüm Kişi nesnelerinin bağlantı verdiği tek bir benzersiz Adres olacağını iddia ederim. Bir kişi taşınırsa, adresini güncellemek istersiniz. Adres Varlığının özelliklerini güncellerseniz, tüm kişilerin farklı bir adresi olacaktır. Bir Değer Nesnesi durumunda, Adresi (değişmez olduğu için) düzenleyemeyiz ve bu Kişi için yeni bir Adres sağlamaya zorlanırız.

Bu kulağa doğru geliyor mu? DDD kitabını okuduktan sonra, bu fark konusunda hala kafamın karışık olduğunu söylemeliyim.

Bir adım daha ileri gidersek, bu veri tabanında nasıl modellenebilir? Adres nesnesinin tüm özelliklerini Kişi tablosunda sütunlar olarak mı alırdınız yoksa benzersiz bir tanımlayıcıya sahip olan ayrı bir Adres tablosu mu oluştururdunuz? İkinci durumda, aynı evde yaşayan insanların her birinin farklı bir Adres nesnesi örneği olacaktır, ancak bu nesneler ID özellikleri dışında aynı olacaktır.


1
"Bu durumu ele alalım: Evinizde başka insanlarla birlikte yaşıyorsunuz. Adres için Varlık kullanacak olsaydık, tüm Kişi nesnelerinin bağlantı kurduğu tek bir benzersiz Adres olacağını iddia ederim". Bence bu insanların her birinin kendi Adres örneği var, ancak bunlar eşitler (sanki her birinin 5 dolarlık banknotu olabilir, ancak bu aynı banknot olduğu anlamına gelmez)
Prokurors

"ancak bu aynı banknot olduğu anlamına gelmez" - Sanırım bu, bir kişinin banknotlara ek özellikler atayıp atamadığına bağlıdır (örneğin, yayımlanma tarihi, uzaydaki fiziksel konum, vb.); aksi takdirde aynı olurlar. Ve sanırım yazılım için de aynı: Adres, ihtiyacımız olan / dikkate almak istediğimiz özelliklere bağlı olarak aynı veya değil.
adrhc

4

adres, meşgul sürece bağlı olan varlık veya değer nesnesi olabilir. adres nesnesi, kurye hizmeti uygulamasındaki varlık olabilir, ancak adres başka bir uygulamada değer nesnesi olabilir. kurye başvurusunda adres nesnesi için kimlik önemlidir


2

Bunu başka bir başlıkta sordum ve hala kafam karışık. Veri modelleme ile performans hususlarını karıştırıyor olabilirim. Kataloglama uygulamamızda, bir Müşteri ihtiyaç duyana kadar değişmez. Bu kulağa aptalca geliyor - ancak müşteri verilerinin "okunması", "yazılanlardan" çok daha fazla ve birçok web isteğinin tümü nesnelerin "etkin kümesine" ulaştığı için Müşterileri tekrar tekrar yüklemeye devam etmek istemiyorum. Bu yüzden Müşteri nesnesi için değişmez bir yola yönelmiştim - onu yükleyin, önbelleğe alın ve Müşteriyi görmek isteyen (çok iş parçacıklı) isteklerin% 99'una aynı yolu sunun. Ardından, bir müşteri bir şeyi değiştirdiğinde, yeni bir Müşteri oluşturmak ve eskisini geçersiz kılmak için bir 'düzenleyici' edinin.

Benim endişem, birçok iş parçacığının aynı müşteri nesnesini görmesi ve değişken olması, o zaman bir iş parçacığı değişmeye başladığında diğerlerinde kargaşa çıkmasıdır.

Şu anki sorunlarım, 1) bu kadar makul ve 2) özellikler hakkında çok fazla kod kopyalamadan bunu en iyi nasıl yapacağım.


1

EntitiesVe arasındaki 3 ayrımValue Objects

  • Tanımlayıcı vs yapısal eşitlik: Varlıkların tanımlayıcıları vardır, varlıklar aynı tanımlayıcıya sahiplerse aynıdır. Elin ötesindeki Değer Nesneleri yapısal eşitliğe sahiptir, tüm alanlar aynı olduğunda iki değer nesnesini eşit kabul ederiz. Değer nesnelerinin tanımlayıcıları olamaz.

  • Değişkenlik ve değişmezlik: Değer Nesneleri değişmez veri yapılarıdır, oysa varlıklar yaşam süreleri boyunca değişir.

  • Ömür: Değer Nesneleri Varlıklara Ait Olmalıdır


1

Çok basit bir cümleyle söyleyebilirim ki, üç tür eşitliğimiz var:

  • Tanımlayıcı eşitliği : Bir sınıfın kimliği dosyalanmış ve iki nesne kimlik alanı değerleriyle karşılaştırılır.
  • Referans eşitliği : İki nesneye yapılan bir referansın bellekte aynı adresi varsa.
  • Yapısal eşitlik : tüm üyeleri eşleşirse iki nesne eşittir.

Tanımlayıcı eşitliği yalnızca Varlığı ifade eder ve yapısal eşitlik yalnızca Değer Nesnesini ifade eder. Aslında Değer Nesnelerinin kimliği yoktur ve bunları birbirinin yerine kullanabiliriz. ayrıca değer nesneleri değişmez olmalıdır ve varlıklar değiştirilebilir olabilir ve değer nesneleri veritabanında nay tablosu olmayacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.