Що таке термін для такого типу рефакторингу


33

Я впевнений, що є термін для наступного рефакторингу, але я не можу його згадати, і мій Google-фу зірвав мене!

Рефактор рухається, якщо заяви на те, де вони будуть мати найбільший вплив, наприклад, змінивши це

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

До цього

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

Відповіді:


56

Це рух кодового інваріанта . Хороший компілятор повинен робити це самостійно.

... цикл-інваріантний код складається з висловлювань або виразів (в обов'язковій мові програмування ), які можна переміщувати за межами тіла циклу, не впливаючи на семантику програми. Цикловий інваріантний рух коду (також його називають підйомом або скалярним просуванням ) - це оптимізація компілятора, яка виконує цей рух автоматично ...

Якщо ми розглянемо наступний зразок коду, дві оптимізації можна легко застосувати.

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

Розрахунок x = y + zі x * xможе бути переміщений за межами циклу , так як всередині вони Інваріант циклу - вони не змінюються в протягом ітерації петель так оптимізований код буде виглядати приблизно так:

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

Цей код можна оптимізувати далі ...


55
хороший програміст повинен це робити і самостійно, я думаю
1212

8
Я погоджуюся @stijn - є деякі речі, про які компілятор доцільно потурбуватися, але це не одна з них!
Toby

@Toby: Хоча це стосується нового коду (зрештою, цикл-інваріантний хід створює легший для розуміння внутрішній цикл), все, що вже робиться компілятором, не потрібно робити вручну. Я б просто дав старий код, наприклад, наведений вище приклад; поліпшення якості LICM невелике і, мабуть, не варте вашого часу.
титон

12
@thiton Я не згоден. Якщо залишити це так, як є, це означає, що всі майбутні технічні працівники повинні будуть пройти ті ж міркування. Даремно витрачає час; просто змінити це.
Ізката

2
@zzzzBov так, я знаю, але моя думка полягає в тому, що коли шаблон прихований, він, ймовірно, вже не є саме таким. Або щось подібне. (вибачте, довгий день)
stijn

10

Це також називається hoistingабо scalar promotion. Дивіться тут :

Піднімання означає, що ви витягли якусь операцію з циклу, оскільки сама петля не впливає на результат операції. У вашому випадку ви піднімаєте умовне випробування з циклу while.

Переупорядкування означає зміна послідовності інструкцій таким чином, що не впливає на результат. Як правило, це суміжні інструкції без залежностей від даних, наприклад, не має значення, в якому порядку ви виконуєте наступні два твердження:

int a = x;
int b = y;


0

Я не думаю, що таке рефакторинг існує.

Отже, важко було б знайти його серед "списків реконструкцій".

Я б класифікував цей приклад як оптимізацію, а не рефакторинг .

Як я вважаю, рефакторинг - це зміна коду для покращення його зрозумілості, не впливаючи на його поведінку.

На мене оптимізація - це зміна коду для підвищення продуктивності.

Оскільки оптимізований код, як правило, менш зрозумілий. Дві практики, як правило, працюють один проти одного.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.