segunda-feira, 6 de novembro de 2017

Programação defensiva com Decorator: simplificando a verificação de nulos.

Olá, pessoal!

Muitas vezes nos deparamos sempre com os mesmos problemas simples e não paramos para pensar em como resolvê-los de forma mais eficiente. Já dei um exemplo assim aqui no blog de como um problema simples pode ter inúmeras soluções diferentes.

Agora, que tal aprender a fazer um:


Apenas instanciando a mesma classe?

Problema


Vamos começar então. Imaginamos que tenhamos uma classe de nome Pessoa e que ela tenha um parâmetro nome:



E agora você deseja que o nome não seja nulo. Usualmente, a dúvida de muitos desenvolvedores é se o if será colocado no construtor, no set ou ainda em alguma classe de serviço responsável por criar pessoas.

Então, não é comum terminarmos com uma solução assim:



Se depois aparecer um objeto Endereco, será a mesma coisa. Se aparecer um objeto Rua, será a mesma coisa. Ainda que apareça um parâmetro novo para Pessoa, como um sobrenome, teremos o mesmo caso. Logo verá que o código ficará bem repetitivo:



Sendo que tudo que queremos, afinal, é garantir que nome, sobrenome e cidade não sejam nulos.

Alternativa


Como alternativa, se não queremos objetos nulos, podemos criar um objeto NotNull, desta maneira:



Esta classe usa generics, permitindo aceitar qualquer tipo de objeto como parâmetro e fazendo a esperada condição de verificar se o objeto é nulo.

Desta maneira, podemos simplificar nossa classe Pessoa, fazendo com que ela receba nome, sobrenome e cidade não nulos, determinando isto já no contrato da classe Pessoa:



E para instanciar uma classe Pessoa, basta:



Podemos também criar outras classes de verificação: NotEmpty, NotNegative (para números), ValidDate (para parse de datas), etc, e podemos combinar várias delas umas com as outras. Por exemplo, você pode querer que nome não seja nulo, não seja vazio e não contenha caracteres especiais, resultando em uma chamada parecida com esta:



Usando assim o poder do Decorator :). Trarei mais exemplos desta natureza em um futuro texto.

Dúvidas ou sugestões, usem os comentários. Obrigado!