In DDD, è la logica dell'applicazione di convalida o la logica del dominio?


26

Supponiamo che stiamo modellando un modulo usando DDD; al modulo potrebbero essere associati determinati tipi di regole aziendali - forse dovrai specificare un reddito se non sei uno studente e ti verrà richiesto di elencare i tuoi figli se indichi che sei sposato. E se hai specificato un Paese, allora dovrebbe avere un Paese valido.

Questo tipo di convalida risiede nel dominio o nel livello dell'applicazione? Alcuni altri problemi che stavo prendendo in considerazione:

  • Alcuni framework, come Laravel, forniscono regole di convalida che possono convalidare l'input prima che una richiesta raggiunga il controller. Si rompe DDD se la convalida viene effettuata a quel livello?

  • Per casi come determinare se il paese è valido, di solito cercherò una tabella di database di tutti i paesi del mondo. Tuttavia, in DDD, questo è probabilmente (dalla mia comprensione) da fare a livello di dominio. Il livello di dominio è autorizzato ad accedere al DB o devo usare una ricerca non SQL per determinare un paese valido?

  • È necessario convalidare l'input sia a livello di applicazione che a livello di dominio?


6
La tua domanda presuppone che ci sia sempre un posto giusto per mettere tutto. Non c'è.
Robert Harvey,

1
Cosa dice @RobertHarvey. La convalida dovrebbe essere sempre sul modello, indipendentemente da qualsiasi convalida da parte dell '"applicazione" (il modello non fa parte dell'applicazione?). Qualsiasi convalida nella "applicazione" dovrebbe essere solo una ripetizione della convalida del modello - per migliorare la reattività dell'interfaccia utente o dovrebbe essere correlata solo alla logica "dell'applicazione" (come in: "in questo modulo è possibile solo inserire. .. ", ma stavo assumendo la convalida dell'entità). Non fidarti mai del livello "applicazione" per la convalida del dominio, potrebbe non essere il tuo client a inviare le informazioni ...
Marjan Venema

Risposte:


29

Questo tipo di convalida risiede nel dominio o nel livello dell'applicazione?

Applicazione. Il termine di ricerca magico che desideri è livello anti corruzione

In genere, il messaggio ricevuto dall'applicazione avrà un aspetto di DTO. Il livello anticorruzione in genere crea tipi di valore che il dominio riconoscerà. Il comando effettivo inviato al modello di dominio verrà espresso in termini di tipi di valore convalidati.

Esempio: un comando DepositMoney dovrebbe probabilmente includere un importo e un tipo di valuta. La rappresentazione DTO esprimerebbe probabilmente l'importo come un numero intero e il codice valuta come una stringa. Il livello anticorruzione converte il DTO in un tipo di valore del deposito, che include un importo convalidato (che deve essere non negativo) e un CurrencyCode convalidato (che deve essere uno dei codici supportati nel dominio).

Dopo aver analizzato correttamente il comando in tipi comprensibili al modello di dominio, il comando viene eseguito nel dominio, il quale può comunque rifiutare il comando in quanto violerebbe l'invariante aziendale (l'account non esiste ancora, l'account è bloccato, questo particolare account non è autorizzato a utilizzare quella valuta? ecc.).

In altre parole, la convalida aziendale verrà eseguita nel modello di dominio, dopo che il livello anti corruzione convalida gli input.

L'implementazione delle regole di convalida risiederà normalmente nel costruttore del tipo di valore o all'interno del metodo factory utilizzato per costruire il tipo di valore. Fondamentalmente, si restringe la costruzione degli oggetti in modo che siano garantiti per essere validi, isolando la logica in un posto e invocandola ai limiti del processo.


Perché l'applicazione è la risposta? Secondo il tuo testo, la convalida formale può essere effettuata sia nel dominio o nell'applicazione, sia la convalida aziendale solo nel dominio.
inf3rno

@ inf3rno perché le domande poste specificamente sulla convalida di un modulo, che non è correlato al dominio
timetofly,

1
Questa risposta non ha senso. Il livello anticorruzione di DDD è un codice aggiuntivo che scrivi per tradurre da / verso un modello di dominio esterno (di un altro sistema) e il modello di dominio dell'applicazione basata su DDD. Se non esiste un tale sistema esterno, non esiste un livello anticorruzione. Inoltre, la convalida delle regole di business appartiene al modello di dominio (e al livello di dominio), non al livello di applicazione. Per quanto riguarda i DTO, si tratta di un componente tecnico (nel livello Applicazione) che può esistere o meno in un'app DDD. La conversione tra DTO ed Entità / ValueObjects non ha nulla a che fare con i livelli anticorruzione.
Rogério,

5

Il modello di dominio del problema include le regole aziendali del dominio. Le regole aziendali sono vincoli sugli elementi del modello. Significano che un ascensore non si muove con la porta aperta, che le merci deperibili non vengono caricate in un contenitore non refrigerato e che un ordine annullato non viene spedito.

Ciò non significa che quando il tuo dominio interagisce con gli umani (tramite schermate, moduli, ecc.) Non è necessario che siano convalidati o assistiti. Renditi conto che è facoltativo.

Considerare che esistono due tipi di regole aziendali: - regole di proprietà che limitano gli attributi di un oggetto e regole di collaborazione che limitano l'aggiunta e la rimozione di collaborazioni tra oggetti.

Le regole aziendali sono diverse dalle regole logiche, che sono correlate al linguaggio di programmazione e verificano che i valori siano stati forniti e non siano nulli, ecc.

Nota: in DDD non esiste alcun concetto di "modellazione" del modulo.


0

Lo stato specifico renderebbe non valida l'entità modello? In caso affermativo, il modello deve impedire all'entità di raggiungere quello stato. Ciò significa che il modello deve sapere come convalidare se stesso.

Ma c'è un piccolo problema: la validazione del modello spesso avviene troppo tardi. Spesso, vogliamo fare la convalida in anticipo, quindi l'utente non deve aspettare troppo a lungo. Ecco perché la convalida viene spesso inserita nella logica dell'applicazione.

Per quanto riguarda il contesto di convalida: l'entità non è in grado di eseguire query per ulteriori dati. Ma non dovrebbe importare da dove provengono questi dati. Non importa se proviene da SQL, File o è semplicemente codificato. Ecco perché esistono i repository. Il dominio definisce il tipo di query di cui ha bisogno e consente a qualcun altro di occuparsi dell'implementazione.


-2

Il livello di dominio deve contenere tutta la logica di convalida. Presentazione, livelli anticorruzione o altri livelli dipendenti dovrebbero riflettere questo.

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.