Che cos'è un dominio?


104

Vedo questo termine molto nel contesto dell'architettura software ("modello di dominio", "progettazione guidata dal dominio" ecc.). L'ho cercato su Google, ma ho tonnellate di definizioni diverse. Quindi cos'è davvero?


12
Sfortunatamente penso che sia una di quelle parole che non ha una definizione chiara e viene spesso utilizzata in contesti ambigui. Dopo averlo visto abbastanza però, ottieni una comprensione. Il mio punto è che non dovresti aspettarti di capirne l'utilizzo anche dopo aver letto tutte le risposte che vedrai qui. Prenderà del tempo.
aaaaaa,

15
@aaaaaa esattamente ... Humpty Dumpty sorrise sprezzante. ... "Quando uso una parola", ha detto Humpty Dumpty, in tono piuttosto sprezzante, "significa esattamente ciò che scelgo per significare, né più né meno."
emory

3
Non penso sia vero che non abbia una definizione chiara. Se guardi la normale definizione di webster, vedi che "una regione su cui viene esercitato il dominio", "una regione distintamente contrassegnata da qualche caratteristica fisica". Definizione simile in matematica - il "dominio" di una funzione. Puoi dividere qualcosa di grande in domini o regioni in base a chi è responsabile di quella regione o in base ad alcuni criteri. Un po 'come un modulo. Quindi un "modello di dominio" (a mio avviso) è un modello con cui puoi lavorare nella logica aziendale della tua app. DDD ha anche a che fare con tipi di "regioni".
Sava B.,

Risposte:


9

La parola "dominio" nel libro Domain Driven Design di Eric Evans ha un significato specifico. È la questione del software.

Evans va oltre. A suo avviso ci sono sottodomini anche con lo stesso software. E questa è la parte del libro che tratta del "Design strategico".

Esistono tre "domini": il dominio principale, il dominio di supporto e il dominio generico. A volte si riferirà a questi come sottodomini.

Evans si preoccupa anche profondamente del vero business alla base del software e il libro non si rivolge solo agli sviluppatori, ma anche agli architetti e ai manager che hanno bisogno di vedere come il software e il business possono lavorare insieme, e questo è ciò di cui si occupa quando discute della progettazione strategica e questi sottodomini.

Quindi, il dominio principale è la parte del software che rappresenta sia il vantaggio competitivo che la "ragion d'essere" del software. È la parte del software che è il motivo per cui un cliente dovrebbe acquistare il software rispetto ad altri software. Di solito, Evans lo vede come il dominio che contiene la più piccola percentuale di codice. Puoi considerarlo il 20% più importante. È la parte che non puoi davvero comprare dallo scaffale e potrebbe essere solo un singolo modulo o componente del software complessivo.

Il dominio di supporto è ancora importante e può essere unico per l'organizzazione ma non è importante quanto il dominio principale. Senza di esso, il software non sarà così prezioso e il nucleo si basa su di esso. Potrebbero essere più moduli nel software che hai scritto tu stesso e che svolgono funzioni importanti ma di supporto al core.

Il dominio generico è il meno personalizzato e in qualche modo la parte meno importante del software. Potresti averlo scritto in casa, ma potrebbe essere più efficiente acquistarlo dallo scaffale o utilizzare un noto software open source. Questa parte del sistema probabilmente non è specifica per il tuo dominio generale, quindi ad esempio se hai un sistema di spedizione che instrada i pacchi o un sistema di cartelle cliniche che gestisce i pazienti, il dominio generico è la parte di questi sistemi che sono comuni e solo semplicemente bisogno di essere lì per funzionare affatto. Questo probabilmente costituisce la maggior parte del sistema in generale, ma non necessariamente.

Dal punto di vista aziendale è importante decidere quale sia il tuo dominio principale e concentrare lì le tue risorse di sviluppo. Evans ha molti video, in particolare sul sito InfoQ, dove spiega questi concetti in modo più dettagliato.

