Alkampfer's Place

Il blog di Gian Maria Ricci
posts - 659, comments - 871, trackbacks - 80

My Links

News

Gian Maria Ricci Mvp Logo CCSVI in Multiple Sclerosis

English Blog

Tag Cloud

Article Categories

Archives

Post Categories

Image Galleries

I miei siti

Siti utili

Domain Driven Design - quando applicarlo

Questo è stato forse il concetto che maggiormente è cambiato nella mia mente dopo il #csddd. Se questa domanda mi fosse stata posta prima del campus, molto probabilmente la risposta sarebbe stata:

Quando ho un dominio complicato, con regole che cambiano spesso.

Questa definizione è in realtà fuorviante, la risposta che darei ora è

Quando sono in un dominio che conosco poco, ho bisogno di sperimentare e voglio principalmente capire il problema che andrò a risolvere.

Quello che cambia è il focus, che sta nel capire il problema, ovvero cercare di comprendere il business che dovremo modellare con il software; focalizzare realmente il dominio del problema per riuscire a capire dove “sta la ciccia” (termine tecnico utilizzato a più riprese da ZioBrando :) ). Non a caso l’UBIQUITOUS LANGUAGE è l’inizio del Blue Book di Evans ed è un concetto assolutamente non tecnico, un unica lingua con cui far comunicare chi deve realizzare il software, con gli esperti di dominio senza ambiguità.

In sostanza l’UBIQUITOUS LANGUAGE serve a far si che quando io parlo con l’esperto di dominio e dico “Quando assegno una spada ad un Mago questo deve essere impedito perché i Maghi non possono usare spade, a meno che il Mago non stia utilizzando un oggetto magico, che gli permetta l’uso di armi normalmente a lui non permesse”, stiamo parlando entrambi degli stessi concetti. Lo scopo dell’UBIQUITOUS LANGUAGE è far si che il significato dei termini in neretto sottintendano lo stesso concetto per l’esperto di dominio e per i tecnici. Non è assolutamente necessario che nel codice esista per forza una classe Mago (potrebbe non esistere o ancora più comunemente ne esisteranno molte), ma è necessario che entrambe le parti pensino allo stesso concetto reale quando sentono i termini Spada o Mago.

Un altro concetto molto importante è quello di cercare di sviscerare le parti che non si conoscono. Quando si decide da dove iniziare a ragionare con gli esperti di dominio, la scelta deve cadere nelle parti che conosciamo di meno, sia perché potenzialmente nascondono i rischi maggiori, ma anche perché partendo da un livello basso di conoscenza, con poco abbiamo già un grande vantaggio.

Quindi possiamo affermare che l’approccio del DDD primariamente mira a creare una consapevolezza/conoscenza comune del problema allo scopo di annullare le ambiguità e permettere una graduale esplorazione delle possibili soluzioni.

Gian Maria.

Print | posted on mercoledì 7 settembre 2011 16:39 |

Feedback

Gravatar

# re: Domain Driven Design - quando applicarlo

è una visione che non condivido.
temo che un'impostazione di questo tipo sia figlia di una delle peculiarità del libro di Evans.
l'obiquitous language (OL) a mio avviso non è DDD in senso stretto.
mi spiego meglio: in genere leggendo il libro di Evans "sembra" che l'OL sia una caratteristica specifica del DDD, ovvero che dove c'è OL c'è DDD.
in realtà a mio avviso è vero il contrario: dove c'è DDD c'è OL.
ma non è affatto detto appunto che dove ci sia OL c'è necessariamente DDD.
la frase su cui hai virato per come la vedo io è applicabile al DDD ma non solo, ergo il DDD è certamente applicabile in quegli scenari, ma non necessariamente è l'unico approccio.
ultimamente ho letto molto circa BDD, specification by example, ecc., e ho maturato l'oidea che l'OL non sia altro che un dei tanti tasselli che aiutano e sorreggono le attività di elicitazione dei requisiti, ovvero quel complesso meccanismo di interazione fra individui che prova ad individuare il contesto del problema, le due boundary e i suoi attori.
personalmente la mia definizione di DDD è molto banalmente (ma non poi molto) la stessa definizione che Evans ci suggerisce sin dalla copertina del libro: mettere in conto la complessità.
in questa accezione diventa mandatorio un OL, nel senso che nel momento in cui esiste complessità non c'è altra strada di descriverla se non attraverso una qualche tecnica di elicitazione.
ma d'altra parte se non fossimo in presenza di una certa complessità probabilmente non adotterei DDD, ma cmq adotterei una o più tecniche di elicitazione, tra cui OL (ma anche specification by example o altri ancora).
il fatto che OL compaia nel libro di Evans credo porti all'equivoco di cui sopra.
il cambiamento di focus che hai sperimentato, l'ho seprimentato anche io, ma non l'ho legato in alcun modo a DDD, ma al solo "desiderio" di voler spostare l'attenzione alla comprensione del problema.
legare questo "shift di strategia" (semi-cit.) al solo DDD lo reputo un po' limitante, ed è per questo che la tua definizione iniziale la ritengo ad oggi ancora la più valida per individuare gli scenari di adozione di DDD.
insomma, il tuo nuovo paradigma per come la vedo io è un paradigma necessario sempre e comunque (capire e sperimentare), la premessa universale a cui non si dovrebbe mai riununciare, se poi capendo e sperimentando mi accorgo che il dominio è complesso e mutevole, allora non avrei dubbi ad adottare DDD, ma se così non fosse probabilmente volgerei la mia attenzione a pratiche di altro tipo.
07/09/2011 17:39 | Roberto Messora
Gravatar

