|
Busca |
Durante o desenvolvimento e manutenção de um programa, é crucial para o programador ter uma ferramenta que possa mostrar de maneira clara e limpa as diferenças entre duas versões de um mesmo código.
O código está sempre mudando, melhorando, evoluindo. O programador precisa acompanhar cada alteração com muita atenção, sendo minucioso e detalhista. Uma mudança em um trecho de código pode afetar outras partes do programa, que em um primeiro momento parecem não ser relacionadas.
As mudanças são feitas pelo próprio programador diretamente na árvore de desenvolvimento do software ou por colaboradores do projeto, em forma de correções (patches) ou códigos completos.
Antes de aplicar qualquer alteração o programador precisa saber com precisão cada caractere que mudou, inclusive os não visíveis (espaço em branco, TAB, caracteres de controle). Pode parecer exagero, mas um único caractere colocado no lugar errado pode causar erros na execução do programa.
A ferramenta que mostra as alterações deve ser implacavelmente precisa. Nenhum bit pode passar despercebido.
Mas no fechamento de uma versão nova do programa, é importante ter-se uma visão global de todas as mudanças, para uma análise geral de tudo o que foi feito. A documentação das novidades da versão (Changelog, NEWS) fica facilitada quando se pode ver de uma vez todo o trabalho.
Então a ferramenta que mostra as alterações deve ser precisa mas ao mesmo tempo dar a visão global. Isso é possível?
Tenho usado a combinação diff + Vim há anos e ela se mostra eficiente em ambos os casos.
O Vim é um editor de textos muito usado por programadores que conta com o destaque de sintaxe (syntax highlight), onde palavras-chave e estruturas especiais são destacadas utilizando cores diferentes, agilizando a visualização.
O diff é um programa do UNIX (portado para Linux, Windows e Mac, entre outros) especialista em mostrar as diferenças entre dois arquivos. Essa é a sua função e ele a desempenha muito bem. Funcionando orientado a linhas, caso encontre alguma mudança, o diff mostra a linha original seguida da linha alterada. Também é possível instrui-lo a mostrar quais são as linhas que estão antes e depois das alteradas, para que o programador saiba qual o contexto do código em questão. Seu uso é muito simples:
diff -u calculadora-1.py calculadora-2.py
E as mudanças serão mostradas na tela, com sinais de - e + no início das linhas para indicar quais as originais e quais as novas.
O pulo do gato é que o Vim reconhece este formato do diff e faz o destaque das linhas utilizando cores, ficando ainda mais fácil (e rápido) enxergar as mudanças. Bastaria gravar o resultado do comando diff em um arquivo, e abri-lo no Vim. Mas como o editor pode ler os dados diretamente (STDIN), não é necessário criar arquivos:
diff -u calculadora-1.py calculadora-2.py | vi -
E pronto. Linhas em vermelho são antigas e as em azul são as novas. As outras não têm cores e são apenas contexto, ficando fácil ignorá-las quando não necessárias, agilizando a leitura das mudanças.
Se adicionar a opção -r, o diff mostrará a diferença entre dois diretórios, vasculhando todos os arquivos de seu projeto. Sistemas de controle de versão como o CVS e o Subversion também utilizam este formato para mostrar as diferenças entre duas versões. "| vi -" neles!
Essa combinação de diff|vi mostra-se eficiente na maioria dos casos. A exceção é quando o programa possui linhas longas, como em Java, e apenas poucos caracteres mudam em cada linha. Você olha as duas linhas, vermelho e azul, e pensa: "Mas elas são iguais!". Olha de novo e continua não enxergando a mudança.
Entra em cena o comando vimdiff. É o próprio editor Vim, que quando chamado com este nome, mostra as alterações entre dois arquivos de maneira mais detalhada. Os arquivos são colocados lado a lado na tela, facilitando a leitura linha a linha. Trechos em comum são escondidos (folding) mas podem ser revelados caso necessário. E o melhor: é usado o destaque de sintaxe para mostrar as mudanças de cada caractere.
vimdiff calculadora-1.java calculadora-2.java
Na prática, aconselho usar o diff|vi regularmente e caso encontre um trecho mais complicado, use o vimdiff.
E você, qual seu método preferido?
Aurélio Marinho Jargas é programador e escritor, trazendo na bagagem a experiência de sete anos no desenvolvimento de software livre. Autor de programas bastante utilizados como as Funções ZZ, txt2regex e txt2tags, aprendeu a programar na prática e preza por códigos simples e limpos (KISS). Autor do livro Expressões Regulares - Uma Abordagem Divertida, disponibiliza em seu site www.aurelio.net vários artigos didáticos sobre Shell, Sed, Vim, Cygwin e outros monstrinhos.
Para se manter atualizado sobre as novidades desta coluna, consulte sempre o newsfeed RSS
Para saber mais sobre RSS, leia o artigo O Padrão RSS - A luz no fim do túnel.
Expressões Regulares: Uma Abordagem Divertida
Por Aurélio Marinho Jargas
http://aurelio.net/er/livro/