Quindi, mentre parliamo spesso di "dominio" nel software, nel caso di DDD, non è così semplice come potrebbe sembrare.

Dovrei notare che i concetti di DDD non esistono necessariamente nella più ampia comunità di software. Altri sviluppatori, autori e persone del prodotto possono avere idee e definizioni diverse, alcune più sottili e altre meno. Anche altri autori che hanno scritto su DDD potrebbero ripassare questi concetti nel libro di Evans, ma ritengo che i concetti siano ancora utili quando si scrive e si pianifica un progetto software.


1
Ri: il tuo ultimo paragrafo: forse dovremmo trovare un accordo sul dominio principale dello sviluppo del software? Ma, come concordare su cosa sia OOP, o Funzionale o qualsiasi altro termine, penso che Humpty Dumpty abbia vinto molto tempo fa.

@nocomprende no, questi concetti sono specifici di un singolo software specifico in una determinata organizzazione in un determinato momento. Quindi il dominio principale per MSFT Windows sarà diverso a seconda delle condizioni del mercato, delle aspettative dei clienti, ecc.
RibaldEddie

1
Immagino che mi ricordi il vecchio detto: "Ci sono 2 tipi di persone: quelli che dividono le persone in due tipi e quelli che non lo fanno". Ma ... per il secondo tipo di persone ci sarebbe solo un tipo di persone ... - errore indiretto infinito - sistema arrestato

@nocomprende mi dispiace di non aver veramente capito il tuo primo commento: la parte del "concordare" sul dominio principale dello sviluppo del software era uno scherzo.
RibaldEddie,

109

Il dominio è il contesto del mondo reale in cui stai tentando di risolvere un problema utilizzando il software. Ogni dominio è dotato di competenza, vocabolario e strumenti che fanno parte di quel dominio.

Un esempio specifico di un dominio potrebbe essere qualcosa come "la lavorazione automatizzata di parti complesse utilizzando una taglierina rotante ad alta velocità". Il sistema software e hardware che realizza questo è chiamato un mulino a controllo numerico .

Un altro esempio di dominio è il reparto contabilità di una società.

Ulteriore lettura
Contesto limitato di Martin Fowler


4
Sì. Quando leggi "dominio", puoi eventualmente sostituire "(limitato a una certa) area di competenza o preoccupazione".
KlaymenDK,

1
La cosa interessante da tenere a mente è che il dominio del software non ha davvero nulla a che fare con ciò che gli umani stanno cercando di ottenere o che avrebbero capito. Sono sicuro che il semplice computer nella mia macchina sta facendo cose per ottimizzare la combustione di cui non so nulla e, francamente, non mi interessa. Quindi supporre che il software riguardi la prospettiva umana e i desideri è un malinteso molto pericoloso. Ciò potrebbe tornare utile poiché i sistemi software comprendono aree più ampie, con una crescente consapevolezza e capacità di scegliere gli obiettivi. Ehi, aspetta, Asimov non ci ha pensato, tanto tempo fa?

1
@ user251748 - Beh, penso che riguardi gli umani e i processi in cui sono coinvolti, non necessariamente su ciò che le persone capiscono all'istante.
Sipo,

38

Significa semplicemente lo spazio problematico in cui stai lavorando. Ad esempio, se stavi costruendo un sito Web di e-commerce, il tuo dominio sarebbe "e-commerce" e coinvolgerebbe i processi associati alle pratiche di vendita del tuo cliente / azienda. Quindi un modello di dominio sarebbe qualcosa che rappresenti un prodotto o una fattura o un record di spedizione.


7
Ehm, dato che i siti Web hanno domain namesanche conosciuto come domini, penso che dovresti chiarire come stai usando la parola dominio qui.
YetAnotherRandomUser

@YetAnotherRandomUser - Per me, è abbastanza chiaro cosa intendesse. ;)
Sipo,

19

Un dominio è un'area di conoscenza. Può essere considerato come un'attività in cui esistono problemi risolti dal tuo software. ( Wiki , DDD Community )