# re: Domain Driven Design - quando applicarlo

>>In realtà a mio avviso è vero il contrario: dove c'è DDD c'è OL.
>>ma non è affatto detto appunto che dove ci sia OL c'è necessariamente DDD.

Secondo me diciamo la stessa cosa più o meno :), io intendo proprio questo, che non può essistere DDD senza UBIQUITOUS LANGUAGE :), il quale è comunque un paradigma valido per qualsiasi progetto, dato che i peggiori errori nascono dalle incomprensioni, ed avere un linguaggio comune aiuta qualsiasi sia l'approccio scelto.

Se ci scolleghiamo per un po dalla parte più "tecnica" del DDD e ci soffermiamo ai pattern/concetti più importanti che non attengano al lato tecnico, IMHO il focus è molto sul capire il problema. Per questa ragione nella mia mente si è modificata la ragione di applicazione del DDD.

Il che non vuol dire che la definizione originale non abbia una parte di verità, se il dominio è molto semplice, probabilmente ha poco senso approcciare con DDD, anche perchè in caso di domini semplici non ci sta molto da esplorare / capire e quindi le due definizioni non sono mutuamente esclusive ;)

07/09/2011 18:03 | alkampfer@nablasoft.com
Gravatar

# re: Domain Driven Design - quando applicarlo

@ludovicovan: parole sante, diciamo che la prima parte di ddd è solo su carta, e non si parla di classi o altri artefatti, si debbono trovare i requisiti principali prima di fare ogni altra procedura. direi che la frase "stabilire un linguaggio comune" dovrebbe essere l'inizio di tutto, indipendentemente da come poi si proseguirà nello sviluppo.

@nicola: EF è un tool, quindi è trasversale. Quello che fa un ORM è permetterci di colmare il gap con il db e quindi permetterci di rimanere più object oriented (se usi un NO SQL puoi ignorare il problema a priori, se stai facendo un gioco elettronico non hai un db, se stai facendo un software per computi metrici potresti serializzare tutto l'albero del computo e buonanotte, etc). Non penso che Simmons stia dicendo che con EF creiamo modelli che poi riutilizziamo in altri contesti :), ma più che altro che EF ed un ORM in generale ti permettano di concentrarti sul modello concettuale, senza dover preoccuparti degli altri servizi (transazioni, concorrenza, persistenza)

Il BOUNDED CONTEXT (argomento di un prossimo post) rappresenta invece proprio una separazione in uno stesso dominio. Se sto facendo un motore per dungeons and dragons, il concetto di Guerriero assume connotazioni differenti durante:
* un combattimento,
* la gestione del suo inventario
* la sua creazione.

Per questo probabilmente avrò tre classi guerriero, ogniuna nel suo BOUNDED CONTEXT, riducendo la complessità necessaria a manutenere un unica classe Guerriero che fa tutto.
08/09/2011 17:11 | alkampfer@nablasoft.com
Gravatar

# re: Domain Driven Design - quando applicarlo

> diciamo che la prima parte di ddd è solo su carta

Diciamo che la prendo come una battuta...

-LV
08/09/2011 17:45 | LudovicoVan
Gravatar

# re: Domain Driven Design - quando applicarlo

Microsoft ha le idee un po confuse quando parla di ORM, e anche per il domain model secondo me non hanno ben chiaro di cosa si parli.

Il riuso del Domain Model, ovvero del modello è quantomeno difficile, soprattutto in DDD dove si tende comunque a individuare un bounded context ben definito dove è valido l'UL ed il modello, ergo, è difficile che il modello sia riutilizzabile al di fuori del contesto.

Per quanto riguarda EF, solo ora con la code first siamo arrivati ad una versione decente, prima era solamente un "super dataset" :), voglio vedere chi riesce a fare un reale domain model con il designer di EF, ed anche con il code first siamo messi male perchè nativamente le proprietà private non riesci a mapparle (al netto di farsi qualche riga di codice a mano).

Per cui, sempre IMHO, sono daccordo con te, il riuso del domain model è veramente poco credibile. Se riesci a riutilizzare un dominio significa che è troppo generico e poi i costi di manutenzione lievitano, perchè se in uno dei domini cambia una regola di business, devi modificare il modello facendo attenzione a non rompere le logiche degli altri domini in cui lo stai utilizzando... insomma.... l'antitesi del BOUNDED CONTEXT ;)

:)
09/09/2011 12:21 | alkampfer@nablasoft.com
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET