Una parte del mio programma recupera i dati da molte tabelle e colonne nel mio database per l'elaborazione. Alcune colonne potrebbero essere null
, ma nel contesto di elaborazione corrente è un errore.
Questo dovrebbe "teoricamente" non accadere, quindi se lo fa punta a dati errati oa un bug nel codice. Gli errori hanno diverse gravità, a seconda del campo che è null
; Ad esempio, per alcuni campi l'elaborazione deve essere interrotta e qualcuno deve essere informato, per altri l'elaborazione deve essere autorizzata a continuare e basta avvisare qualcuno.
Esistono validi principi di architettura o di progettazione per gestire le voci di null
rare ma possibili?
Le soluzioni dovrebbero essere implementabili con Java ma non ho usato il tag perché ritengo che il problema sia in qualche modo indipendente dal linguaggio.
Alcuni pensieri che ho avuto io stesso:
Uso di NOT NULL
Il modo più semplice sarebbe utilizzare un vincolo NOT NULL nel database.
Ma cosa succede se l'inserimento originale dei dati è più importante di questa fase di elaborazione successiva? Quindi, nel caso in cui l'inserto inserisse un null
nella tabella (o a causa di bug o forse anche qualche ragione valida), non vorrei che l'inserimento fallisse. Diciamo che molte altre parti del programma dipendono dai dati inseriti, ma non da questa particolare colonna. Quindi preferirei rischiare l'errore nella fase di elaborazione corrente invece della fase di inserimento. Ecco perché non voglio usare un vincolo NOT NULL.
Naively in base a NullPointerException
Potrei semplicemente usare i dati come se mi aspettassi che fosse sempre lì (e dovrebbe essere proprio così) e catturare gli NPE risultanti a un livello appropriato (ad esempio, in modo che l'elaborazione della voce corrente si fermi ma non il l'intero processo di elaborazione). Questo è il principio del "fail fast" e spesso lo preferisco. Se si tratta di un bug, almeno ricevo un NPE registrato.
Ma poi perdo la capacità di distinguere tra vari tipi di dati mancanti. Per esempio. per alcuni dati mancanti potrei lasciarlo fuori, ma per altri l'elaborazione dovrebbe essere interrotta e un amministratore notificato.
Verifica null
prima di ogni accesso e generazione di eccezioni personalizzate
Le eccezioni personalizzate mi consentono di decidere l'azione corretta in base all'eccezione, quindi questa sembra la strada da percorrere.
Ma cosa succede se dimentico di controllarlo da qualche parte? Inoltre ho ingombrato il mio codice con controlli null che non sono mai o raramente previsti (e quindi sicuramente non fanno parte del flusso della logica di business).
Se scelgo di andare in questo modo, quali sono i modelli più adatti per l'approccio?
Qualsiasi pensiero e commento sui miei approcci sono i benvenuti. Anche migliori soluzioni di qualsiasi tipo (schemi, principi, migliore architettura del mio codice o modelli ecc.).
Modifica
C'è un altro vincolo, in quanto sto usando un ORM per fare il mapping dal DB all'oggetto di persistenza, quindi fare controlli nulli su quel livello non funzionerebbe (dato che gli stessi oggetti sono usati in parti dove il null non fa alcun danno). Ho aggiunto questo perché le risposte fornite finora hanno menzionato questa opzione.