Eric Evans nel suo libro, usa la spedizione di merci per spiegare cos'è DDD. Nel suo esempio, il dominio è tutto sulla spedizione . Come le merci vengono spostate, gestite, spedite e monitorate ecc. Viene fornito con regole, lingua e processi propri. Questi creeranno modelli di dominio, oggetti, servizi e così via.

Quando crei un'applicazione, avrai una sorta di autorizzazione, proprio come il mondo reale delle spedizioni, non tutti possono accedere ai magazzini. Il modo in cui gli utenti sono autorizzati e le autorizzazioni concesse possono essere al di fuori del dominio , poiché le informazioni potrebbero non essere rilevanti per la spedizione di merci.

In poche parole: un dominio è il luogo in cui fai affari . Se la tua attività è la spedizione di merci, la spedizione sarà il tuo dominio. Se la tua attività consiste nell'autenticare e autorizzare il personale, questo sarà il tuo dominio.


7

Da Domain-Driven Design: affrontare la complessità nel cuore del software , Eric Evans:

Ogni programma software si riferisce ad alcune attività o interessi del suo utente. L'area tematica a cui l'utente applica il programma è il dominio del software.

Il dominio di un programma di prenotazione aerea coinvolge persone reali che salgono su aerei reali.

Il dominio di un programma di contabilità è denaro e finanza.

Il dominio di un sistema di controllo del codice sorgente è lo sviluppo del software stesso.

Il modello di dominio, quindi, è "un'astrazione rigorosamente organizzata e selettiva della" conoscenza nella testa di un esperto di dominio.

Palermo, nel descrivere l'architettura delle cipolle, ha offerto questo riassunto

Al centro vediamo il modello di dominio, che rappresenta la combinazione di stato e comportamento che modella la verità per l'organizzazione.

Fowler, a sua volta, offre

Un modello a oggetti del dominio che incorpora sia comportamento che dati.

Se si stanno esaminando definizioni più recenti, è più probabile che si verifichino riferimenti che il modello di dominio e il modello di dati sono diversi . Non ritengo che un cambiamento di significato tanto quanto un cambiamento di enfasi: modellare i comportamenti (il modo in cui i dati cambiano in risposta a informazioni esterne al modello) ha una complessità e una variazione più ricche rispetto ai diversi modi di scrivere le cose .


Modificherei leggermente la tua definizione dalle attività del mondo reale a ciò che sta facendo il sistema informatico. Ad esempio, "Il dominio di un sistema di controllo del codice sorgente è" - archiviazione e recupero dei file del codice sorgente . I domini sono modellati, non per gestire le cose del mondo reale, ma per facilitare la costruzione e la manutenzione dei sistemi di programmazione. Quindi l'enfasi è su ciò che un computer può fare per facilitare ciò, non su ciò che gli umani possono fare. I raggi X digitali migliorano la sensibilità e l'elaborazione delle immagini del processo a raggi X, non fanno nulla per l'uomo e sarebbero altrettanto utili per la scansione automatica dei bagagli.

2

Dato che probabilmente hai già un'idea di cosa sia il dominio, immagino che il prossimo passo che farai è cercare di definire il sottodominio, il modello di dominio e, soprattutto, il contesto limitato.

Comincio col mettere la mia prospettiva di dominio però.

Dominio

Il dominio è la realtà in cui abitiamo: le sue entità, il loro comportamento, le leggi a cui obbediscono. Esisteva prima di noi e esisterà dopo di noi, in una forma o nell'altra. La sua esistenza non dipende dalla nostra consapevolezza. Gli esperti di marketing presentano nuove funzionalità ed eseguono analisi di mercato, i key account manager comunicano con i clienti, gli sviluppatori di software automatizzano i processi aziendali. Ecco perché il dominio è chiamato spazio Problema.

Sottodomini

