14
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-04-01

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

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

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

よいと思われる例

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

推奨しかねる例

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

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

よいと思われる例

.cpp
// 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]に着目していて、いわば文の主語になっていることがわかる。

推奨しかねる例

.cpp
// 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++などのプログラムのソースコードについても言えるのではないでしょうか。

14
15
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?