Publicado por: Vinicius AC em: 28/01/2007
Código limpo que funciona (ou “Clean code that Works”), foi para alcançar este objetivo que o TDD surgiu. Um código será tanto mais limpo quanto melhor for seu design.
Uma forma de sempre ter código limpo que funciona, é utilizar o desenvolvimento fortemente guiado por testes automatizados que são escritos antes do código. Este estilo de desenvolvimento foi chamado de Desenvolvimento Guiado por Testes ou Test-Driven Development (TDD).
TDD é uma forma disciplinada de escrever código limpo que funciona, e consiste de duas regras principais:
· Código novo só é escrito se um teste automatizado falhar;
· Todas as duplicações devem ser eliminadas.
São duas regras simples, mas que tem conseqüências complexas no comportamento individual e coletivo dos desenvolvedores. As implicações técnicas são as seguintes:
1. Desenvolvimento orgânico, onde código em execução gera o retorno necessário para a tomar as decisões que orientam o próprio desenvolvimento;
2. Cada desenvolvedor deve escrever seus testes;
3. O ambiente de desenvolvimento deve fornecer respostas rápidas para pequenas mudanças;
4. O projeto deve ter alta coesão, componentes fracamente acoplados, exatamente para permitir testar facilmente ??????????????????????????
As duas regras também implicam numa ordem para as tarefas de programação
1. Vermelho – Escreva um pequeno teste que não passa, e provavelmente até mesmo não compila na primeira vez;
2. Verde – Faça o teste passar rapidamente, cometendo qualquer pecado que seja necessário durante o processo;
3. Refatore – Torne o código mais fácil de entender e modificar. Pode-se começar eliminando todas as duplicações criadas meramente para fazer o teste passar, por exemplo.
“Vermelho / verde / refatore — O mantra do TDD”.
- Aprendizado
Quanto maior for o tempo entre a inserção de um erro no código e sua descoberta pelo desenvolvedor, maior será a probabilidade deste erro repetir-se em outros locais do sistema e menor a possibilidade de aprendizado. Por outro lado, se o erro é descoberto alguns segundos após ser introduzido, são maiores as chances do desenvolvedor corrigi-lo rapidamente, aprender com isto e passar a codificar melhor; conseqüentemente reduz-se muito as chances de problemas semelhantes repetirem-se no futuro. Para um melhor aprendizado e redução da probabilidade de propagação de erros, é fundamental que o ambiente de desenvolvimento forneça respostas rápidas para pequenas mudanças
- Redução dos custos e vulnerabilidades do sistema
Escrever os testes antes, da forma que prega o TDD, equivale a prevenir-se de problemas futuros. As fases de desenvolvimento e depuração ocupam a maior parte do tempo de um projeto, sendo que a depuração geralmente só é feita quando o software apresenta um ou mais erros (Bugs). O que torna a depuração muito custosa é o tempo entre a inserção do bug e o momento em que este é detectado. Quanto maior o tempo, maior o custo de depuração, porque para corrigir um problema, o desenvolvedor precisa recuperar o contexto em que este foi inserido, entender uma série de coisas relacionadas, além de descobrir o que pode estar gerando o erro. Ou seja, é preciso re-aprender sobre a funcionalidade para que se possa corrigi-la.
Devido a grande complexidade envolvida no processo de desenvolvimento de software é comum ocorrerem erros dos mais variados tipos. É impossível evitar que estes erros ocorram ao longo de um projeto, entretanto é possível fazer alguma coisa em relação à quando estes defeitos são detectados e qual o impacto que causarão no cronograma do projeto. Só isto, causa um grande impacto na velocidade de desenvolvimento e na qualidade do software.
O desenvolvimento dirigido por testes segue o caminho da prevenção. Para isso é preciso incorporar hábitos que resultem numa menor probabilidade de ocorrência de erros. Mesmo assim, é possível que erros ocorram. Neste caso, os testes fazem com que a correção do erro seja mais barata por dois motivos:
· O teste expõe o erro assim que ele entra no sistema, o que evita muita perda de tempo com depurações demoradas.
· Caso um erro seja introduzido em uma parte do sistema diferente daquela que se está trabalhando no momento, os testes expõem o local exato do erro, permitindo que este seja encontrado e corrigido muito mais rapidamente.
- Aumento da qualidade e produtividade
Sempre que um teste detecta uma falha rapidamente, evitam-se longas sessões de depuração que costumam tomar boa parte do tempo dos projetos. Com mais tempo disponível e melhores oportunidades de aprendizado, os desenvolvedores codificam mais rapidamente e com maior qualidade, ou seja, aumenta-se a produtividade e reduz-se a incidência de defeitos.
[BECK, 2002]
[FOWLER, 2004]
[HUNT, 2004]
[TELES, 2004]
\o ’s,
ViniciusAC.
:: Comentários ::