Quindi sto lavorando a un prodotto software in cui abbiamo un numero di campi che il cliente può lasciare vuoto, alcuni dei quali sono numerici. Per persistere nel database utilizziamo colonne nullable. Facile pisello.
Sto considerando l'utilità di un modello di dominio orientato agli oggetti e una cosa che mi infastidisce è il problema dei campi nullable.
La ragione è che nel mondo di Java e C # si trova spesso il consiglio di non avere valori nulli e, in effetti, scrivere codice con controlli nulli su tutto il posto fa schifo. E quindi si ottengono eccezioni di riferimento null quando si dimentica di verificare la presenza di null. Ed è un casino. Quindi un approccio "buono" è quello di inizializzare tutto quando lo si dichiara.
Ora, l'idea di null ha effettivamente senso per questi campi ... il cliente non ha inserito un valore quindi ha valore "no" (non 0, non -1, ecc.). Ma i programmatori di applicazioni e i linguaggi di programmazione sembrano essere configurati per la logica binaria piuttosto che per quella ternaria, e anche per le variabili si meritano di avere un valore piuttosto che avere un valore ma forse anche no.
Con il design orientato agli oggetti presumo che si possa inventare un sistema intelligente di rappresentare casi in cui non c'è valore "no" ma personalmente non ho ancora fatto l'analisi e il motivo è che trovo che il cambiamento incrementale vende di più alla gente di quanto non facciano i cambiamenti radicali, quindi proporre un modello di dominio orientato agli oggetti che sia "troppo orientato agli oggetti" potrebbe uccidere l'idea e quindi le mie speranze di migliorare la struttura del nostro software. Preferirei proporre un modello di dominio "versione 0" che funzioni ed è facile da vendere internamente ... e quindi tutto ciò che riguarda i valori nulli ha un peso nella mia mente.
Dato che stiamo usando C #, potrei semplicemente definire numeri nullable, ma è molto semplice aggiungere un punto interrogativo. Ma non sono convinto che solo perché è possibile è anche l'approccio migliore.
Quindi, con tutta questa spazzatura di fondo la mia domanda è la seguente: in che modo la vostra azienda ha gestito valori "inesistenti" in un modello di dominio orientato agli oggetti, in che modo l'avete trovato efficace e in che modo avete trovarlo inefficace?
I miei criteri di selezione per la "risposta" saranno quelli che sembrano più "vendibili" come definiti nella spazzatura di sfondo. Ma davvero mi piacerebbe vedere che cosa le persone escano e imparare alcune cose nuove così ogni risposta con qualche pensiero dietro di essa riceverà un upvote da me.
Nota: ho visto altre discussioni sui valori nulli in altri thread ma nulla che si allinea abbastanza con ciò di cui voglio parlare, quindi una nuova domanda.
MODIFICA: l'ambito della mia domanda include proprietà tipizzate come i numeri. Quindi in C # un modo per consentire la rappresentazione di un prezzo di acquisto nullo sarebbe dichiarare "PurchasePrice" come "decimale?" che è il tipo decimale annullabile. Vedo solo una serie di svantaggi ai numeri (ad esempio) che possono anche essere nulli, quindi sto cercando un'alternativa.
EDIT 2: Il pattern Null Object ha senso per i riferimenti e l'uso di un tipo nullable per i valori appare come se fosse trattabile con coalescenza. Ciò che mi infastidisce nel coalescing di tipi nulli è "cosa succede se qualcuno dimentica di coalizzarsi e siamo esposti a un'eccezione di riferimento null?" ... e suppongo che potrei forse usare uno strumento di analisi statica che assicura che la coalescenza sia usata dove ci si aspetta che placare questa preoccupazione.
EDIT 2 ': In un certo senso, se qualcuno ha preso una decisione consapevole di rendere nullable un campo, aggiunge la capacità di rappresentare un'informazione aggiuntiva che altrimenti avrebbe bisogno di un altro campo per rappresentarla come un valore booleano HasValue. Ciò significa che gli zeloti "anti-null" che ho incontrato in passato erano forse errati, e l'uso misurato della nullità può di fatto migliorare un design?