if not と unless の使い分け
周辺で話題になったので書いておく。if notとunlessをどう使い分けるか。
検索してみると、青木さんのRubyCodingStyleや、前田さんのRubyコーディング規約などが目に付く。どうやら、世間での標準は、「使えるところではなるべく unless を使い、if not は使わない」ということらしい。
が、僕の場合はちょっと違うので書いておく。他にもこういう人はいるだろうか?
正常処理の分岐にはif not、異常処理にunless
使い分けは簡単明瞭(だと思う)。正常処理の分岐にはif not、異常処理(例外処理)にはunlessを使うというもの。また、if文を使って正常と異常を分岐する場合は、どんなときでも if <正常> else <異常> end となるようにしている。notが入ろうが入るまいが。
このようにする理由はいくつかある。上から順に大きな因子。下に行くほど、いわゆる"消極的な理由"だ。
- このように使い分けることで、処理の内容と例外処理の箇所が明瞭になる。
- エラー処理の場合、常に(どんなに複雑な条件式であろうが)、unless <正常状態> then raise エラー end という風に統一して書くことが出来る。assert に似てるかも。
- unless 文に or や and が入ると、理解しづらい。and や or が入った時点で if に切り替える、という意見も聞いたが、だったら最初から if で書く。
- 「〜でない場合〜」というほうが、思考的に自然。ワタシニホンジン、エイゴワカラナイ(誰
- unless 文に else が付くとわかりづらい
- unless のほうが簡潔、という意見も聞くが、文字数は一緒。
- 「機能があるからなるべく使う」というのは好きではない。if not を unless にする積極的な理由があまりない。
- 青木さんは
if と unless どっちを使うか。 unless が使えるときは積極的に使う。 else も入ってきたら重要なほうが前に来るように使いわける。
と書かれているが、節の順番は if not と unless の選択には関係ない - if notを使ってると馬鹿っぽい、という意見も聞くが、そんなの関係ねぇ