DDD ve Değer Nesneleri. Değişebilir Değer Nesneleri Aggr Olmayanlar için iyi bir adaydır. Kök Varlık?


9

İşte küçük bir problem

Değer nesnesine sahip bir varlığa sahip olun. Problem değil. Yeni bir değer nesnesini değiştiririm, sonra nhibernate yeni değeri ekler ve eskisini yetim eder, sonra siler. Tamam, bu bir problem.

Sigortalı, alanımdaki varlığım. Adresleri (değer nesneleri) koleksiyonu var. Adreslerden biri MailingAddress. Posta adresini güncellemek istediğimizde, diyelim ki Bay Evans doktrininden sonra posta kodunun yanlış olduğunu varsayalım, eski nesneyi değiştirilemez olduğu için değiştirmeliyiz (bir değer nesnesi doğru mu?).

Ancak bu satırı silmek istemiyoruz, çünkü bu adresin PK'si bir MailingHistory tablosunda bir FK. Bu yüzden, Bay Evans doktrininin ardından, burada çok sıkıldık. Ben adreslerimi Varlıklar sürece, bu yüzden "değiştirmek" ve sadece eski iyi günler gibi, posta kodu üyesini güncellemek zorunda değilsiniz.

Bu durumda bana ne önerirsiniz? Gördüğüm gibi, ValueObjects yalnızca veritabanı tablosunun sütun grubunu (nhibernate bileşen) kapsüllemek istediğinizde yararlıdır. Veritabanında kalıcılık kimliğine sahip olan her şey, onu bir Varlık (mutlaka bir toplam kök değil) yapmak için daha iyidir, böylece özellikle derin iç içe bir nesne ise, tüm nesne grafiğini yeniden oluşturmadan üyelerini güncelleyebilirsiniz.

Aynı fikirde misiniz? Bay Evans'ın değişebilir bir değer nesnesine sahip olmasına izin veriliyor mu? Veya değişebilir değer nesnesi bir Varlık için aday mıdır?

Teşekkürler


2
"Değişken değer nesnesi" diye bir şey var mı? Her zaman izlenim değeri nesneleri değişmez vardı.
herby

@herby Sanırım kodda bir DDD değeri nesnesini temsil eden değiştirilebilir bir nesneye sahip olabilirsiniz, ancak nesneyi değiştirdiğinizde artık aynı mantıksal DDD değeri nesnesine değil, yeni bir nesneye başvurduğunu düşünmeniz gerekir. Bu belki arzu edilebilir ama imo karışıklık için bir reçete - değer verme kodu değişmez nesneleri akıllı kongre olduğunu.
MattDavey

Yanıtlar:


8

Bir kimliği olan her şey bir Varlık olmalıdır ve bir kimliği olmayan her şey basit bir değerdir, dolayısıyla bir değer nesnesidir.

Martin Fowler'ı alıntılamak için (Eric Evans'ı qoutes)

  • Varlık: Zaman içinde ve farklı temsiller boyunca çalışan farklı bir kimliğe sahip nesneler . Bunlara "referans nesneler" de denir.
  • Değer Nesnesi: Önemli olan nesneler yalnızca özniteliklerinin birleşimine sahiptir.

Adresinizi bir Değer Nesnesi yapma nedeni:

Adresiniz değiştirilebilirse, büyük olasılıkla posta geçmişinizi sonunda mahvedeceksiniz. Örneğin, bir müşteriye ürün gönderiyorsanız, MailingHistory tablonuzun atıfta bulunduğu adres değiştiyse, geçmişte gerçekte hangi adrese gönderim yaptığınızdan emin olamazsınız.

MailingHistory girişi A764'ü 657 adresine göndermemiz anlamına gelebilir Dün A764 makalesini dün Boston'a gönderdik ve yarın A764 makalesini New York'a gönderdik .

Posta adresinin değiştirilmesi gerekiyorsa , eski adresi silmenize gerek yoktur . Tutun ve olarak işaretlemek inaktif ve yeni bir aktif .


Elbette adresinizi bir Varlık olarak ele alabilirsiniz, ancak yalnızca güncelleme sırasında adresin atıfta bulunduğu gerçek yeri değiştirmez, bu nedenle sadece yazım hatalarının düzeltilmesine izin verir.

Bunu yapabileceğinizden eminseniz, bir Varlık kullanmaktan daha mümkün olacaktır.


Ancak en iyi çözüm IMHO, posta geçmişinizde bir adres varlığına başvurmak değil, belirli bir adresi doğrudan posta geçmişi tablonuza kaydetmektir (temel olarak adres verilerini kopyalamak).

Bu şekilde, öğelerinizi nereye gönderdiğinizi (veya postaladığınız her şeyi) her zaman bilirsiniz ve değiştirilebilir bir Varlık kullandığınız için adres tablonuz karmaşık olmayacaktır.

