Category Archives: Livros

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

Livro: Clean Code, A Handbook of Agile Software Craftsmanship

Sabe aqueles livros que você lê e não para? Então, aconteceu isso comigo ao ler este, Clean Code é um dos poucos livros que dei nota 5 no shelfari.

Martin_MECH.qxd

O primeiro cápitulo é um dos pontos chaves da leitura, ele fala sobre as vantagens de um código limpo, e porquê você deveria se preocupar com isso. Mesmo que um trecho de código compile e funcione da maneira esperada ( certificando-se através de testes unitários )  pode ser ser considerado ruim, legado e mal escrito. O problema é que é muito difícil manter um código limpo, toda a equipe precisa estar ciente dos ganhos que isso pode trazer, e basta uma pessoa violar as regras e o código já vira um carnaval. O que acontece geralmente é que a primeira versão de um componente é desenvolvido de forma clara e bem escrito, nas manutenções subseqüentes as primeiras sujeiras começam a ser inseridas até o momento que vira um monstro onde ninguémtem coragem de tocar.

Nos Estados Unidos as reservas florestais possuem uma regra que diz: “Leave the campground cleaner than you found it”. Imagine isso em um ambiente de desenvolvimento de software, não seria o máximo ter um projeto que o código está sempre mais limpo do que ontem?

Não sei exatamente o que leva algumas empresas a não se preocupar com as boas práticas, é fato que a maior parte dos problemas ocorrem na fase de análise de sistemas, uma análise errada pode resultar em um software inútil, assim como uma ótima análise é um péssimo código resulta em um sistema com os dias contados, daqui 2 ou 3 anos vai sair mais barato fazer outro do que dar manutenção no sistema “legado”. No final quem ganha com isso são as Fábricas de Software, no final do mês são mais horas contratadas, enquanto isso o pobre cliente está lá investindo em algo que logo morre.

wtf-per-minute

Talvez você não tenha como mudar as coisas na sua empresa, mas faça sua parte, limpe o acampamento antes de fazer check-in, tudo bem que um urso pode vir e destruir seu código, mas pelo menos você fica com a consciência limpa de que fez o que era certo.

Como escrever um código clean?

Sugiro a leitura do livro, ele trata sobre nomenclatura de métodos, classes e variáveis, comentários, funções, tamanho da função e responsabilidades (SRP). Dentre outros assuntos, também fala sobre testes automatizados, vejam que esse assunto está presente em todo lugar.

Não adianta ler e achar que vai virar um ninja, é claro que depois de terminar você já vai ter aprendido diversos truques, mas os mais as práticas mais elaboradas precisam de tempo e prática. Na teoria é tudo muito bonito e aparentemente fácil, quando você coloca a mão na massa você percebe que não é tão fácil e que requer muito estudo.

Segue mais alguns links interessantes sobre o assunto:

Livro: Test-Driven Development in Microsoft .NET

Test Driven Development in Microsoft .NETTDD é uma técnica de desenvolvimento de software onde você escreve seus testes antes de escrever o código da aplicação. Parece estranho, não? Como você vai testar algo que ainda não está pronto?

Depois de muita leitura em blogs e outros sites, eu ainda não havia conseguido achar uma resposta para esta pergunta, apelei então para um livro, e no meu caso foi o Test Driven Development in Microsoft .NET.

Eis que para minha felicidade, achei a resposta no primeiro capítulo, você escreve o teste com o intuito de ditar como vai ser o comportamento da sua aplicação, e não para ver se está funcionando. O mais interessante é que se você levar essa técnica a sério, no final do projeto você vai ter uma documentação executável e uma suite de testes automatizadas bem completa.

Além de uma introdução ao TDD, o livro fala sobre o famoso Red/Green/Refactor, customer tests e um exemplo completo de uma aplicação construída com TDD, usando ADO.NET e Web Services. Eu particularmente gostei muito do primeiro capítulo, já o segundo ficou bem cansativo de ler, há muito código nele, sem contar o uso de DataSets (não sou muito fã deles).

Essa é uma técnica que eu recomendo muito, a comunidade de Ruby on Rails faz uso constante de TDD e BDD, o que é muito legal, acho que já virou algo natural para eles. Logo mais vou falar sobre testes automatizados, que tem tudo a ver com o assunto do livro.

Sharing Buttons by Linksku