はじめに
ふとしたきっかけで"みんな何も言わずにこういうルールでやってるんだろう"という自分の思い込みに気づいた。
ifを使うときの比較演算子
最近人のコードを見ていて次のようなコードが合って
if (a > b) {
// 処理
}
これは次のようにしたほうがわかりやすいんじゃないかなと思ったわけです
if (b < a) {
// 処理
}
理由としては、条件として値の比較を使う場合に"比較演算子の左側を常に小さいものを置く"というルールを縛っておくと一貫性がありますよと。
また、比較したい値の条件は複数ある場合が多く、下記のようなコードを書くことが多いですよね。
if (b < a && a < c) { // 数学でよくみるこういうやつ b < a < c をやりたい
// 処理
}
これを同じ結果のまま最初のやり方でやろうとすると次のようになります
if (a > b && a < c) { // 数学でよくみるこういうやつ b < a < c をやりたい
// 処理
}
前者は数学でよく見る範囲の関係性に近づけていると読む方はスムーズに読めて、
後者は日本語で表現すると「値aがbより大きい時」かつ「値aが値cより小さい時」っていう考え自体をそのままコーディングしているわけです。主語がaという値で考えて比較をしてるという表現ですかね。
自分の頭のなかでも一旦日本語で主語があり比較を考えてるのかもしれないけど、自然に置き換えてて前者の範囲で捉えるやり方で書いたりしてたわけですよ。みんなそうだと思ってて疑いもしなかった。
ここまでのまとめ
- 条件で比較を表すときに左に小さい方を置く方法を"範囲比較法"としとく
- 条件で比較を表すときに比較の主語になる値を左に置く方法を"主語比較法"としとく
- コーディングしてる時は頭のなかで"主語比較"をしてるかもしれないけど実際にコードにするときは"範囲比較法"をとっていた
- 自分はこれがあたりまえだと思っていた
forでの比較演算子
forではみんな範囲比較してるんじゃないのという気がしたのでforについて考える。
例えばfor文でこんなのあるじゃないですか
for (i = 0; i < max; i++)
これもiを左においている。ここでは
- 条件として成立するとき小さくなる方を左においている(範囲比較法)
とも考えられるけど
- iに対して条件を設定している(主語比較法)
とも考えられるのでどっちとも取れる。
じゃあmaxの値から0になるまでカウントダウンするならどうかと考えると自分だと"範囲比較法"で次のようになる
for (i = max; 0 <= i; i--)
分かりやすい...めっちゃ分かりやすいしこれ以外ないでしょ...と思ってたら教えてもらったのがGitHubで"for i--"を条件に検索した結果
大半が下記のようにまずiを左においていて主語比較法になっていました。
for (i = max; i >= 0; i--)
結論
GitHubの検索結果として大半がi >= 0を使っているということはifでの比較も主語比較を行っていると思えるのでかなり衝撃ですわ(ですわっていうのはお嬢様が今日はお天気もよくピクニック日和ですわ、に使われるですわではない方)。
思い込みと習慣ってすごい。これから主語比較法で書いてったほうがいいかもしれないがかなりの違和感がある。