Una sola volta e solo una volta - con più righe di codice

4

Ho un brutto bit di codice, essenzialmente un'iterazione su alcune strutture di dati in cui la carne dell'azione stava cambiando, ma il codice di iterazione è rimasto lo stesso. L'iterazione costituiva la maggior parte del codice e c'erano almeno quattro casi di copia del codice.

Così ho rifattorizzato il codice, inserendo ogni livello di iterazione nella sua classe (probabilmente farò un altro post in seguito). Il nuovo codice è considerevolmente più bello (almeno ai miei occhi), senza copia / incolla posizioni. Tuttavia, a causa dell'infrastruttura che ho dovuto presentare ai loop annidati di refactoring in classi separate, ho finito con il 10% in più di LOC. Se scendo l'infrastruttura extra, ottengo circa il 5% di codice più piccolo rispetto alla dimensione originale.

Quindi, il codice è più sofisticato, ma non è più breve e potrebbe essere più difficile da capire per un programmatore meno esperto. Potrei ancora finire con un codice più breve in futuro se si presentano più opportunità di riutilizzo.

La mia domanda è: pensi che ne valesse la pena? È una buona idea refactoring per "una volta sola" se il conteggio LOC sale?

    
posta Arkadiy 25.03.2011 - 22:11
fonte

7 risposte

12

Le linee di codice non sono una buona misura della complessità del codice. Dovrebbe essere usato solo come stima approssimativa delle dimensioni del progetto. Ad esempio, un programma LOC 1k è generalmente più semplice di un programma LOC 10k. Suppongo che il numero effettivo di linee di cui parli si mantenga entro uno spettro trascurabile.

La riduzione della ripetizione del codice è sempre buona perché previene gli errori in seguito, se è necessario modificare qualcosa.

    
risposta data 25.03.2011 - 22:22
fonte
3

Difficile dire senza vedere il codice che hai refactored, ma rimuovere la duplicazione del codice è sempre una buona cosa nella mia mente, anche se finisce per aumentare il conteggio LOC.

    
risposta data 25.03.2011 - 22:18
fonte
2

Lo stile di codifica consiste nel comunicare l'intento alle persone, sia te stesso in sei mesi, o il tuo collega di lavoro nel progetto, o chiunque abbia il tuo lavoro dopo la tua mossa.

Quindi se il tuo codice è più chiaro e comprensibile, è una grande vittoria. Ci saranno meno bug e meno errori nel codice che interagiscono con esso.

Penso che anche il tuo punto sul potenziale riutilizzo successivo sia buono.

    
risposta data 25.03.2011 - 22:31
fonte
1

Il codice ripetuto è sbagliato perché è facile che le copie non vadano sincronizzate quando è necessario modificare il modo in cui funzionano. Anche se non ti dimentichi di aggiornare tutte le copie quando ne cambi una, dovrai comunque apportare quattro (o comunque molte copie) ogni volta che apporti una modifica.

E a quel punto probabilmente dirai "quattro copie dello stesso codice? Dovrei rifattorici."

    
risposta data 25.03.2011 - 22:28
fonte
1

Seguire DRY ("Non ripetere te stesso") è valso lo sforzo della mia esperienza. So quando lavoro sul mio codice che le cose vengono specificate una sola volta e ciò semplifica la comprensione e lo sviluppo del codice.

I linguaggi funzionali possono aiutare in questo modo perché puoi passare una funzione in un metodo che applica la funzione a ogni elemento di una raccolta, ad esempio.

Stavo esaminando un esempio di codice da un candidato di lavoro per un cliente di recente e ho visto due metodi identici, ad eccezione dei nomi dei metodi e dei nomi di uno degli identificatori. Sapevo che non avevo bisogno di cercare il candidato.

    
risposta data 25.03.2011 - 22:44
fonte
0

Un codice leggermente più lungo può essere più facile da mantenere se ciò significa che un cambiamento di criterio può essere implementato in un singolo posto. Raccogliere una iterazione nidificata complessa in una classe è una buona idea, ma nella mia esperienza la maggior parte dei programmatori non ha familiarità con questo modello.

    
risposta data 25.03.2011 - 22:24
fonte
0

Mentre descrivi il tuo problema, non capisco perché ogni livello dell'iterazione debba andare in una classe separata. Sembra che tu abbia qualcosa come collezioni nidificate, e devi considerare tutti gli elementi in un certo ordine, ma più volte. Vale a dire, è necessaria una procedura, che richiede la struttura dei dati di livello superiore e un'operazione da eseguire su ciascun elemento, quindi applica l'operazione su ciascun elemento nell'ordine prescritto. Se sei stato modificato utilizzando tipi di dati spogli in chiamate nelle classi wrapper, ma il tuo codice ripete ancora il nesting, non hai ottenuto nulla.

    
risposta data 25.03.2011 - 23:08
fonte

Leggi altre domande sui tag