necotech blog

条件分岐をなくす

ループするやつ

0 → 1 → 2 → 0 → 1 → 2 → …

x += 1
if(x == length) x = 0

x = (x + 1) % length

1 → 2 → 3 → 1 → 2 → 3 → …

x += 1
if(x > length) x = 1

x = x % length + 1

2 → 1 → 0 → 2 → 1 → 0 → …

if(x == 0) x = length
x -= 1

x = (x - 1 + length) % length

下記みたいな処理はJavaScriptでよくやります。

next_index = (current_index + 1) % length;
prev_index = (current_index - 1 + length) % length;

角度

0 <= angle < 360 に収める処理

if(angle < 0) angle += 360
if(angle >= 360) angle -= 360

angle = (angle + 360) % 360

ある条件を満たす場合に関数を実行

if(is_valid()) fn()

is_valid() && fn()

上記は特に読みやすくもなっていないように見えますが、文で書かれているものを式で表現することができるという利点があります。つまり、式を評価した値をそのまま使う(変数に代入したり、別の関数の引数にしたりする)ことができるようになります。(※言語によります。)

JavaScriptではデフォルト引数を設定するイディオムに、下記のようなものがあります。(※下記コードには、真偽判定による問題点があります。引数を渡さなかった際にデフォルト値を使う場合の注意点を参照。)

var f = function(arg){
  arg = arg || 1;
  // ...
}

条件分岐を隠蔽する(PHP)

これまでの例とはちょっと違いますが、頻出する条件分岐は抽象化してしまった方が読みやすくなるケースがあります。

$x = isset($array["key"]) ? $array["key"] : null;

function elem($array, $key, $default=null){
  return isset($array[$key])) ? $array[$key] : $default;
}

$x = elem($array, "key");

ここまでの例・考え方を適用することで、全てが必ずしも最適化されたり読みやすくなる訳ではありません。が、手段を複数用意して適材適所で選択できるようになることは、意義のあることだと思います。

Facebook にシェア
LinkedIn にシェア
Pocket