“Don’t repeat yourself”, em português, seria algo como “não repita a si mesmo” ou também conhecido pelo acrônimo DRY. Este é um conceito de desenvolvimento de software que propõe que cada porção de conhecimento em um sistema deve possuir uma representação única, de autoridade e livre de ambiguidades em todo o sistema. Esta expressão foi cunhada por Andy Hunt e Dave Thomas em seu livro “The Pragmatic Programmer”. Ele se aplica amplamente, incluindo esquema de banco de dados, plano de teste, compilação e mesmo documentação de software. Se este conceito for aplicado, a modificação de uma parte do sistema não leva a modificações em outras partes não relacionadas. Adicionalmente, todos os elementos relacionados mudam de forma previsível e uniforme, mantendo-se, portanto, sincronizados.
Segue a linha de raciocínio básico para refatorar um dry:
Dry dentro de um método
Quanto acontecer blocos de códigos repetitivos dentro de um mesmo método, você refatora o dry em uma closure na primeira vez que o bloco acontecer e reusa invocação da closure para as próximas chamadas.
Dry dentro da uma classe
Quanto acontecer blocos de códigos repetitivos dentro de uma mesma classe, em diferentes métodos, você refatora o dry em um método privado, nomeando de acordo e reusa fazendo a invocação desse métodos em todos os outros.
Dry em várias classes
Quanto acontecer blocos de códigos repetitivos dentro de várias classes, você refatora o dry em uma classe especializada, nomeando adequadamente, de acordo com a situação. Ela pode a vir a ser uma simples classe estática utilitária ou até uma classe de instância, dentro dos blocos de construções de sua arquitetura, tudo dependendo da interpretação do projetista.
Ciclo TDD
Seguindo a ciclo básico do TDD, deixe o dry acontecer no código sem preocupação. Seja feliz por alguns momentos, copiando e colando aquele bloco de código repetitivo. Depois que você estiver no estágio de barra verde, com os testes em dia e tudo funcionando, é que você então vai para a fase de refatoração, auditando o que foi programado, aplicando essa sequência de passos.