Uno dei problemi che ho con riferimenti null è che potrebbero non essere eccezionali. Nella mia attuale posizione, ci sono pochi requisiti e sei fortunato se vengono seguite le convenzioni. Ciò significa che non essere in grado di gestire una richiesta è un evento frequente e il lancio di un'eccezione è troppo lento (si pensi a milioni di richieste). Sono incaricato di scrivere un'API per gestire queste richieste e sto cercando di decidere come gestire gli errori.
Il nostro codice è scritto in C # e sono un grande fan di LINQ. So che LINQ gestisce questo problema fornendo due metodi "Function ()" e "FunctionOrDefault ()". Restituendo il valore predefinito (di solito nullo), rendiamo molto facile allo sviluppatore spararsi al piede. D'altra parte, lanciare un'eccezione è inaccettabile per noi. C'è anche il pattern "TryParse", ma che non si presta bene alle espressioni lambda.
Recentemente ho scoperto il tipo di opzione in F # e come richiede la gestione esplicita di entrambi i casi Some e None o il tuo assembly non verrà compilato. Questa sembra una soluzione molto migliore per il problema del valore nullo piuttosto che lasciare allo sviluppatore il compito di ricordare di implementare la gestione degli errori.
Potrei implementare un tipo di opzione che non compilerà entrambi e restituirà il valore desiderato a meno che non vengano gestiti entrambi i casi Some e None. Il contratto per la mia implementazione sarebbe simile a questo:
Option<SomeClass> option = new SomeClass { Value = 5 }.ToOption(); // Extension method
int value = option.Some(x => x.Value).None(x => x.Default(25)); // Other helper methods provided as well for None cases.
Quindi la mia domanda è, se ho la possibilità di richiedere una gestione di riferimento null esplicita, ci sono degli svantaggi di questo approccio? Sarebbe meglio attenersi alle convenzioni piuttosto che cercare di risolvere questo problema in anticipo per prevenire futuri bug nascosti?