視点がさまよっているif文,for文は読みにくい


リファクタリングが必要になってC++のソースコードを読んでいる。

わかりにくいソースコードの1つの要因は、ソースコードで変数に着目する際に視点がさまよっていることであることに気づいた。

for文の場合、制御変数にしたがって視点が動いていく。その制御変数に沿った視点で現象を記述していくことで現象が理解しやすくなる。

よいと思われる例

for(int x = 0; x < n; x++){
    if(x > a){
    doSomething(x);
    }
}

推奨しかねる例

for(int x = 0; x < n; x++){
    if(a < x){
    doSomething(x);
    }
}

いま、xが物事を評価するうえでの基準となる着目している変数だとしたら、
if(x > a){
doSomething(x);
}
と書くべきと考える。

よいと思われる例

// new[i]が [a[i], b[i]]の範囲になるようにクリッピングする。
for(int i=0; i<n; i++){
    if(new[i] < a[i]){
        new[i] = a[i];
    }else if(new[i] > b[i]){
        new[i] = b[i];
    }
}

この例ではnew[i]に着目していて、いわば文の主語になっていることがわかる。

推奨しかねる例

// new[i]が [a[i], b[i]]の範囲になるようにクリッピングする。
for(int i=0; i<n; i++){
    if(a[i] > new[i]){//ここしか変えていない
        new[i] = a[i];
    }else if(new[i] > b[i]){
        new[i] = b[i];
    }
}

ここでは、1箇所しか変えていないのに、先の表現に比べるとわかりやすさを低下させているように思う。
左辺式になって値が書き換えられる側は、目立つようにするのがよい(比較の左側におく)。

英文を書く際に、能動態の文と受動態の文が混在して視点が定まらない文章はよくない文章だという指摘を受けたことがある。
それと同じことがC/C++などのプログラムのソースコードについても言えるのではないでしょうか。