Le problème central de NULL est qu’il rend le système peu fiable. En 1980, Tony Hoare dans le journal dédié à son prix Turing écrivait:
Ainsi, le meilleur de mes conseils aux concepteurs et concepteurs d’ADA a été ignoré. … Ne laissez pas cette langue dans son état actuel être utilisée dans des applications où la fiabilité est essentielle, telles que les centrales nucléaires, les missiles de croisière, les systèmes d'alerte précoce, les systèmes de défense antimissile antiballistique. La prochaine fusée à s'égarer à la suite d'une erreur de langage de programmation risque de ne pas être une fusée spatiale exploratoire lors d'un voyage inoffensif à Vénus: il peut s'agir d'une tête nucléaire qui explose dans l'une de nos propres villes. Un langage de programmation peu fiable générant des programmes non fiables constitue un risque bien plus grand pour notre environnement et notre société que les voitures non sécurisées, les pesticides toxiques ou les accidents survenus dans les centrales nucléaires. Soyez vigilant pour réduire le risque, ne pas l'augmenter.
Le langage ADA a beaucoup changé depuis, mais de tels problèmes persistent en Java, en C # et dans de nombreux autres langages populaires.
Les développeurs ont le devoir de créer des contrats entre un client et un fournisseur. Par exemple, en C #, comme en Java, vous pouvez Generics
réduire l’impact de la Null
référence en créant en lecture seule NullableClass<T>
(deux options):
class NullableClass<T>
{
public HasValue {get;}
public T Value {get;}
}
et ensuite l'utiliser comme
NullableClass<Customer> customer = dbRepository.GetCustomer('Mr. Smith');
if(customer.HasValue){
// one logic with customer.Value
}else{
// another logic
}
ou utilisez deux styles avec les méthodes d'extension C #:
customer.Do(
// code with normal behaviour
,
// what to do in case of null
)
La différence est significative. En tant que client d'une méthode, vous savez à quoi vous attendre. Une équipe peut avoir la règle:
Si une classe n'est pas de type NullableClass, son instance ne doit pas être nulle .
L’équipe peut renforcer cette idée en utilisant Conception par contrat et vérification statique au moment de la compilation, par exemple avec les conditions préalables suivantes:
function SaveCustomer([NotNullAttribute]Customer customer){
// there is no need to check whether customer is null
// it is a client problem, not this supplier
}
ou pour une ficelle
function GetCustomer([NotNullAndNotEmptyAttribute]String customerName){
// there is no need to check whether customerName is null or empty
// it is a client problem, not this supplier
}
Cette approche peut considérablement augmenter la fiabilité des applications et la qualité du logiciel. Design by Contract est un cas de logique Hoare , qui a été peuplé par Bertrand Meyer dans son célèbre livre Construction de logiciels orientés objet et en langage Eiffel en 1988, mais il n’est pas utilisé de manière non valide dans l’élaboration de logiciels modernes.