Birkaç ERP sistemi ile / üzerinde çalıştım ve neredeyse hepsi bu yaklaşımı kullandı.

Veritabanınızda fazlalık olacak, ancak IMHO'nun en pragmatik yolu.


Bu muhtemelen en baş ağrısız çözümdür. Yalnızca gelecekteki iletişim kanallarının fazladan sütun gerektireceğini ve veritabanınızın çok büyük olacağını düşünüyorsanız ALTER, varlıkları ayrı tablolarda kullanmak gerekli olabilir. Bu da, sorgularınızda "her zaman en yeni adrese / telefona / e-postaya katıl" gibi SELECT, sürdürülebilir ve verimli kalmasını zorlaştıran stratejiler gerektirir . Mümkünse basit tutun.
Timo

@Timo, sadece bir active-flag ekleyerek verilerinizi biraz denormalize ederseniz "her zaman en yeni adrese / telefona / e-postaya katıl" zor değildir . Tabii ki birleştirme işlemlerinizde daima kullandığınızdan and active = true, bayrağı güncel tuttuğunuzdan ve tablonuza bir çelişki eklediğinizden emin olmalısınız;
tembellik

Bu, öncekinin devre dışı bırakılması sorununu ortaya çıkarır. Örneğinizin koddaki "geçerli" Adres nesnesini değiştirdiyseniz ve veri erişim kodunuza giderseniz, (1) yeni bir tane olup olmadığını veya (2) potansiyel eski olanı bilmez biri oldu. Bu nedenle, her kaydetme işlemi "ilk gitme ve veritabanındaki tüm ilgili adresleri devre dışı bırakma" gibi kıvrımlı bir şey yapmalı ve ardından geçerli olanı kaydetmelidir active=true. Bu basit diye adlandırdığım şey değil, tam da bu yüzden çözümünüzü seviyorum.
Timo

2

2 şey görüyorum:

  1. Posta kodunun değiştirilmesinin geçmiş kaydını etkilemesi uygun mudur? Geçmiş kaydının eski, değişmemiş adrese işaret etmesinin mantıklı olacağını düşünüyorum, bu yüzden yanlış adrese gönderdiğinizi biliyorsunuz.

  2. MailingHistory adresinde FK bulunduğunda, adres bir değer nesnesi olmayı bıraktı ve varlık haline geldi. Değer nesnelerinin kimliği yoktur, diğer varlıkların bu kimliğe başvurmasına izin verir. Adresleri tek bir tabloda, diğer tablolara işaret eden şekilde ekleyebilirsiniz, ancak tek etki yerden tasarruf sağlar. Etki alanı açısından bakıldığında, iki varlık aynı türde değer nesnesine başvuruyorsa, herhangi bir bilgi paylaşmazlar.


2

IMO adres nesnesi, alan adınızdaki bir varlıktır. Birden fazla varlık tarafından paylaşılır, kendi kimliği vardır ve sistem genelinde benzersizdir.

Evans diyor:

Öncelikle kimliği ile tanımlanan bir nesneye varlık denir.


Alan kimlikleri, benim görüşüme göre, kalıcılık kimliğiyle hiçbir ilgisi yoktur. Bay Evan'ın kitabına göre.
Pepito Fernandez

Haklısın. Cevabımı düzenlerim. Demek istediğim, Adres nesnesi bu belirli alanda önemli, benzersiz. IMO Yabancı Anahtar ve Birincil Anahtar, aslında tüm etki alanında benzersiz bir nesne olduğuna dair bir işarettir, bu nedenle bir kimliği vardır.
margabit

1
"adres nesnesinin ... kendi kimliği var" - bir adresin hangi özelliği onu benzersiz olarak tanımlar? Bir adresin tek bir özelliği benzersiz değildir, ancak özelliklerin kombinasyonu kimlik olarak işlev görür. Bu bir değer nesnesinin
MattDavey

@MattDavey: bu iyi bir sonuç, ama Tony "satırını silmek istemiyoruz çünkü bu adresin PK'sı bir MailingHistory tablosunda bir FK" dediğinde kafam karışıyor. Bu benim için Address nesnesinin Agrega 'Sigortalı' dışında da bir anlamı olduğu anlamına geliyor. Bana 'Adres' nesnesi bir ValueObject olmamalı işaret ediyor. Ne düşünüyorsun?
margabit

Değer Nesnelerinin her zaman ebeveyn tarafından tamamen sahip olunan kompozisyon (UML) olacağını söyleyebilir miyiz? Ayrıca bir Değer Nesnesi, Üst Öğesi olmadan hiçbir anlam ifade etmez ve Ebeveynler arasında paylaşılamaz mı?
Sudarshan
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.