DDD okumaya yeni başladım. Birim nesnesi bir varlık nesnesi olarak tasarlandığında, bir varlık, varlık veya değer nesnelerini tam anlamıyla kavrayamıyorum. Örnek harika olurdu ...
Temel ayrımlara indirgenen 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ş Tarihi (varlık listesi) ve belki de varsayılan bir Adres (genellikle bir değer nesnesi) içerebilir. Müşteri Varlığının bir kimliği ve her bir siparişin bir kimliği olacaktır, ancak bir Ad olmamalıdır; Genellikle, yine de nesne modelinde, bir Adresin kimliği önemli değildir.
Değer nesneleri tipik olarak değişmez nesneler olarak gösterilebilir; Bir değer nesnesinin bir özelliğini değiştirmek, esasen eski nesneyi yok eder ve yeni bir tane yaratır, çünkü içerikle ilgili kimlikle ilgilenmiyorsunuz. Doğru şekilde, Ad üzerindeki Eşitlik örneği yöntemi, nesnenin özellikleri başka bir örneğin özellikleriyle aynı olduğu sürece "true" değerini döndürür.
Ancak, Müşteri gibi bir işletmenin bazı niteliklerini değiştirmek müşteriyi yok etmez; Bir Müşteri varlığı tipik olarak değişkendir. Kimlik aynı kalır (en azından nesne ısrar ettikten sonra).
Muhtemelen farkına varmadan değer nesneleri yaratırsınız; Ne zaman ince taneli bir sınıf oluşturarak bir Varlığın bazı yönlerini temsil ediyorsanız, bir değer nesnesine sahipsiniz. Örneğin, geçerli değerler üzerinde bazı kısıtlamaları olan ancak daha basit veri türlerinden oluşan bir IPAdresi bir değer nesnesi olacaktır. Bir EmailAddress bir dize olabilir veya kendi davranış setleriyle birlikte bir değer nesnesi olabilir.
Veritabanınızda bir kimliği olan öğelerin bile nesne modelinizde bir kimliğe sahip olmaması oldukça olasıdır. Ancak en basit durum, birlikte anlamlı olan bazı niteliklerin bir birleşimidir. Muhtemelen Müşteri.İlk.Adı, Müşteri.İlk.Adı, Müşteri.OrtadıMüşteri.İlk ve Müşteri.İstemlerini istemezsiniz. Bunları ne zaman birlikte Müşteri olarak oluşturabilirsiniz? kalıcılık hakkında düşündüğünüz zaman muhtemelen veritabanınızdaki birden çok alan olacaktır, ancak nesne modeliniz umursamıyor.
Tüm özellikleriyle topluca tanımlanmış olan herhangi bir nesne, bir değer nesnesidir. Özelliklerden herhangi biri değişirse, yeni bir değer nesnesi örneğiniz olur. Bu nedenle değer nesneleri değişmez olarak tanımlanır.
Nesne tüm nitelikleri tarafından tam olarak tanımlanmamışsa, nesnenin kimliğini oluşturan bir nitelikler alt kümesi vardır. Kalan nitelikler nesneyi yeniden tanımlamaksızın 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 uygulamanızda gelişen veriler olarak varlıkları düşünmektir.
Aşağıdakilerin doğru olup olmadığını bilmiyorum, ancak bir Address nesnesi durumunda, onu bir Varlık yerine bir Değer Nesnesi olarak kullanmak istediğimizi söyleyeceğim, çünkü varlıktaki değişiklikler tüm bağlantılı nesnelere yansıtılacak ( örneğin bir Kişi).
Bu vakayı ele alalım: Evinizde başkalarıyla birlikte yaşıyorsunuz. Eğer Varlık için Adres'i kullanırsak, tüm Kişi nesnelerinin bağlantı verdiği benzersiz bir Adres olacağını savunurum. Bir kişi taşınırsa adresini güncellemek istersiniz. Adres Varlığının özelliklerini güncellerseniz, tüm kişilerin farklı bir adresi olur. Bir Değer Nesnesi durumunda, Adresi düzenleyemeyiz (değiştirilemez olduğundan) ve bu Kişi için yeni bir Adres sağlamak zorunda kalırız.
Bu doğru mu? DDD kitabını okuduktan sonra, bu fark konusunda hala kafamın karıştığını söylemeliyim.
Bir adım daha ileri gitmek, bu veritabanında nasıl modellenir? Address nesnesinin tüm özelliklerini Person tablosunda sütunlar olarak mı kullanırsınız ya da benzersiz bir tanımlayıcıya sahip ayrı bir Adres tablosu oluşturur musunuz? İkinci durumda, aynı evde yaşayan insanların her birinin farklı bir Adres nesnesi örneği olur, ancak bu nesneler kimlik özellikleri dışında aynı olur.
adres iş sürecine bağlı varlık veya değer nesnesi olabilir. adres nesnesi kurye hizmeti uygulamasında varlık olabilir, ancak adres başka bir uygulamada değer nesnesi olabilir. kurye başvuru kimliğinde adres nesnesi için önemlidir
Bunu başka bir başlıkta sordum ve sanırım hala kafam karıştı. Performansla ilgili düşünceleri veri modelleme ile karıştırıyor olabilirim. Kataloglama uygulamamızda, bir Müşteri gerekene kadar değişmez. Bu aptalca geliyor - ancak müşteri verilerinin 'okunması', 'yazma' sayısından çok daha fazla ve birçok web isteği, nesnelerin 'aktif setine' isabet ettiğinden, Müşterileri tekrar tekrar yüklemeye devam etmek istemiyorum. Bu yüzden, Müşteri nesnesi için değişmez bir yola doğru yöneldim - yükle, önbelleğe al ve Müşteriyi görmek isteyen (çok iş parçacıklı) isteklerin% 99'unda aynı şeyi yap. Ardından, müşteri bir şeyi değiştirdiğinde, yeni bir Müşteri yapmak ve eskisini geçersiz kılmak için bir 'editör' edinin.
Benim endişem, eğer birçok iş parçacığı aynı müşteri nesnesini görüyorsa ve değişkense, o zaman bir iş parçacığı değişmeye başladığında, diğerlerinde ortaya çıkar.
Şimdi benim sorunum şu; 1) bu makul ve 2) özellikler hakkında çok fazla kod kopyalamadan bunu nasıl en iyi şekilde yapabiliyorsunuz.
Değer Türleri:
Varlıklar:
Entities ve
Value Objects arasında 3 ayrım
Tanıtıcıya karşı yapısal eşitlik: Varlıkların tanıtıcısı var, varlıklar aynıysa aynı. alanlar aynı. Değer nesnelerinin
Değişebilirlik - değişmezlik: Değer Nesneler değişmez veri yapılarıdır, oysa varlıklar değişmektedir.
Ömür: Değer Nesneleri Kurumlara Ait Olmalı