DDD implica la decomposizione del dominio in sottodomini, per facilitarne la modellizzazione e la comprensione. Il fatto stesso che tu gestisca un'attività implica che esiste almeno un valore aziendale predominante. Quello con cui guadagni soldi. Quello per cui abbiamo iniziato la nostra attività. Quindi, anche se non conosci una parola come "Dominio principale", è ancora presente. Lo stesso vale per i sottodomini: probabilmente avrai bisogno di una contabilità, risorse umane, supporto tecnico - ma è secondario.

Modello di dominio

Non è necessario modellare i sottodomini estratti nella loro interezza. Esiste un determinato insieme di regole in ogni sottodominio a cui siamo interessati. Un insieme di regole in alcuni sottodomini necessario per ottenere un determinato risultato aziendale è chiamato modello.

Contesti limitati

La cosa più importante è che il contesto limitato è un confine logico.

Quando vengono definiti sia i sottodomini che il dominio principale, è il momento di implementare il codice. Il contesto limitato definisce i confini tangibili dell'applicabilità di alcuni sottodomini. È un'area in cui un certo sottodominio ha senso, mentre gli altri no. Può essere un discorso, una presentazione, un progetto di codice con confini fisici definiti dal manufatto.

Qual è il prossimo?

Se sei interessato a come il concetto di contesto limitato si correla con il concetto di sottodominio, come definire sottodomini e contesti limitati, come rappresentare la loro comunicazione reciproca e come organizzare i team con questi concetti in mente, probabilmente ti interesserebbe questo ulteriori letture .


Direi che un dominio per il software è ciò che fa il software. Certamente non esisteva prima di noi, ed è interamente inventato da noi, per fare le cose che vogliamo delegare in modo che accadano senza la nostra interazione. In altre parole, si tratta di un sogno che abbiamo fatto, che vogliamo dimenticare. E dimentichiamo rapidamente come funziona il software non appena viene distribuito. Il software è un gioco più adatto ai computer da risolvere, l'abbiamo fatto fino ad ora solo perché non avevamo ancora costruito i computer, per risolvere il problema che non vogliamo più essere disturbati. Ma molto presto ...

Non mi sono chiarito in questa parte - "prima di noi", mia cattiva. Non intendevo assolutamente dire che quel dominio esistesse prima della razza umana. Per "noi" intendevo più come uno sviluppatore di software che risolve un problema di automazione, diciamo, dei processi di business nel commercio elettronico. Il concetto di commercio apparentemente esisteva prima di loro. Quindi la responsabilità dello sviluppatore è di rendere possibile delegare le cose ai computer, come hai detto.

Giusto. Il mio punto è che le persone pensano che i sistemi informatici siano un modo per affrontare il mondo reale. Ma i computer portano molte idee, requisiti e preoccupazioni che semplicemente non facevano mai parte del dominio. È come dire che la chirurgia è un modo per affrontare i problemi emotivi. Bene, la lobotomia funziona, ma i problemi emotivi hanno poco a che fare con il cervello. E i miei sentimenti sono fortemente influenzati dagli ormoni e dai neurotrasmettitori, quindi gli SSRI fanno parte della biologia, della psicologia, delle relazioni o sono una categoria a se stessi? I computer riguardano i computer, non le cose reali.

1
I computer riguardano la modellazione di cose reali. Solo un'altra area in cui si potevano fare cose vere, si potevano implementare veri e propri processi aziendali, si potevano applicare veri e propri vincoli aziendali. 50 anni fa avrei pagato $ 1 alla cassa in un negozio, ora l'intero processo di acquisto potrebbe essere senza interazione con l'essere umano. Tuttavia i miei soldi reali sono stati prelevati dal mio conto bancario reale. Quindi non importa cosa sia coinvolto in alcun processo, computer o umano o altro. Probabilmente potrebbe interessarti: medium.com/@wrong.about/…

Il denaro non è reale. I processi aziendali non sono reali. Tutto ciò di cui possiamo parlare è un concetto, non reale.
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.