What are general guidelines or rules of thumb for when to use a domain-speciifc object vs a plain String or number?
La linea guida generale è che desideri modellare il tuo dominio in una lingua specifica del dominio.
Considera: perché usiamo l'intero? Possiamo rappresentare tutti gli interi con stringhe altrettanto facilmente. O con i byte.
Se stessimo programmando in un linguaggio agnostico di dominio che includesse tipi primitivi per l'intero e età, quale sceglieresti?
In realtà, la natura "primitiva" di certi tipi è un incidente della scelta del linguaggio per la nostra implementazione.
I numeri, in particolare, di solito richiedono un contesto aggiuntivo. L'età non è solo un numero ma ha anche dimensioni (tempo), unità (anni?), regole di arrotondamento! L'aggiunta di età ha senso in un modo che non aggiunge un'età a un denaro.
Rendere i tipi distinti ci permette di modellare le differenze tra un indirizzo email non verificato e indirizzo email verificato .
L'incidente di come questi valori sono rappresentati in memoria è una delle parti meno interessanti. Il modello di dominio non interessa un CustomerId
è un int, o una stringa, o un UUID / GUID o un nodo JSON. Vuole solo le affordances.
Ci interessa davvero se gli interi sono big endian o little endian? Ci interessa se il List
che ci è stato passato è un'astrazione su un array o un grafico? Quando scopriamo che l'aritmetica a doppia precisione è inefficiente e che è necessario passare a una rappresentazione in virgola mobile, dovrebbe interessare il modello di dominio ?
Parnas, nel 1972 , ha scritto
We propose instead that one begins with a list of difficult design decisions or design decisions which are likely to change. Each module is then designed to hide such a decision from the others.
In un certo senso, i tipi di valore specifici del dominio che introduciamo sono moduli che isolano la nostra decisione su quale debba essere utilizzata la rappresentazione sottostante dei dati.
Quindi il lato positivo è la modularità: otteniamo un design in cui è più facile gestire l'ambito di un cambiamento. Il lato negativo è il costo: è più lavorare per creare i tipi personalizzati di cui hai bisogno, la scelta dei tipi corretti richiede l'acquisizione di una comprensione più approfondita del dominio. La quantità di lavoro richiesta per creare il modulo valore dipenderà dal tuo dialetto locale di Blub .
Altri termini nell'equazione potrebbero includere la durata prevista della soluzione (una modellazione attenta per lo script che verrà eseguito una volta che il rendimento dell'investimento è scadente), quanto il dominio è vicino alla competenza principale dell'azienda.
Un caso speciale che potremmo considerare è quello della comunicazione attraverso un confine . Non vogliamo trovarci in una situazione in cui le modifiche a un'unità schierabile richiedono modifiche coordinate con altre unità schierabili. Quindi messaggi tendono a concentrarsi maggiormente sulle rappresentazioni, senza considerare invarianti o comportamenti specifici del dominio. Non tenteremo di comunicare "questo valore deve essere strettamente positivo" nel formato del messaggio, ma piuttosto di comunicare la sua rappresentazione sul filo e applicare la convalida a quella rappresentazione al limite del dominio.