Wednesday, June 26, 2013

クリーンコードその1

前から後ろへ上から下に順を追って読めるコード

プログラムを読むとき頭の中は基本的にスタック構造になってると思います。なので、頭の中のスタックのソートや順番の入れ替えが内容にプログラムを書くと読みやすくなると思います。

制御分は前におく

my $hoge;
$hoge += $_ foreach (@huga);
return $hoge if ($hoge % 2 == 0);

perlなどでは、if forなど後置制御文があります。この書き方はステートメントが出現した後にその式を司る制御分が出てくるため、一度頭にステートメントをスタックした後でその前に制御分を差し込む必要が出てしまいます。このせいで、一度認識している処理の流れを捨てて新しい処理の流れの理解する必要が出てきます。なのでステップ数は多くとも制御分は前置きにした方が自然な流れでコードが読み進められると思います。

my $hoge;
foreach (@huga) {
    $hoge += $_;
}
if ($hoge % 2 == 0) {
    return $hoge;
}

map, grepは単発にする

my @even_score = grep { 
    $_ % 2 == 0 
} map { 
    $_->score 
} grep {
   not $_->is_viewer($viewer)
}@user_score;
JSとかのmap, grepは大丈夫なのですが、perlのmap, grepはそれがつながっている場合、前半の処理が後続のmap, grepの結果に依存するため、一度読んでいる箇所からmap, grepのチェーンが終わるところに飛びそこから逆に読み進めていく事となるせいで、読む流れが途切れてしまいます。こちらもステップ数が増えてでも1つの処理毎に一時変数に値を取って書くのが良いと思います。

my @other = grep { not $_->is_viewer($viewer) } @user_score;
my @value = map { $_->score } @huga;
my @even_score = grep { $_ % 2 == 0 } @value;