Gli oggetti valore hanno un comportamento?

0

Nel suo libro, Eric Evans distingue tra classi di valore e classi di entità. Gli oggetti valore non hanno identità e continuità.

Le classi Value contengono un comportamento? È accettabile che i Tipi di valore non abbiano un comportamento? Il motivo per cui lo chiedo è perché un modello di dominio ricco differisce da quello anemico nel senso che le classi contengono stato e comportamento. Sto cercando di creare un modello di dominio ricco, tuttavia mi sto ritrovando a creare oggetti di valore senza alcun comportamento.

Quindi mi chiedo se il mio modello di dominio è anemico (perché i tipi di valore non contengono comportamenti) e ricco (perché i tipi di entità contengono comportamenti).

    
posta w0051977 14.06.2017 - 13:30
fonte

3 risposte

3

La distinzione tra tipi di valore ed entità è largamente indipendente dalla quantità di comportamento che ha una classe.

  • Per le entità, è molto insolito che non abbiano un comportamento e che sia quasi certamente un'indicazione di un modello di dominio anemico.

  • Per i tipi di valore, puoi averli con un comportamento molto ricco (come String ) o senza alcun comportamento (tipicamente classi DTO).

Se vuoi stare lontano dai modelli di dominio anemici, dovresti evitare entità senza comportamento. Ovvero, classi in cui più copie di un oggetto non dovrebbero essere paragonabili ma anche che non contengono comportamenti.

    
risposta data 14.06.2017 - 14:02
fonte
2

Do Value classes contain behaviour?

Evans, Design guidato dal dominio

An object that represents a descriptive aspect of the domain with no conceptual identity is called a VALUE OBJECT.... Treat the VALUE OBJECT as immutable. Don't give it any identity, and avoid the design complexities necessary to maintain entities.

Gli oggetti valore sono rappresentazioni di stato immutabile, utilizzando le ortografie tratte dalla lingua del tuo dominio.

Che in genere significa che supporteranno query che restituiscono altri oggetti Value, ma non supporteranno alcun comando e non avranno effetti collaterali.

Un altro modo di esprimere la stessa idea: sono un rimedio contro ossessione primitiva .

Sono un modo per isolare il modello di dominio dai dettagli del sottostante modello di dati .

Nella programmazione orientata agli oggetti, "comportamento" è normalmente associato a un cambiamento di stato. Quindi no, un oggetto Value non lo fa. In genere, invece di cambiare se stesso, ciò che farà il valore dell'oggetto è restituire un nuovo oggetto immutabile che descrive lo stesso stato.

Ad esempio, considera List.add (...)

Se List è una entità , la normale implementazione di add è quella di mutare la rappresentazione interna della lista (cioè la struttura dati nascosta dietro l'astrazione).

List theList = List.of(1,2,3)
assert theList.size() == 3

theList.add(4);
assert theList.size() == 4

Se List è un oggetto valore , la normale implementazione di add restituisce un nuovo oggetto List senza modificare l'originale.

List source = List.of(1,2,3)
assert source.size() == 3

List target = source.add(4)
assert target.size() == 4
assert source.size() == 3
    
risposta data 14.06.2017 - 15:47
fonte
1

L'anemia non ha senso nel contesto degli oggetti Valore, ma nel contesto delle Entità, in particolare degli Aggregati.

Tuttavia, gli oggetti valore possono avere alcuni tipi di comportamento (come la formattazione, le conversioni, i calcoli) ma lo scopo di tale comportamento è diverso dal comportamento trovato nelle Entità.

    
risposta data 14.06.2017 - 14:07
fonte

Leggi altre domande sui tag