A remoção da duplicação vale quando não reduz o tamanho do código?

4

Ontem, eu removi a duplicação em um arquivo. O código estava executando traduções em um grid[i][j] . A duplicação foi entre o código para o eixo i e o código para o eixo j:

Por exemplo, reescrevi:

void redrawGridLine(int iLine);
void redrawGridColumn(int jColumn);

como

enum CoordSelector { I = 0, J = 1 };

//S indicates the direction of the band (I for a line, J for a column)
void redrawGridBand(CoordSelector S, int sBand);

Mas no final do dia, meus esforços renderam apenas uma redução de 3 linhas ...

Valeu a pena?

    
por Julien__ 21.04.2017 / 11:29
fonte

4 respostas

16

O problema com a duplicação de código é, se você tem casos em que uma mudança em um lugar sempre requer uma mudança de analogia em outro lugar, então você pode facilmente esquecer a mudança naquele segundo lugar. Isto é o que torna o código realmente difícil de manter, e é por isso que geralmente vale a pena remover o código duplicado, mesmo se você economizar linhas de código zero no total.

No entanto, sugiro que você tente não refatorar de forma que a legibilidade diminua tanto que você ou seu revisor tenha dúvidas se essa foi realmente a decisão correta. No seu exemplo, eu substituiria sua enum CoordSelector por algo mais autodescritivo como

  enum Direction { Rows = 0, Columns = 1 };

então você provavelmente pode omitir o comentário longo antes de redrawGridBand .

    
por 21.04.2017 / 14:34
fonte
11

Você não deve medir o resultado em quantas linhas de código foram removidas. Algumas medidas valiosas são o tempo que você ganhará ao reescrever o código. Se você precisa fazer uma adaptação, você só precisará adaptar um método. Menos tempo gasto ao reescrever o código, menos tempo para alguém novo que está olhando o código, menos tempo gasto em bugs porque o outro método não foi adaptado ...

    
por 21.04.2017 / 11:49
fonte
3

Duas observações -

Esta é a pergunta errada

Is removing duplication worth it when it doesn't reduce code size?

Não importa realmente (consulte Em que ponto a brevidade não é mais uma virtude? ). TLDR: Brevidade não importa, a legibilidade faz.

A pergunta que você deve se fazer é: reduzi o número de pontos de código que exigiriam manutenção se eu precisasse mudar alguma coisa? Por exemplo. Se você encontrar um bug, será mais fácil aplicar a correção? Se o código existe em dois lugares, geralmente , é mais trabalho consertar (e lembrar de corrigi-lo uniformemente em todo o aplicativo).

A duplicação pode ser melhor às vezes

Por vezes, a duplicação de código é realmente melhor, por ex. Se o seu sistema tiver um alto número de dependências e você estiver tentando melhorar a capacidade de implantar e atualizar as coisas de forma independente. Por exemplo, se você tiver dois microsserviços que precisam da mesma operação de cadeia primitiva, talvez seja melhor implementá-lo duas vezes em vez de colocá-lo em uma biblioteca compartilhada, para que você possa atualizar cada microsserviço de forma independente sem se preocupar com a versão da biblioteca comum. / p>     

por 21.04.2017 / 20:10
fonte
2

Como outras respostas apontaram, existem boas razões para evitar a duplicação de código, mesmo que sejam apenas três linhas de código.

No entanto, sugiro que você mantenha as funções

void redrawGridLine(int line);
void redrawGridColumn(int column);

Basta alterar suas implementações para (gosto da sugestão de @DocBrown para o enum ):

enum Direction { Rows = 0, Columns = 1 };

void redrawGridLine(int line)
{
   redrawGridBand(Rows, line);
}

void redrawGridColumn(int column)
{
   redrawGridBand(Columns, column);
}
    
por 21.04.2017 / 21:11
fonte