Il modo ideale per gestire i puntatori nulli è vietarli per contratto se un metodo non può gestirli. Dipende dal linguaggio quanto bene è supportato:
- In Java, puoi utilizzare l'annotazione
javax.validation.constraints.NotNull
(o simili fornite da IDE come IntelliJ ed Eclipse) su qualsiasi parametro di metodo che non può essere nullo. Sfortunatamente, questo non è molto portabile.
- In C #, puoi utilizzare contratti di codice : %codice%
- In C ++, puoi usare riferimenti anziché puntatori (ma non appena usi puntatori intelligenti, sei sfortunato)
- In Ada puoi utilizzare un tipo
Contract.Requires( x != null );
.
- Alcuni linguaggi più recenti come Rust vietano i puntatori nulli di progettazione.
In genere, preferisco l'approccio al contratto piuttosto che cercare null in fase di esecuzione, se possibile. Abilita la scoperta degli errori in precedenza. Di solito, il controllo nullo basato su contratto genera anche un controllo di runtime in aggiunta al compilatore che tenta di dedurre se un parametro di una chiamata al metodo può violare il contratto in fase di compilazione.
Affermare che ci si fida del chiamante della propria libreria è una cattiva idea, perché non si sa mai se la libreria sarà riutilizzata in un altro ambiente. La fiducia nei chiamanti nuocerà sempre alla riusabilità del codice.