Trattare con i modelli di dominio in continua crescita

1

Posso essere così audace da chiedere (da un punto di vista amatoriale), qual è la strategia generale per affrontare i modelli di dominio potenzialmente in espansione?

A titolo di esempio, ho Staff , e all'inizio potevano semplicemente avere un dipartimento (anche se purtroppo, in realtà, doveva essere un List<Department> perché non è mai così facile, giusto?) Allora andiamo a fare un modulo carpark e ogni membro dello staff potrebbe avere un List<Car> . Ok, non un grosso problema.

Quindi voglio introdurre una specie di schema del flusso di lavoro. Potrei finire con un membro del personale che ha tutta una serie di elementi che devono affrontare. Quindi aggiungo una lista allo staff List<WorkflowItem> ? (Sono sulla buona strada o qualcosa è già andato storto? Sembra già strano, ma da un punto di vista del database questo ha un senso - Ottieni tutti gli oggetti in sospeso per John )

ALLORA, stiamo parlando di un sistema di prenotazione per la serata dei genitori, in cui gli studenti dovrebbero prenotare una fascia oraria con un membro dello staff. Ora sto iniziando a preoccuparmi. Il mio staff avrà davvero una collezione di fasce orarie (probabilmente all'interno di una raccolta di eventi)? Probabilmente no?

Sembra logico che un membro del personale debba avere le proprie auto, ma non tanto le loro prenotazioni. È un punto legittimo di angoscia, o mi manca qualcosa di evidente?

Il punto è, immagino che potrei aggiungerlo, ma dovremmo semplicemente aggiungere le proprietà ad infinitum ?

    
posta Mikustykus 09.11.2018 - 20:52
fonte

2 risposte

6

Certamente puoi progettare il modello come ti proponi, ma alla fine finirai con una (molto) grande palla di fango. Non sei il primo ad incontrare questo problema, ecco perché appaiono concetti come SOA, microservizi e DDD.

L'idea è che le preoccupazioni della tua applicazione possano essere raggruppate in un modo relativamente indipendente l'una dall'altra (servizi). Ad esempio, il fatto che un membro del personale appartenga a uno o più reparti, abbia una macchina e abbia un elenco di elementi del flusso di lavoro, non significa che questi concetti siano necessari in un unico posto per eseguire la logica richiesta.

Il modulo parcheggio deve conoscere i dipartimenti dei membri del personale? e il loro flusso di lavoro? Probabilmente no. E la lista delle macchine? probabilmente sì. Quindi il tuo modulo carpark potrebbe avere un elenco di membri dello staff con le loro macchine, ma non con i loro elementi del flusso di lavoro.

Si noti che un altro servizio potrebbe anche avere un elenco di membri dello staff con altre proprietà. Non si tratta di dati duplicati, perché fondamentalmente condividono gli ID membri del personale, ma non i dati effettivi, semplicemente perché i dati utilizzati da un servizio sono irrilevanti per un altro servizio.

Se segui questo approccio, vedrai che non c'è una singola entità "Staff member" nella tua applicazione. Ogni servizio ha "un pezzo" di membro del personale, una proiezione del tutto che è rilevante in quel contesto. In DDD, diversi contesti limitati potrebbero contenere lo stesso concetto, come "ordine" o "cliente", ma con un significato diverso.

Questo approccio introduce alcune complessità. Ad esempio, consistenza finale. In questa configurazione, un servizio sarà incaricato di creare (assumere?) Ed eliminare (terminando il contratto) dei membri dello staff. Quando ciò accade, questo servizio pubblicherà un evento come StaffMemberHired o StaffMemberContractTerminated. Gli altri servizi ascolteranno questi eventi e agiranno di conseguenza. Ad esempio, il servizio carpark creerà una voce nell'elenco dei membri del personale del parcheggio. Da questo momento, il modulo consentirà a un utente di assegnare un'automobile e un posto auto al nuovo membro dello staff. Quando il modulo carpark riceve l'evento StaffMemberContractTerminated, annulla l'assegnazione dei posti di parcheggio e contrassegna la voce del membro dello staff come terminata, in modo che non sarà più possibile assegnarvi un posto di parcheggio. L'eventuale consistenza implica che esiste la possibilità che per un breve periodo di tempo venga creato un membro dello staff e che non sia ancora disponibile per assegnare un posto auto, o che sia terminato, ma il posto auto è ancora riservato. Queste situazioni sono risolte in tempi molto brevi normalmente.

Questi concetti sono un po 'confusi da comprendere all'inizio e talvolta un po' difficili da applicare, ma risolvono la tua domanda: consentono un dominio in continua crescita, perché in pratica aggiungi nuovi servizi al sistema, invece di aumentare le dimensioni di un singolo modello.

    
risposta data 09.11.2018 - 23:31
fonte
1

I problemi complicati sono complicati. Di solito non c'è modo di risolverlo. Possiamo solo mescolare la complessità in modo che appaia meno complicata: dividere la complessità secondo vari criteri o nascondere una certa complessità dietro un'astrazione.

Per il tuo modello di dominio, potresti notare che domini di problemi diversi come "booking time slot" e "gestione di una flotta di macchine" hanno entità sovrapposte come membri dello staff, ma sono altrimenti completamente separati. Domain Driven Design suggerisce che questi possono essere modellati come "contesti limitati" separati.

  • Nel contesto di prenotazione della fascia oraria possiamo avere un'entità staff che è associata alle fasce orarie disponibili.
  • Nel contesto della gestione della flotta, possiamo avere un'entità driver separata associata a un numero di automobili.

Entrambi questi modelli staff / driver rappresentano lo stesso membro del personale, ma sono modellati separatamente: il modello non è condiviso in tutti i contesti. Invece, traduciamo tra i modelli al limite di contesto. Ciò ti consente di evitare la necessità di una classe diStaff gargantuan% con dozzine di proprietà.

Sebbene ciò renda il modello più semplice perché ogni singolo contesto è ora molto più piccolo e le proprietà non correlate non sono più impigliate tra loro, la complessità complessiva potrebbe essere aumentata perché ora dobbiamo gestire più contesti e più entità che rappresentano lo stesso personale membro - stiamo mescolando la complessità in giro. Devi decidere se valga la pena nel tuo caso.

    
risposta data 09.11.2018 - 23:11
fonte

Leggi altre domande sui tag