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:

if (objeto == null) {
throw new IllegalArgumentException();
}

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:

class Pessoa {
private String nome;
Pessoa (String nome) {
this.nome = 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:

class Pessoa {
private String nome;
Pessoa (String nome) {
if (nome == null) {
throw new IllegalArgumentException();
}
this.nome = nome;
}
}


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:

class Pessoa {
private String nome;
private String sobrenome;
private Cidade cidade;
Pessoa (String nome, String sobrenome, Cidade cidade) {
if (nome == null) {
throw new IllegalArgumentException();
}
if (sobrenome == null) {
throw new IllegalArgumentException();
}
if (cidade == null) {
throw new IllegalArgumentException();
}
this.nome = nome;
this.sobrenome = sobrenome;
this.cidade = cidade;
}
}
view raw pessoa-v3.java hosted with ❤ by GitHub


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:

public class NotNull<t> {
private T verified;
private NotNull() {
}
public NotNull(final T verify) {
if (verify == null) {
throw new IllegalArgumentException("must not be null");
}
this.verified = verify;
}
public final T getVerified() {
return this.verified;
}
}
view raw notnull.java hosted with ❤ by GitHub


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:

class Pessoa {
private String nome;
private String sobrenome;
private Cidade cidade;
Pessoa (NotNull<String> nome, NotNull<String> sobrenome, NotNull<Cidade> cidade) {
this.nome = nome.getVerified();
this.sobrenome = sobrenome.getVerified();
this.cidade = cidade.getVerified();
}
}


E para instanciar uma classe Pessoa, basta:

Cidade londrina = new Cidade(new NotNull<String>("Londrina")); // mesma ideia do objeto Pessoa aplicado na Cidade
Pessoa pessoa = new Pessoa (new NotNull<String>("Roberto"), new NotNull<String>("Oliveira"), new NotNull<Cidade>(londrina))


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:

Pessoa pessoa = new Pessoa (
new NoSpecialChar<String>(
new NotEmpty<String>(
new NotNull<String>("Roberto")))
);


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!

quinta-feira, 27 de julho de 2017

Teclado mecânico Alfawise V1 (ABNT 2): recomendo!

Olá, pessoal!

Faz um bom tempo que não escrevo (embora tenha vários rascunhos de textos... rs). E, infelizmente, não falarei de código agora mas sim de uma ferramenta muito boa para produzi-lo: o teclado. Não qualquer teclado, mas um teclado mecânico chamado Alfawise V1.

Este texto aqui é para dar uma ideia da qualidade do teclado e apresentar alguns atalhos dele para alterar a intensidade da iluminação, cores e efeitos (algo que tive dificuldade de encontrar na Internet!).

Enfim, fazia muito tempo que namorava a compra de teclado mecânico, mas a maioria dos modelos disponíveis e mais em conta não eram no padrão ABNT2. Assim, preferi aguardar que uma boa opção de teclado mecânico ABNT2 aparecesse com excelente custo-benefício. Afinal, o Motospeed Inflictor CK104 já estava por aí algum tempo, mostrando que é possível sim existir um teclado mecânico muito bom por um preço justo.

Finalmente, este dia chegou.

A compra


Através do fórum da Adrenaline fiquei sabendo do teclado Alfawise V1 modelo ABNT2. Quando realizei a minha compra, havia poucas pessoas no tópico falando do teclado e poucas reviews no site da GearBest. Mas do pouco que li e vi, estava convencido que valia à pena arriscar e, literalmente, pagar para ver.

Comprei o teclado na GearBest por apenas 135 reais (com taxas e impostos!). O teclado demorou 1 mês e meio para chegar e estou com ele faz poucos dias, mas posso adiantar: adorei o teclado!

Usando


O teclar de um teclado mecânico é bem diferente, pois exige menos força e o "feedback" da tecla é bem melhor durante a digitação. Com o Alfawise não é diferente. Por ele usar o blue switch, confesso que ele é mais barulhento do que eu imaginava, mas já esperava que isto pudesse ocorrer, pois é uma característica do blue switch. Confesso que dá até gosto escrever mais linhas de código com ele, rs.

Como bom teclado mecânico e moderno que ele é, ele inclui iluminação em LED abaixo de cada tecla, que pode assumir diferentes cores e vários efeitos de iluminação. Vou deixar abaixo uma lista de atalhos para alternar entre estas diferentes configurações de cor e iluminação, tudo isto sem precisar instalar qualquer software!

Conclusão


A intenção deste texto não foi fazer uma análise. Foi mais para divulgar este excelente teclado mecânico que, seguramente, foi uma das melhores compras que já fiz.

E vamos aos atalhos!

Atalhos de iluminação do Alfawise V1


  • Fn + INS: alternar entre diferentes modos de iluminação
  • Gn + DEL: alterna entre diferentes cores
  • Fn + PRT (Print Screen): desliga toda a iluminação
  • Fn + 1: Modo de jogo 1 (FPS)
  • Fn + 2: Modo de jogo 2 (CF)
  • Fn + 3: Modo de jogo 3 (COD)
  • Fn + 4: Modo de jogo 4 (LOL)
  • Fn + 5: Modo de jogo 5 (QQ race)
  • Fn + baixo: diminui o brilho
  • Fn + cima: aumenta o brilho
  • Fn + Esc: reinicia as funções do teclado
  • Fn + Win: bloqueia a tecla do windows e deixa ela na cor vermelha.