Ciò che sembra cercare è noto come tipi di tag . Sono un modo per dire "questo è un numero intero che rappresenta l'età" mentre "questo è anche un numero intero ma rappresenta il peso" e "non puoi assegnarne uno all'altro". Nota, questo va oltre le unità fisiche come metri o chilogrammi: potrei avere nel mio programma "altezze della gente" e "distanze tra i punti su una mappa", entrambi misurati in metri, ma non compatibili tra loro da quando si assegnava uno a l'altro non ha senso dal punto di vista della logica aziendale.
Alcune lingue, come Scala supportano i tipi con tag in modo abbastanza semplice (vedi il link sopra). In altri, puoi creare le tue classi wrapper, ma questo è meno conveniente.
Convalida, ad es. verificare che l'altezza di una persona sia "ragionevole" è un altro problema. Puoi inserire tale codice nella tua classe Adult
(costruttore o setter) o nelle classi type / wrapper codificate. In un certo senso, classi built-in come URL
o UUID
soddisfano tale ruolo (tra gli altri, ad esempio fornendo metodi di utilità).
Se l'utilizzo di tipi di tag o classi wrapper contribuirà effettivamente a migliorare il codice, dipenderà da diversi fattori. Se i tuoi oggetti sono semplici e hanno pochi campi, il rischio di assegnarli erroneamente è basso e il codice aggiuntivo necessario per utilizzare i tipi di tag potrebbe non valerne la pena. In sistemi complessi con strutture complesse e molti campi (specialmente se molti di essi condividono lo stesso tipo primitivo), potrebbe essere utile.
Nel codice che scrivo, spesso creo classi wrapper se passo le mappe. Tipi come Map<String, String>
sono molto opachi da soli, quindi avvolgerli in classi con nomi significativi come NameToAddress
aiuta molto. Ovviamente, con i tipi di tag, potresti scrivere Map<Name, Address>
e non è necessario il wrapper per l'intera mappa.
Tuttavia, per tipi semplici come Stringhe o Interi, ho trovato che le classi wrapper (in Java) sono troppo fastidiose. La regolare logica di business non era poi così male, ma sono sorti diversi problemi con la serializzazione di questi tipi su JSON, il loro mapping su oggetti DB, ecc. È possibile scrivere mapper e hook per tutti i framework di grandi dimensioni (es. Jackson e Spring Data), ma il lavoro extra e la manutenzione relativi a questo codice compenseranno tutto ciò che si ottiene usando questi wrapper. Ovviamente, YMMV e in un altro sistema, la bilancia potrebbe essere diversa.