O problema central do NULL é que ele torna o sistema não confiável. Em 1980, Tony Hoare, no jornal dedicado ao seu Prêmio Turing, escreveu:
E assim, o melhor dos meus conselhos para os criadores e designers da ADA foi ignorado. ... Não permita que esse idioma em seu estado atual seja usado em aplicações onde a confiabilidade é crítica, como centrais nucleares, mísseis de cruzeiro, sistemas de alerta precoce, sistemas de defesa antimísseis de mísseis. O próximo foguete a se desviar como resultado de um erro de linguagem de programação pode não ser um foguete espacial exploratório em uma viagem inofensiva a Vênus: pode ser uma ogiva nuclear explodindo em uma de nossas próprias cidades. Uma linguagem de programação não confiável que gera programas não confiáveis constitui um risco muito maior para o meio ambiente e para a sociedade do que carros inseguros, pesticidas tóxicos ou acidentes em usinas nucleares. Seja vigilante para reduzir o risco, não para aumentá-lo.
A linguagem ADA mudou muito desde então, no entanto, esses problemas ainda existem em Java, C # e em muitas outras linguagens populares.
É dever do desenvolvedor criar contratos entre um cliente e um fornecedor. Por exemplo, em C #, como em Java, você pode usar Generics
para minimizar o impacto da Null
referência, criando somente leitura NullableClass<T>
(duas Opções):
class NullableClass<T>
{
public HasValue {get;}
public T Value {get;}
}
e depois use-o como
NullableClass<Customer> customer = dbRepository.GetCustomer('Mr. Smith');
if(customer.HasValue){
// one logic with customer.Value
}else{
// another logic
}
ou use duas opções de estilo com métodos de extensão C #:
customer.Do(
// code with normal behaviour
,
// what to do in case of null
)
A diferença é significativa. Como cliente de um método, você sabe o que esperar. Uma equipe pode ter a regra:
Se uma classe não for do tipo NullableClass, sua instância não deve ser nula .
A equipe pode fortalecer essa idéia usando Design por contrato e verificação estática no momento da compilação, por exemplo, com pré-condição:
function SaveCustomer([NotNullAttribute]Customer customer){
// there is no need to check whether customer is null
// it is a client problem, not this supplier
}
ou para uma string
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
}
Essa abordagem pode aumentar drasticamente a confiabilidade do aplicativo e a qualidade do software. Design by Contract é um caso da lógica Hoare , que foi preenchida por Bertrand Meyer em seu famoso livro de construção de software orientado a objetos e na linguagem Eiffel em 1988, mas não é usado de maneira inválida na criação de software moderna.