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 si tratta di un errore.
Questo "teoricamente" non dovrebbe accadere, quindi se lo fa punta a dati errati o ad un bug nel codice. Gli errori hanno gravità diverse, a seconda del campo null
; vale a dire che per alcuni campi l'elaborazione dovrebbe essere interrotta e qualcuno notificato, per altri dovrebbe essere consentito il proseguimento e informare qualcuno.
Esistono buoni principi di architettura o design per gestire le null
voci rare ma possibili ?
Le soluzioni dovrebbero essere possibili da implementare con Java ma non ho usato il tag perché penso che il problema sia in qualche modo indipendente dal linguaggio.
Alcuni pensieri che ho avuto me stesso:
Utilizzando NOT NULL
Il più semplice sarebbe usare 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 a null
nella tabella (o a causa di bug o forse anche per qualche motivo valido), non vorrei che l'inserimento fallisse. Diciamo che molte più parti del programma dipendono dai dati inseriti, ma non da questa particolare colonna. Quindi preferirei rischiare l'errore nella fase di elaborazione corrente anziché nella fase di inserimento. Ecco perché non voglio usare un vincolo NOT NULL.
Ingenuamente a seconda di NullPointerException
Potrei semplicemente usare i dati come se mi aspettassi che fossero sempre lì (e questo dovrebbe davvero essere il caso) e catturare gli NPE risultanti a un livello appropriato (ad esempio in modo che l'elaborazione della voce corrente si interrompa ma non l'intero progresso dell'elaborazione ). Questo è il principio "fail fast" e spesso lo preferisco. Se è un bug almeno ottengo un NPE registrato.
Ma poi perdo la capacità di distinguere tra vari tipi di dati mancanti. Ad esempio per alcuni dati mancanti potrei lasciarli fuori, ma per altri il trattamento dovrebbe essere interrotto e un amministratore informato.
Verifica null
prima di ogni accesso e genera eccezioni personalizzate
Eccezioni personalizzate mi consentirebbero 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, ingombro il mio codice con controlli null che non sono mai o raramente previsti (e quindi sicuramente non fanno parte del flusso della logica aziendale).
Se scelgo di andare in questo modo, quali schemi sono più adatti all'approccio?
Eventuali pensieri e commenti sui miei approcci sono i benvenuti. Anche soluzioni migliori di qualsiasi tipo (schemi, principi, migliore architettura del mio codice o modelli ecc.).
Modificare:
C'è un altro vincolo, in quanto sto usando un ORM per eseguire il mapping dal DB all'oggetto di persistenza, quindi fare controlli null a quel livello non funzionerebbe (poiché gli stessi oggetti sono usati in parti in cui il null non fa alcun danno) . Ho aggiunto questo perché le risposte fornite finora hanno entrambe menzionato questa opzione.