Tag Archives: expressões regulares

Um código limpo diz mais que mil comentários

Você comenta seu código? Sim? Por quê?

Cuidado! Comentários podem ser perigosos! O uso deles pode ser um indício de que seu código está confuso e você tem medo de precisar alterar algo mais tarde e esquecer o que aquela variável aux armazena.

A forma mais elegante de se remover comentários é refatorando. Aux é um nome sem sentido, você pode até lembrar o que essa variável significa enquanto você ainda está programando, mas daqui duas semanas você já vai ter esquecido. Nomeie melhor suas variáveis, não tenha medo de ter uma variável assim: listaDeClientesInativos ao invés de lista.

Outro caso bastante comum de comentários é quando você tem aquele método gigante com 100 linhas e a cada 10 você resolve colocar um comentário para dizer o que está acontecendo. Nestes casos você pode (e deve) utilizar extract method. Divida seu grande método em outros pequenos, assim você pode substituir os comentários por métodos com nome auto-explicativos, além disso estará de acordo com o Single responsibility principle.

Não é possível garantir que outras pessoas do seu time irão atualizar o comentário quando alguma alteração for feita. Pior do que ter um método cheio de comentário é ter um método com um comentário obsoleto. Além disso, a leitura do comentário é opcional, você não tem como saber se seu comentário será lido ou não. Se você tem algo importante para dizer, diga no seu código, através de nomes bem definidos e código limpo.

Dito tudo isso, não preciso nem comentar sobre o exemplo abaixo né?

//Chamado #213: Corrigido bug onde o desconto final estava sendo somado ao invés de descontar.
int total = pedido.getTotal() - descontoFinal;

Se você faz isso, sugiro procurar algum software de controle de versão.

Algum tempo atrás escrevi sobre Expressões Regulares (aqui) e falei sobre comentários em Regex pattern. Continuo achando uma forma elegante de se utilizar comentários já que um pattern quase nunca é limpo, é sempre complicado ler aquilo e entender. Os comentários ajudam neste caso tornando-o mais legível. Outra opção seria escrever testes automatizados para seu Regex. Além dos testes servirem como exemplos de uso, você estará tendo uma maior cobertura do seu código e a garantia de poder alterar o pattern sem medo de inserir um novo bug.

Falando em Regex e Testes, lembrei deste tweet do @gchapiewski.

It’s impossible to program complex regular expressions without TDD. Period.

Resumindo. Mais código limpo e menos comentários. Ah, não esqueça de ler o livro Clean Code. :)

Dica #4: Minhas recomendações ao usar Expressões Regulares

Foi lançado recentemente a terceira edição do livro “Expressões Regulares – Uma abordagem divertida” do autor Aurélio Marinho Jargas. Tive a oportunidade de conhecê-lo pessoalmente no lançamento e ainda ganhar um livro gratuito por ter sido sorteado na promoção do Twitter, aliás, é a primeira vez que eu ganho algo no Twitter :)

Sobre o Livro

Expressões Regulares - Uma abordagem Divertida

#piazinho3

Eu já havia lido a edição anterior, e esta nova edição ficou bem parecida, continua seguindo o que o título propõe: Ser uma abordagem divertida. Você consegue ler o core dele em uma viajem de avião ou em algumas corridas de ônibus de ida e volta da faculdade. Eu defino o core do livro como sendo aquilo que você usa independente do lugar, linguagem ou ferramenta. Seriam os primeiros capítulos onde ele fala dos metacaracteres e suas combinações.

Achei bem bacana a novidade que ele traz no início do livro, pelo menos eu não lembro ter lido isso na edição anterior. O Aurélio conta como foi sua trajetória durante todas as publicação de seus livros. Cara, como um programador/pesquisador vira fotógrafo de surfe? Inacreditável, seria uma das últimas profissões que passaria em minha mente.

Confesso que depois de ler deu vontade de escrever um livro, quem sabe não sai algo nos próximos anos?

Bom, meu objetivo com o post não é falar do livro em si, e sim de boas práticas com Expressões Regulares. Não irei explicar o que é, como funciona ou como fazer uma ER para casar com isso ou aquilo. Vou considerar que você já tenha uma noção, até mesmo básica, de Expressões Regulares. Não sabe? Compre o livro :)

Práticas que recomendo com Expressões Regulares

Enumerei quatro itens que acho pertinente ao assunto, que são os seguintes.

1) Violação do princípio da responsabilidade exclusiva (SRP)

É preciso tomar cuidado com o local onde você coloca os casamentos de suas expressões regulares. Se for inserir a expressão dentro de um método cuja a responsabilidade não seja validar a entrada com base na expressão, você estará atropelando o Single Responsibility Principle, defendido pelo Guru Uncle Bob (mais detalhes sobre o SRP você encontra aqui).

Validar a entrada contra uma expressão regular já uma responsabilidade e não deve ser misturada com outras, separe as responsabilidades em classes distintas, facilita a manutenção, o design estará de acordo com o SRP e ajudará no item 2 desta lista.

2) Comentários de exemplos

Sou contra o uso de comentários, sou da opinião de que se você precisa comentar é porque está dificil de entender. Ora, se está dificil de entender, arrume e não comente. Nada pior do que ver 5 linhas de código e 20 de comentário. Se estiver com dificuldades para tornar o código mais limpo, sugiro que dê uma olhada no livro Clean Code do Uncle Bob.

Depois de expressar meu motivo pela qual sou contra o uso de comentários, preciso dizer que, como tudo na vida, existem exceções. Nas Expressões Regulares por exemplo, é muito útil informar com o que aquele pattern vai casar, com e-mails? sites? telefones?

Colocar exemplos de entradas que casam e que não casam também ajuda bastante na leitura. Veja como ficaria um exemplo em C#.

// Pattern para verificar o formato de e-mail.
//
// Exemplos válidos
// - joazinho@piadas.com.br, maria@algumsite.com.br
// Exemplos inválidos
// - joazinhopiadas.com.br, maria@algumsite
string emailPattern = @"^[\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$";

3) Quanto mais legível, melhor

Esta dica está no livro, tamanho não é documento, cuidado com expressões gigantes e com aquelas minúsculas, procure sempre fazer um pattern legível.

As vezes é difícil deixar essa sopa de letrinhas de modo organizado, um exemplo legal é este do e-mail logo acima. Você consegue entender? É difícil né? Ainda bem que há comentários.

4) Procure alternativas

Tenha certeza que existem N maneiras de resolver um problema, expressões regulares são ótimas mas não são as balas de prata. Não complique, conheça seu framework, procure a melhor solução. Para validação no input de dados preciso concordar que as expressão resolvem com bastante facilidade, mas para descobrir se um caracter é um número ou não, em C# você pode usar o char.IsDigit(). Muito mais elegante, concorda?

Se você não possui um equivalente em sua linguagem preferida, crie. Mas não esqueça de separar ela em outra classe, comentar e deixar legível :)

http://butunclebob.com/ArticleS.UncleBob
Sharing Buttons by Linksku