SQLAlchemy e DDD: è il proprio schema?

1

Durante la lettura di "Pattern, principi e pratiche del Domain-Driven Design" di Nick Tune; Scott Millett (certamente non il primo libro su DDD che ho letto) Ho iniziato a capire l'utilizzo dei pattern EAA di Martin Fowler con DDD e con che è arrivata una domanda.

Un singolo modello SQLAlchemy è come Active Record (se ho capito bene), tuttavia, un insieme di modelli SQLAlchemy è molto bravo a sottrarre il meccanismo di persistenza, quindi ho sempre pensato al seguente modello di dominio , degradando in alcuni punti il modello di dominio anemico.

In molti casi ci sono ancora Transaction Scripts , che toccano diverse Entità. Sto cercando di mantenerli in azioni / servizi (Service Layer?) Perché è sbagliato avere azioni che toccano più modelli nelle stesse classi del modello (possono verificarsi dipendenze circolari) a meno che non siano subordinate (giacciano più in basso nella struttura aggregata). / p>

Il risultato non è un modello puro (poiché la logica aziendale è tra "azioni" e "record attivi") - più simile a un qualche tipo di ibrido di quelli menzionati sopra - ma funziona in pratica, acquisisce conoscenza del dominio (sia verbi e nomi) bene, si adatta naturalmente alla persistenza di SQLAlchemy.

Quale modello i modelli SQLAlchemy (in modalità ORM) rappresentano naturalmente e in che modo le operazioni, che toccano diversi modelli, possono essere adattate al modo DDD? C'è qualcosa che posso migliorare su quanto descritto sopra?

Per chiarire di più, questo domanda e le sue risposte si occupa di un altro dilemma simile nello spirito: se utilizzare le classi ORM direttamente per il modello di dominio o aggiungere un altro livello (e la risposta preferita non è l'overarchitect).

In questa domanda, sto cercando di trovare un buon modo per posizionare comportamenti multi-entità. La mia opinione è che i moduli "azione" / "servizio" con funzione per azione siano il posto giusto (in Python è usuale usare le funzioni a livello di modulo quando non c'è uno stato condiviso).

    
posta Roman Susi 12.07.2018 - 17:37
fonte

2 risposte

4

Questo è un problema comune e la causa è in genere correlata a una comprensione superficiale del DDD. Lo scopo di DDD è quello di modellare i requisiti funzionali del tuo sistema in modo tale che il risultato sia un'astrazione utile delle regole fondamentali del tuo dominio aziendale . Spesso gli sviluppatori non capiscono perché questo è importante e creano un modello di dominio quasi direttamente mappato dal loro modello di persistenza. Poiché i dati sono di solito un punto di partenza inadeguato per modellare i requisiti funzionali di un sistema, questo di solito si tradurrà in un sistema altamente accoppiato in cui le regole sono prive di contesto (e quindi inutili).

Durante la creazione di un modello di dominio, i requisiti aziendali dovrebbero essere l'obiettivo assoluto. Ciò significa spesso che i modelli di dominio più utili vengono creati prima per la memorizzazione / correlazione / normalizzazione dei dati coinvolti. Dovresti cercare di mantenere il tuo livello di persistenza (modello fisico) il più liberamente possibile nel tuo modello di dominio. Questo è l'intero punto di un'architettura a strati giusto?

Anche se sono d'accordo con la sensibilità espressa nel link che hai fornito, è semplicemente una scelta di design scadente per dare al tuo necessariamente modello di persistenza anemica (ORM) la responsabilità di essere il tuo modello di dominio. Un ORM è uno strumento non una soluzione, e non qualcosa di cui il tuo dominio dovrebbe essere a conoscenza in qualsiasi modo, forma o forma (non deve sapere né preoccuparsi se / come è persistito).

Tu stesso, hai già iniziato a imbattersi nei problemi di mescolare i due. Usando il tuo modello di persistenza come modello di dominio, ti impedisce di modellare correttamente i processi aziendali che dipendono dai dati di due entità (chiaramente i dati in questo caso dovrebbero essere combinati in una singola entità di dominio) . Questo è precisamente il motivo per cui i due non funzionano. La tua applicazione è andare a devolvere in un sistema in cui i tuoi "modelli" sono semplicemente sacchi di dati che vengono passati come argomenti a "regole / processi". Questa separazione di dati e comportamenti è fondamentalmente di natura procedurale, non OOP, e certamente non DDD.

    
risposta data 12.07.2018 - 20:50
fonte
0

Un articolo con molti argomenti per cui DM dovrebbe essere separato da PM (modello di persistenza):

link di Mehdi Khalili.

Punti salienti citati:

  • PM is a property bag while DM is about business logic and behavior
  • Business logic is far more testable in DM than PM
  • PM looks like database while DM should look like the business domain
  • PM (typically) has dependencies on ORM while DM is POCO
  • PM has DB related constraints while DM is about business rules and constraints
  • PM can enter invalid state while DM should not allow invalid state even temporarily

(POCO - plain old ... object)

    
risposta data 19.08.2018 - 13:43
fonte

Leggi altre domande sui tag