Devo inserire la logica di calcolo in un'entità o nel livello aziendale?


15

Di recente mi sono posto una domanda sul fatto se un semplice calcolo dovesse essere inserito nel livello Entity o se l'Entity fosse pura solo per l'archiviazione dei dati grezzi e lasciare le logiche di calcolo nel livello aziendale.

Quindi la mia domanda è se sia sensato incapsulare semplici calcoli nelle proprietà in una classe di entità?

Risposte:


21

Dipende dal tipo di architettura che desideri.

  • In Domain Driven Design, dovresti creare un modello di dominio con dati e funzionalità.

Ciò significherebbe che un Orderha una proprietà (o metodo) che restituirebbe il prezzo totale dell'ordine in base al OrderLines. Il Ordersarebbe anche avere un metodo AddOrderItem(Product product, int amount)e Ordersarebbe verificare se v'è già un OrderLineper quello specifico prodotto.

In un tale modello avresti anche oggetti che non sono entità reali, come un Repositoryper accedere ai dati o un Factoryper creare entità. Questi sono chiamati servizi di dominio. Un livello applicazione è responsabile della chiamata ai servizi di dominio (ad esempio per recuperare un'entità dal database) e quindi eseguirà la funzionalità sull'entità. L' Application Layerdovrebbe essere il più sottile possibile.

Questo è un bell'articolo su DDD che spiega questi concetti in modo più dettagliato.

  • Puoi anche utilizzare un modello di dominio anemico . Ciò significa che le entità sono costituite da proprietà get / set e non contengono alcun comportamento. In tale progetto, il tuo livello aziendale conterrà il comportamento, come il calcolo del Orderprezzo e la verifica della presenza di duplicati OrderLines.

Esistono opinioni diverse sul fatto che un modello di dominio anemico sia negativo. Personalmente preferisco un vero modello di dominio.

Questo articolo descrive le differenze tra un modello di dominio anemico e non anemico.


Ciao Wouter, grazie per la risposta e i collegamenti. Mi sembra di dover affrontare una mentalità sbagliata secondo cui quando si utilizza il modello di dominio Anemic, tutte le logiche aziendali (anche quelle molto semplici) dovrebbero essere inserite nel livello aziendale. Ciò sembra insensato in alcuni casi in cui le logiche aziendali dipendono davvero solo dal modello stesso. Ad esempio, una proprietà viene calcolata dalle proprietà esistenti nel modello. Non sono riuscito a trovare una ragione ragionevole per inserire le logiche aziendali che tutto dipende dal modello stesso nel livello aziendale.

In un modello di dominio anemico, dato che abbiamo business class e classi di entità, come nominare correttamente le classi per evitare di essere confuse tra loro? Suggerisci di usare suffissi? Se sì, potresti fare un esempio?
Kwadz,

Per DDD, cosa succede se la logica di calcolo dei prezzi è complicata? Ad esempio, il prezzo si basa sulla posizione (tasse), informazioni sull'utente (sconto sulla data di nascita, sconto sull'iscrizione), coupon, carta di credito (sconto speciale sulla carta di credito) ecc. Come possiamo inserire tale logica all'interno della Orderclasse?
Sher10ck,

1
L'aggregato dell'ordine deve contenere tutte queste informazioni necessarie per effettuare il calcolo. Perché in base alla tua descrizione questo dovrebbe essere effettivamente parte dell'aggregato. Ma se la logica diventa davvero complessa e potrebbe essere necessario cambiarla, allora passerei la calcolatrice come oggetto al costruttore dell'entità e lascerei che l'entità utilizzi la calcolatrice internamente per impostare il prezzo.
burzum,

Anemico ... il povero dominio suona come se soffrisse di una sorta di malattia. Non preferiresti essere guidato ?! Si!
Matt Jenkins,

1

Bene, Entity e business Objects sono quasi uguali, il più delle volte. Ad esempio, se si dispone di una classe di prodotto e si desidera esporre una proprietà che accetta alcune proprietà esistenti nella classe di prodotto e esegue alcuni calcoli, quindi la espone. Va bene nel senso che, la logica di creare quella proprietà rimane con la classe.

Ora, potrebbe sorgere la domanda: dove adattare la propria classe di livello aziendale. Preferisco usare una classe di livello aziendale che abbia una logica per affrontare i problemi aziendali. Ad esempio, nell'esempio del tuo prodotto, un problema aziendale potrebbe essere l'addebito di denaro tramite fornitori di terze parti come paypal.

Una cosa fondamentale da ricordare è che un'entità avrebbe sempre un'identità ma un oggetto business è un'entità senza un'identificazione. Ad esempio, il prodotto è un'entità ma il denaro non avrebbe un'identità. 1000 diversi tipi di denaro sarebbero gli stessi.


Sì. Se la logica aziendale della proprietà dipende tutto dalle proprietà esistenti sullo stesso modello, sarebbe meglio aggiungere semplicemente la proprietà nel modello. Ciò contribuirebbe a perdere la coppia non necessaria con il livello aziendale per le proprietà calcolate.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.