La rimozione della duplicazione vale la pena quando non riduce le dimensioni del codice?

4

Ieri ho rimosso la duplicazione in un file. Il codice eseguiva traduzioni in grid[i][j] . La duplicazione era tra il codice per l'asse i e il codice per l'asse j:

Ad esempio, ho riscritto:

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

come

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);

Ma alla fine della giornata, i miei sforzi hanno prodotto solo una riduzione di 3 righe ...

Ne è valsa la pena?

    
posta Julien__ 21.04.2017 - 11:29
fonte

4 risposte

16

Il problema con la duplicazione del codice è, se hai casi in cui un cambiamento in un posto richiede sempre un cambiamento analogico in un altro posto, quindi puoi dimenticare troppo facilmente il cambiamento in quel secondo posto. Questo è ciò che rende il codice davvero difficile da mantenere, ed è per questo che spesso paga per rimuovere il codice duplicato anche se ti salva zero linee di codice in totale.

Tuttavia, ti suggerisco di provare a non refactoring in un modo in cui la leggibilità diminuisce così tanto che tu o il tuo peer reviewer avete dei dubbi se questa è davvero la decisione giusta. Nel tuo esempio, sostituirò il tuo enum CoordSelector con qualcosa di più descrittivo come

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

quindi probabilmente puoi omettere il commento piuttosto lungo prima di redrawGridBand .

    
risposta data 21.04.2017 - 14:34
fonte
11

Non dovresti misurare il risultato in quante linee di codice hai rimosso. Alcune misure importanti sono il tempo che si otterrà quando si riscrive il codice. Se hai bisogno di fare un adattamento, dovrai solo adattare un metodo. Meno tempo speso per riscrivere il codice, meno tempo per chi è nuovo a guardare il codice, meno tempo speso per i bug perché l'altro metodo non è stato adattato ...

    
risposta data 21.04.2017 - 11:49
fonte
3

Due osservazioni -

Questa è la domanda sbagliata

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

Non ha importanza (vedi A che punto la brevità non è più una virtù? ). TLDR: Brevity non ha importanza, la leggibilità sì.

La domanda che dovresti porci è-- ho ridotto il numero di punti codice che richiederebbero manutenzione se dovessi cambiare qualcosa? Per esempio. se trovi un bug, sarà più facile applicare la correzione? Se il codice esiste in due punti, di solito è più lavoro da risolvere (e per ricordarsi di correggerlo in modo uniforme sull'applicazione).

La duplicazione può effettivamente essere migliore a volte

A volte la duplicazione del codice è effettivamente migliore, ad es. se il tuo sistema ha un elevato numero di dipendenze e stai cercando di migliorare la capacità di distribuire e aggiornare le cose in modo indipendente. Ad esempio, se si dispone di due microservizi che richiedono la stessa operazione di stringa primitiva, potrebbe essere meglio implementarlo due volte anziché metterlo in una libreria condivisa, in modo da poter aggiornare ciascun microservizio in modo indipendente senza preoccuparsi della versione della libreria comune.

    
risposta data 21.04.2017 - 20:10
fonte
2

Come hanno sottolineato altre risposte, ci sono buone ragioni per evitare la duplicazione del codice, anche se sono solo tre righe di codice.

Tuttavia, ti suggerisco di mantenere le funzioni

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

Cambia semplicemente le loro implementazioni in (mi piace il suggerimento di @DocBrown per enum ):

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

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

void redrawGridColumn(int column)
{
   redrawGridBand(Columns, column);
}
    
risposta data 21.04.2017 - 21:11
fonte

Leggi altre domande sui tag