R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

比較演算式へのこだわり

http://blogs.wankuma.com/shuujin/archive/2008/01/17/117872.aspx
(囚人のジレンマな日々)

を読んでいて、ふと思ったことがあったので、テーマを少し変えると共に、更に単純にしてみます。

 

10~20 であるかどうかを判断させる場合の比較演算式の書き方として、どのように書くことが「良いこと」なのか?


ちなみに、if のような条件式だとロジックによって答えが変わって来る場合もあると思うので、あくまでも真偽を得るための比較演算式として考えてみることにします。

今までに僕が、教わった方法は、以下の 2 通りの方法です。


10 <= x && x <= 20
x >= 10 && x <= 20


どちらも正しい

と教わりました。

前者が正しい理由は、10~20 という考え方に対して、最も直感的であるからだそうです。
数学的にも、 10 <= x <= 20 のように表現しますからね。

一方後者が正しい理由は、x が主であり、その主となるものの値が、どのような状態になっているのかを表すからだそうです。
「x は 10 以上である」「x は 20 以下である」の二つを、単純に条件式にすると自然と以下の表現になります。

x >= 10 && x <= 20

どちらも一理あるように思うのですが、僕は常に後者の書き方で統一しています。
と言うことで、後者派の立場になって、後者であるべき主張をしてみるテスト。

 

後者の書き方は、後からの変更において、例えば「但し、18 は対象外にする」という条件が加わった場合などの拡張性に優れています。

x >= 10 && x <= 20 && x != 18

また、x が常に左辺にある場合、次のように比較演算子と右辺の値だけを読めば良いのです。

>= 10 && <= 20 && != 18

なので、いつも以下のような記法が欲しいと思っています。

x : >= 10 && <= 20 && != 18

この場合、マジックナンバーを単純な変数に変えた場合でも、左辺を読む必要がないので可読性が高くなります。

x >= a && x <= b && x != c

ちなみに、常に「 >」 あるいは「 < 」 を使わない!、という人もいました。
例えば > しか使わないことにしている人は、以下のように書くのが回答になる訳です。

10 >= x && 20 >= x

これによって、比較演算子の < と > が混在することの混乱を無くせるのだそうです。

いろいろな人がいますが、恐らく、自分が常に使っているパターン以外で記述されているコードは気持ち悪いという点については意見が一致していることでしょう。

投稿日時 : 2008年1月23日 15:13

Feedback

# re: 比較演算式へのこだわり 2008/01/23 15:35 774RR

STL を多用してると比較は「operator< のみ存在する」前提で行ったりしますが
そーいう人は例外ですか、そうですね。

# 比較演算式への妄想 2008/01/23 15:38 Out of Memory

比較演算式への妄想

# 比較演算式への妄想 2008/01/23 15:46 Out of Memory

比較演算式への妄想

# re: 比較演算式へのこだわり 2008/01/23 16:04 NyaRuRu

Python だと a < b < c とか書けますね.

# re: 比較演算式へのこだわり 2008/01/28 18:06 R・田中一郎

774RR さん

>そーいう人は例外ですか、そうですね。

ちなみに・・・と言ったのがいけなかったのでしょうか^^;

-----------------------------------
NyaRuRu さん

>Python だと a < b < c とか書けますね.

ならば、

minValue <= targetValue <= maxValue

が良い書き方ということになりそうですね。

# re: 比較演算式へのこだわり 2008/01/29 15:40 NyaRuRu

>「operator< のみ存在する」前提

浮動小数点数の NaN が絡んでくる場合など,ソースコードに <, > を直接書いた場合と,operator< で置き換えた場合に差異が現れることがあります.
知ってて使うのは問題ないと思いますが,知らずに使ってるのはちょっと怖いですね.

http://d.hatena.ne.jp/NyaRuRu/20071125/p2

タイトル
名前
Url
コメント