Evitare problemi durante la copia del codice

6

Di tanto in tanto, mi trovo a copiare un po 'di codice e modificare la versione copiata. So molto bene che avere due copie dello stesso codice è una pessima idea, ma quei pezzi di codice sono piccoli e presentano differenze significative.

Il problema è che, quando si modifica la copia, a volte dimentico un pezzo dell'originale, che non dovrebbe essere lì. Ad esempio, per prima cosa scrivo (codice C #, ma qui non è importante):

if (DateFrom != null)
    query = query.Where(x => x.Date >= DateFrom.Value);

quindi lo copio e lo copio nel seguente modo:

if (DateTo != null)
    query = query.Where(x => x.Date < DateFrom.Value);

che non è corretto, perché dovrebbe esserci DateTo sulla seconda riga anziché DateFrom .

Che cosa suggeriresti per evitare questo tipo di bug?

    
posta svick 07.05.2011 - 23:12
fonte

4 risposte

12

Non copiare il codice.

Se è abbastanza breve, dovresti essere in grado di digitarla nuovamente "da zero". Se non lo è, dovrebbe comunque essere in una funzione.

    
risposta data 07.05.2011 - 23:34
fonte
11

Test delle unità

Sembra un banale "test unitario risolverà tutti" il tipo di risposta, ma ti assicuro che non è inteso in quel modo. Questo è esattamente ciò che i test unitari mi impediscono di fare, ancora e ancora.

Posso copiare / incollare il codice sia per il test che per il metodo, e potrei sbagliare a modificarne uno. Ma la possibilità che io commetta l'errore stesso due volte è molto più bassa rispetto a una volta.

    
risposta data 07.05.2011 - 23:33
fonte
4

Prendendo il codice come esempio. Prima il codice corretto:

if (DateFrom != null)
    query = query.Where(x => x.Date >= DateFrom.Value);

e poi il codice con un errore:

if (DateTo != null)
    query = query.Where(x => x.Date < DateFrom.Value);

Se questi due pezzi di codice sono in metodi separati in cui DateFrom e DateTo sono parametri, il secondo non riuscirà a compilare come DateFrom sarà indefinito.

Questo è un esempio per assicurarci che ogni metodo faccia una sola cosa.

    
risposta data 08.05.2011 - 00:02
fonte
0

In questo particolare esempio, tenderei ad usare search / replace per cambiare tutto DateFrom s, o almeno una ricerca in modo da evidenziare tutti quelli che ho perso, ma io uso vim, quindi quel tipo di ricerca è facile come digitare * quando il mio cursore è sulla parola.

Sono d'accordo con pdr, anche se quel test unitario è la migliore soluzione generale.

    
risposta data 08.05.2011 - 01:31
fonte

Leggi altre domande sui tag