Em uma linguagem OO (por exemplo, mas não se limitando a Java), como você corrige código duplicado, dependendo do escopo de sua ocorrência? Eu começaria com (por exemplo)
- na mesma classe (escopo), execute a refatoração do método Extract (correção)
- nas classes da mesma hierarquia (escopo), execute Extract Method e Pull Up (fix)
- ...
object-oriented
dry
Peter Kofler
fonte
fonte
Respostas:
Recentemente, encontrei uma boa resposta para minha pergunta no "Código Limpo" do tio Bob, que quero compartilhar. Ele diferencia três tipos de duplicação
Pedaços de código idêntico devem ser substituídos por um único método. Portanto, a correção seria extrair o método e delegar ao comportamento comum.
SthUtil
ouSthLib
).casos de
switch/case
eif/else
que sempre testam o mesmo conjunto de condições .Módulos que implementam algoritmos semelhantes . Eles são mais difíceis de encontrar, pois nenhum detector de clone pode encontrá-los.
Também é um ponto válido mencionado por Oded, ao lidar com diferentes versões de bibliotecas
No final, a melhor frase para responder à minha pergunta é por estímulos:
fonte
Em geral - consolide o código duplicado em um único local e verifique se o site de duplicação original está chamando o local consolidado.
Nos seus exemplos, dentro de uma classe, esse seria o método extraído e, dentro de um conjunto de classes, o método pull-up dentro da classe base.
No código copiar e colar, isso seria remover as duplicatas e garantir que qualquer usuário agora use a cópia única (em qualquer nível que seja).
Ao lidar com diferentes versões de bibliotecas, consolide em uma única versão (se possível).
fonte
Eu acho que essa é uma pergunta em aberto, mas também depende do estado do código. Quero dizer, você pode tolerar o código duplicado um pouco, dependendo do contexto. A regra dos três é boa para esse assunto.
Regra de três Na primeira vez que você faz algo, você apenas faz. Na segunda vez que você faz algo semelhante, estremece com a duplicação, mas faz a coisa duplicada de qualquer maneira. Na terceira vez que você faz algo semelhante, refatora.
Embora isso seja bastante discutível, este post também considera casos em que você toleraria código duplicado.
fonte