DDD Contesti e domini limitati?

16

Ho lavorato in un'applicazione relativamente complessa con 10 di tabelle di database (aggregati, entità / oggetti valore) e applicando DDD. A questo punto sembra essere fondamentalmente DDD-Lite che significa che esistono i servizi di applicazione / dominio, il modello di dominio (entità, oggetti valore) e i repository.

Ho preso un libro Implementando DDD e la prima cosa che menziona è DDD-Lite e contesti limitati e Domain Events mancano come primi errori che sono usuali all'inizio del DDD.

Attualmente ho provato ad organizzare il modello di dominio per le relazioni aggregate e ad usare gli spazi dei nomi per dimostrarlo.

Non riesco a vedere i vantaggi / i crolli relativi alla separazione del progetto del modello di dominio in contesti separati separati (ancora). Forse diventerà più chiaro in seguito, ma mi piacerebbe un po 'di feedback sulla vita reale in contesti limitati (e forse sottodomini, ecc. Se vi si legano).

    
posta lko 04.10.2013 - 19:34
fonte

2 risposte

19

Considera un'azienda che ha diversi dipartimenti:

  • Sviluppo software
  • HR
  • contabile

Riesci a trovare un modello utente che possa rappresentare espressivamente tutte quelle aree aziendali? Pensa a come potrebbe apparire l'entità Utente in ognuno di essi. Forse è diviso in tre diverse entità:

  • Developer
  • dipendenti
  • beneficiario

Lo sforzo di istanziare un utente in ogni contesto è considerevolmente diverso. Forse è qualcosa del genere:

  • nuovo Dipendente (ssn, nome, joindate, dataofbirth, genere)
  • nuovo sviluppatore (dipendente, workstation, credenziali)
  • nuovo beneficiario (dipendente, ruolo)

scusa l'esempio, è difficile illustrare con precisione senza un modello di dominio appropriato per fare riferimento

Se hai utilizzato un'implementazione ingenua e hai utilizzato una singola entità utente, si sarebbe trattato di un modello anemico di dati pieno di getter e setter, perché non si riusciva a rappresentare completamente l'utente dappertutto.

Ci sono confini chiari nell'azienda, quindi è utile modellarli in questo modo. Un utente che accede a un utente in un sistema di gestione stipendi rispetto a un utente che gioca è molto diverso, anche se fa parte dello stesso grande sistema.

Pensando in un altro modo - ora puoi creare il codice di gestione degli sviluppatori per essere molto leggero e indipendente dal resto del tuo sistema. Può usare tipi più precisi con meno bagagli di cui preoccuparsi. È il passo verso la costruzione di sottosistemi più piccoli che possono essere estratti alla sua applicazione.

    
risposta data 04.10.2013 - 20:01
fonte
16

Posso darti un altro esempio. Considera che hai un sistema di e-commerce. Ci sarebbero prodotti lì, tuttavia i prodotti faranno parte di almeno due domini diversi:

  • Catalogo prodotti, dove mantieni la descrizione del prodotto e tutti gli attributi
  • Spazio pubblicitario, in cui è disponibile il livello di scorte del prodotto

Se hai un contesto limitato per entrambi i domini, la tua soluzione può rapidamente diventare una grossa palla di fango perché inizierai a farvi riferimento. Alla fine non avrai più due domini. L'inventario del tuo prodotto sarà rovinato dai riferimenti al catalogo del prodotto e viceversa. Come risultato di ciò, non sarai in grado di cambiare un dominio senza toccarne un altro, anche se ti rendi pienamente conto che non è necessario. I tuoi modelli diventano dipendenti gli uni dagli altri e strettamente accoppiati e dipendenti in modo cattivo, dipendendo dall'implementazione.

Se, tuttavia, hai due contesti limitati, tutte le modifiche che fai in un dominio non influenzeranno l'altra non appena manterrai i canali di comunicazione liberi. Ciò significa che è necessario disporre della duplicazione dei dati, ma questo è il costo minimo da pagare per l'applicazione basata su componenti accoppiati. I tuoi domini possono parlare tra loro usando eventi di dominio. Anche se non hai intenzione di avere un'applicazione basata su SOA all'inizio, sarai in grado di scalare fino a quel livello quando ne hai bisogno con uno sforzo relativamente basso dato che cambi il trasporto per gli eventi del tuo dominio, lasciando intatta l'idea.

Aggiornamento: C'è una buona abilità su SkillsMatter, di Eric Evans. Dà un'analogia della vecchia storia, quando diversi ciechi descrivono un elefante dalla loro prospettiva. Poiché ogni uomo può toccare solo una parte dell'elefante, lo descrivono come un "albero", "muro", "serpente", "corda". E ognuno di questi uomini ha ragione nel loro contesto. Il contesto limitato è il luogo in cui vive il linguaggio ubiquo. Al di fuori del contesto, questi termini potrebbero avere un significato completamente diverso ma all'interno del contesto, la lingua è la stessa su più domini. Greg Young suggerisce vivamente di iniziare a leggere il libro blu dal capitolo 11, poiché qui vengono spiegati i concetti fondamentali più importanti. L'attenzione ai modelli tattici all'inizio del libro rende questo approccio "DDD-light" molto comune, quando le persone smettono di leggere da qualche parte intorno al capitolo 8 e perdono le cose principali, che sono in qualche modo sepolte nella seconda parte.

    
risposta data 08.10.2013 - 23:28
fonte