web-dev-qa-db-ja.com

このタイプのリファクタリングの用語は何ですか

次の少しのリファクタリングの用語があると確信していますが、それを思い出せず、Google-fuが失敗しました!

ステートメントが最も影響を与える場所にある場合、リファクタリングは移動します。たとえば、これを変更します

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

これに

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

これは ループ不変コードモーション です。優れたコンパイラーは、それを独自に実行する必要があります。

...ループ不変コードは、ステートメントまたは式( 命令型プログラミング言語 )で構成され、外部に移動できますプログラムのセマンティクスに影響を与えないループの本体。 ループ不変コードモーション(別名巻き上げまたはスカラープロモーション)は コンパイラの最適化 であり、この動きを自動的に実行します...

次のコードサンプルを検討すると、2つの最適化を簡単に適用できます。

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

計算x = y + zおよびx * xはループの外に移動できます。これは、ループ内で loop invariant —ループの繰り返しによって変更されないため、最適化されたコードは次のようになります。

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

このコードはさらに最適化できます...

56
thiton

これはhoistingまたはscalar promotionとも呼ばれます。 ここ を参照してください:

ホイストとは、ループ自体が操作の結果に影響しないため、ループから操作を引き出したことを意味します。あなたのケースでは、whileループから条件テストを引き上げています。

並べ替えとは、結果に影響を与えない方法で命令のシーケンスを変更することを意味します。通常、これは隣接する命令であり、データの依存関係はありません。次の2つのステートメントを実行する順序は関係ありません。

int a = x;
int b = y;
10
Geek

制御フラグの削除の変形のように見えます(Fowlerのpp 245 Refactoring

PHP例は DZoneで見つかります のようになります。

4
Gary Rowe

私はそのようなリファクタリングが存在するとは思わない。

したがって、「リファクタリングのリスト」の中から見つけるのは難しいでしょう。

私はその例をリファクタリングではなく最適化としてクラス化します。

私にとってリファクタリングとは、コードに変更を加えて、動作に影響を与えずにコードを理解しやすくすることです。

私にとって最適化とは、パフォーマンスを改善するためにコードを変更することです。

最適化されたコードは理解しにくい傾向があるためです。 2つのプラクティスは、相互に作用する傾向があります。

0
JW01