it-swarm-eu.dev

Objekty hodnoty vs entita (návrh řízený doménou)

Právě jsem začal číst DDD. Nemohu zcela pochopit koncepci objektů Entity vs Value .. Může někdo vysvětlit problémy (udržovatelnost, výkonnost atd.), Které by systém mohl čelit, když je objekt hodnoty navržen jako objekt Entity? Příklad by byl skvělý ...

79
StackUnderflow

Snížená na základní rozlišení, identita je důležitá pro entity, ale nezáleží na hodnotových objektech. Jméno uživatele je například objekt hodnoty. Zákaznická entita může být složena ze zákaznického jména (hodnota objektu), seznamu <Objednávka> ObjednávkaHistorie (Seznam entit) a možná výchozí adresy (obvykle objekt hodnoty). Zákaznická entita by měla ID a každá objednávka by měla ID, ale jméno by nemělo; obecně, v rámci objektového modelu, identita adresy pravděpodobně nezáleží.

Hodnotové objekty mohou být typicky reprezentovány jako neměnné objekty; změna jedné vlastnosti objektu hodnoty v podstatě zničí starý objekt a vytvoří nový, protože se nezajímáte o identitu jako s obsahem. Metoda instancí Equals na Name by správně vrátila "true", pokud jsou vlastnosti objektu identické s vlastnostmi jiné instance.

Změnou některého atributu entity, jako je zákazník, však zákazník nezničí; Zákaznická entita je typicky mutovatelná. Identita zůstává stejná (alespoň jednou, když je objekt vytrvalý).

Pravděpodobně vytvoříte hodnotové objekty, aniž byste si to uvědomovali; kdykoliv reprezentujete nějaký aspekt entity vytvořením jemnozrnné třídy, máte objekt hodnoty. Například třída IPAddress, která má některá omezení platných hodnot, ale je složena z jednodušších datových typů, by byla objekt hodnoty. Adresa EmailAddress může být řetězec nebo to může být objekt hodnoty s vlastní sadou chování.

Je docela možné, že ani položky, které mají ve vaší databázi identitu, nemají ve svém objektovém modelu identitu. Ale nejjednodušší případ je složen z několika atributů, které dávají smysl. Pravděpodobně nebudete chtít mít Customer.FirstName, Customer.LastName, Customer.MiddleInitial a Customer.Title, když můžete skládat ty dohromady jako Customer.Name; budou pravděpodobně více polí ve vaší databázi v době, kdy si myslíte o vytrvalosti, ale váš objektový model se nestará.

91
JasonTrue

Objekt, který je společně definován všemi atributy, je objekt hodnoty. Pokud se některý z atributů změní, máte novou instanci objektu hodnoty. Proto jsou hodnoty objektů definovány jako neměnné.

Pokud objekt není plně definován všemi jeho atributy, pak existuje podmnožina atributů, které tvoří identitu objektu. Zbývající atributy lze změnit bez předefinování objektu. Tento druh objektu nelze definovat při neměnném.

Jednodušší způsob, jak rozlišovat, je přemýšlet o hodnotových objektech jako statických datech, která se nikdy nezmění a entitách jako datech, která se vyvíjejí ve vaší aplikaci.

30
Richard Dorman

Nevím, zda je následující postup správný, ale řekl bych, že v případě objektu Adresa ho chceme použít jako objekt hodnoty namísto entity, protože změny entity by se projevily na všech propojených objektech ( například Osoba).

Vezměte si tento případ: Žijete ve svém domě s dalšími lidmi. Kdybychom použili Entity for Address, tak bych tvrdil, že by existovala jedna jedinečná adresa, na kterou by všechny objekty osoby odkazovaly. Pokud se jedna osoba pohybuje ven, chcete aktualizovat adresu. Pokud byste aktualizovali vlastnosti adresního subjektu, všichni lidé by měli jinou adresu. V případě hodnotového objektu bychom nemohli upravovat adresu (protože je neměnná) a my bychom byli nuceni poskytnout této osobě novou adresu.

Zní to správně? Musím říci, že jsem byl/a jsem také zmatený o tomto rozdílu, po přečtení knihy DDD.

Jít o krok dále, jak by to bylo modelováno v databázi? Máte všechny vlastnosti objektu Adresa jako sloupce v tabulce Osoba nebo byste vytvořili samostatnou tabulku Adresa, která by také měla jedinečný identifikátor? Ve druhém případě by lidé žijící ve stejném domě měli každý jiný instanci objektu Adresa, ale tyto objekty by byly stejné s výjimkou jejich ID.

6

adresa může být objekt entity nebo hodnoty, který závisí na podnikovém procesu. adresa objektu může být entita v aplikaci kurýrní služby, ale adresa může být objekt hodnoty v jiné aplikaci. v identitě aplikace kurýrní záležitost pro objekt adresy 

3
Dharmesh

Zeptal jsem se na to v jiném vlákně a myslím, že jsem stále zmatený. Možná jsem matoucí úvahy o výkonnosti s modelováním dat. V naší Katalogizační aplikaci se Zákazník nemění, dokud to nepotřebuje. To zní hloupě - ale „čte“ údaje o zákaznících daleko převyšují „píše“ a protože mnoho webových požadavků se dotýká „aktivní sady“ objektů, nechci neustále načítat zákazníky. Byl jsem tedy zamilovaný do neměnné silnice pro objekt zákazníka - načtěte ho, uložte do vyrovnávací paměti a posílejte to samé na 99% (vícevláknových) požadavků, které chtějí vidět zákazníka. Když pak zákazník něco změní, získejte „editora“, aby vytvořil nového zákazníka a zrušil platnost starého.

Moje obava je, pokud mnoho vláken vidí stejný objekt zákazníka a je mutable, pak když jeden vlákno začne měnit to chaos následuje v ostatních.

Moje problémy jsou nyní, 1) je to rozumné, a 2) jak to nejlépe udělat, aniž by se kopírovali hodně kódu o vlastnostech.

2
n8wrl

Typy hodnot:  

  • Typy hodnot neexistují na vlastní pěst, záleží na typech entit.
  • Objekt Typ hodnoty patří do objektu Typ entity.
  • Životnost instance typu hodnoty je omezena životností instance vlastnické entity.
  • Tři typy hodnot: Basic (primitivní datové typy), Composite (Address) a Collection (Map, List, Array)

Subjekty:  

  • Typy entit mohou existovat na vlastní pěst (Identita)
  • Účetní jednotka má svůj vlastní životní cyklus. Může existovat nezávisle na jakékoli jiné entitě.
  • Například: Osoba, Organizace, Vysoká škola, Mobil, Domov atd. Každý objekt má svou vlastní identitu
2
Premraj

3 rozdíl mezi Entities a Value Objects 

  • Identifikátor versus strukturální rovnost: Subjekty mají identifikátor, entity jsou stejné, pokud mají stejný identifikátor . Hodnotové objekty nad rámec ruky mají strukturální rovnost, uvažujeme dva hodnota objektů rovná, když všechna pole jsou stejná. Hodnotové objekty nemohou mít Identifikátor.

  • Mutability versus imutability: Hodnotové objekty jsou neměnné datové struktury, zatímco entity se během Mění.

  • Životnost: Objekty hodnot by měly patřit subjektům

0
Ramin Farajpour