Codice di refactoring con solo poche righe diverse

2

Ho due cicli for in una funzione che assomiglia a questi:

for (int i=0; i < MAX; ++i) {
    identical_lines
    identical_lines
    identical_lines
    first_for_specific_line
    identical_lines
    identical_lines
    identical_lines
    first_for_specific_line
    identical_lines
    identical_lines
}

for (int i=MAX - 4; i > 0; --i) {
    identical_lines
    identical_lines
    identical_lines
    second_for_specific_line
    identical_lines
    identical_lines
    identical_lines
    second_for_specific_line
    identical_lines
    identical_lines
}

vale a dire. questi due cicli hanno differenti condizioni e indici, ma il loro codice è praticamente lo stesso (tutte le 'linee identiche' sono le stesse nei due cicli).

Tuttavia ci sono alcuni punti (quello contrassegnato da 'specific_line') che sono diversi per ognuno di questi per i loop.

Vorrei evitare la duplicazione del codice e unirli per cicli, ma non riesco a pensare a qualcosa per unificarli e avere ancora le diverse linee.

La lingua che sto usando è C ++

    
posta Albert 08.05.2015 - 22:31
fonte

1 risposta

10

Prima di entrare nella borsa del "moderno C ++", manteniamo le cose semplici e cominciamo con alcune tecniche classiche, agnostiche del linguaggio. Una soluzione è creare una funzione del modulo

   void myfunc(int i,bool upward)
   {
        identical_lines
        identical_lines
        identical_lines
        if(upward)
           first_for_specific_line
        else
           second_for_specific_line
        //...
    }

e chiamalo come

 for (int i=0; i < MAX; ++i)
    myfunc(i,true);

  for (int i=MAX - 4; i > 0; --i) 
    myfunc(i,false);

Si noti che questa non è sempre la soluzione migliore dal momento che tende a rendere myfunc facendo "troppo", forse violando il principio di responsabilità unica. Spesso è meglio rifattorizzare ogni blocco che hai contrassegnato come identical_lines in una funzione piccola da sola (chiamiamolo block1(int i) , block2(int i) e crea 2 funzioni

   myfunc1(int i)
   {
        block1(i);
        first_for_specific_line;
        block2(i);
        // ...
   }

e

   myfunc2(int i)
   {
        block1(i);
        second_for_specific_line;
        block2(i);
        // ...
   }

e usalo come

  for (int i=0; i < MAX; ++i)
    myfunc1(i);

  for (int i=MAX - 4; i > 0; --i) 
    myfunc2(i);

Tuttavia, decidere quale sia il modo "migliore" per ridurre i blocchi di codice a piccole funzioni dipende da ciò che i blocchi sono veramente facendo. È meglio costruire astrazioni non principalmente su criteri formali come "i blocchi di codice sembrano simili", ma su "qual è il compito o lo scopo di questo blocco. Chiediti quali delle linee appartengono insieme per adempiere a tale scopo e se puoi caratterizzare quell'attività con un nome unico e accurato.

    
risposta data 08.05.2015 - 23:27
fonte

Leggi altre domande sui tag