Qual è il termine per questo tipo di refactoring

33

Sono sicuro che c'è un termine per il seguente refactoring, ma non riesco a ricordarlo e il mio Google-fu mi sta fallendo!

Il refattore si sposta se le istruzioni su cui stanno per avere più impatto, ad esempio cambiando questo

$test = someFunctionThatReturnsABool();
for($x = 0; $x < 10000; $x++) {
    if ($test) { 
        echo $x; 
    }
}

A questo

$test = someFunctionThatReturnsABool();
if ($test) {
    for($x = 0; $x < 10000; $x++) {
        echo $x; 
    }
}
    
posta Toby 26.07.2012 - 10:29
fonte

4 risposte

56

Questo è movimento del codice invariante di loop . Un buon compilatore dovrebbe farlo da solo.

...loop-invariant code consists of statements or expressions (in an imperative programming language) which can be moved outside the body of a loop without affecting the semantics of the program. Loop-invariant code motion (also called hoisting or scalar promotion) is a compiler optimization which performs this movement automatically...

If we consider the following code sample, two optimizations can be easily applied.

for (int i = 0; i < n; i++) {
    x = y + z;
    a[i] = 6 * i + x * x;
}

The calculation x = y + z and x * x can be moved outside the loop since within they are loop invariant — they do not change over the iterations of the loop— so the optimized code will be something like this:

x = y + z;
t1 = x * x;
for (int i = 0; i < n; i++) {
    a[i] = 6 * i + t1;
}

This code can be optimized further...

    
risposta data 26.07.2012 - 10:39
fonte
10

Questo è anche chiamato hoisting o scalar promotion . Vedi qui :

Hoisting means that you have pulled some operation out of a loop because the loop itself does not affect the result of the operation. In your case, you are hoisting the conditional test out of the while loop.

Re-ordering means changing the sequence of instructions in a way that does not affect the result. Typically this would be adjacent instructions with no data dependencies, e.g. it does not matter which order you perform the following two statements:

int a = x;
int b = y;
    
risposta data 26.07.2012 - 16:12
fonte
4

Sembra una variante di Remove Control Flag (pp 245 di Fowler Refactoring )

Un esempio di PHP può essere trovato su DZone .

    
risposta data 26.07.2012 - 10:40
fonte
0

Non penso che questo tipo di refactoring esista.

Quindi, sarebbe difficile trovarlo tra "elenchi di refactoring".

Classificherei quell'esempio come ottimizzazione non come refactoring .

Il refactoring, per me, sta cambiando il codice per migliorare la sua comprensibilità senza influire sul suo comportamento.

L'ottimizzazione, per me, sta cambiando il codice per migliorare le prestazioni.

Poiché il codice ottimizzato tende a essere meno facile da capire. Le due pratiche tendono a lavorare l'una contro l'altra.

    
risposta data 01.08.2012 - 16:38
fonte

Leggi altre domande sui tag