Null, pra que te quero?

Utilizando objetos mais significativos para representar a ausência de valor.

O Null Pattern, também conhecido como Active Nothing, é um padrão onde criamos classes para representar a ausência de valor, ou seja, utilizamos objetos ao invés de null.

Qual é o problema do null?

Toda vez que passamos ou retornamos null, precisamos espalhar vários testes pelo nosso sistema para checar se o valor contém alguma coisa antes de ser utilizado:

Testes não resolvem o problema?

Hoje em dia costumamos escrever testes automatizados, o que diminui a possibilidade de introduzir erros por causa do null, mas ainda somos obrigados a poluir o código com essas checagens de "is_null", "isset", "empty", etc.

PHP 7 com tipagem rigorosa

No PHP 7, se quisermos definir os tipos de retornos dos métodos e ativar a flag strict types para checar os tipos rigorosamente, não conseguimos retornar null no lugar de outro tipo.

1. Falhar Rapidamente

Falhar rapidamente é lançar uma exceção assim que for detectado um valor null, tratando essa exceção no cliente que invoca o método:

2. Padrão do “Talvez”

Outra alternativa é criar ou utilizar uma biblioteca que implemente o Maybe Pattern. A ideia deste padrão é encapsular o acesso ao método ou propriedade em um objeto do tipo “talvez”. Esse objeto retorna o valor do método ou propriedade somente se não for null, caso contrário, retorna o valor pré-determinado.

3. Padrão do Objeto Nulo

A ideia deste padrão é que nada é alguma coisa. Precisamos representar essa ausência de valor de alguma forma mais significativa, criando uma classe que representa a ausência de valor.

Exemplo de Aplicação

No exemplo abaixo, um usuário pode ou não pagar por uma assinatura em um site. Caso ele seja um assinante, a assinatura é associada com o seu perfil, caso contrário, ela simplesmente tem o valor null:

Alternativamente, poderíamos criar uma interface que as duas classes implementam, ao invés da classe AssinaturaGratuita estender de Assinatura.
Todos os "if ($assinatura)" foram removidos, e agora chamamos $this->assinatura diretamente sem medo.

Formas de Implementar a Classe Nula

Para implementar o padrão, é importante considerar como isso será feito: se você prefere criar uma interface e fazer ambas as classes implementarem-na ou se fará a classe nula estender a original, ou vice-versa:

Conclusão

Utilizar objetos nulos é uma ótima forma de reduzir a complexidade do nosso código e tornar o nosso trabalho mais feliz.

Referências

Written by

Software development nerd. In 💙 with Ruby, PHP, JavaScript, Crystal, and other techy stuff.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store