R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

ガード句っぽい選択

IF 文が嫌い

なので、こうしてみた。

 

public MemberTotalItem GetGeneration(int age) {
  return
    age >= 60 ? Over60 :
    age >= 50 ? Over50 :
    age >= 40 ? Over40 :
    age >= 30 ? Over30 :
    age >= 20 ? Over20 : Under20;
}

 

アリ?

ナシ?

投稿日時 : 2010年6月24日 16:37

Feedback

# re: ガード句っぽい選択 2010/06/24 18:49 かたぎり

Select Case 文がないなんて、かわいそうなC#

# re: ガード句っぽい選択 2010/06/24 20:03 ちゃっぴ

気持ち悪い。

# re: ガード句っぽい選択 2010/06/24 20:11 aetos

なし。3項演算子の方が余程嫌い。

# re: ガード句っぽい選択 2010/06/24 20:43 よねけん

この例だけで言えば”あり”だけど、その記述パターンの適用OK範囲を明確にしづらいので仕事だと”なし”。

# re: ガード句っぽい選択 2010/06/24 21:37 ground

個人的には大賛成。
この例だとreturnしてるからifでも良いけど、returnしない場合は「if」と「else if」の幅が違うから、こういう例では参考演算子を用いることが多い。

# re: ガード句っぽい選択 2010/06/24 21:39 Gushwell

3項演算子使うけど、
こういう書き方は、したこと無いです。
なので、アリ?ナシ? と聞かれれば、ナシ です。

# re: ガード句っぽい選択 2010/06/24 21:41 επιστημη

「けしからん!」と断言するほどナシじゃないけどぉ、
if ... else if ... else ... じゃダメなの? 程度にナシ。

# re: ガード句っぽい選択 2010/06/24 21:57 επιστημη

>「if」と「else if」の幅が違うから

きれいに並んでないときしょいときは:

if (false) {} // 空撃ちif文
else if ( age > 60 ) return Over60;
else if ( age > 50 ) return Over50;
...
else return Under20;

ってやるます。

# re: ガード句っぽい選択 2010/06/24 22:23 みきぬ

個人的にはあり。積極的にやろうとは思わないけど。

Dictionary<int, MemberTotalItem> dic = new Dictionary<int, MemberTotalItem>() {
{ 60, Over60 },
{ 50, Over50 },
{ 40, Over40 },
{ 30, Over30 },
{ 20, Over20 },
{ 0, Under20 }
};

return dic.First((pair) => age >= pair.Key).Value;

とか思いついてみた。

# re: ガード句っぽい選択 2010/06/24 22:27 まりも

見なれればわかりやすいのでしょうが、
見なれるほどこの記法を使うとは思えないので、
なしと言っておきます。

私だったら似たような記述ができるクラスなんかを自作しますかね。
クラスだったら中でなんかよきに計らってくれているのだろうと思えますが、
基本文法だけでやっていると、解析しようとしてしまうので。

# re: ガード句っぽい選択 2010/06/24 23:41 刈歩 菜良 CTP

s/IF文が嫌い/if文が嫌い/

は、さておいて。
C、C++的にはありだけど、C#的にはなし。
昭和のかおりがプンプンします。

# re: ガード句っぽい選択 2010/06/24 23:58 enrike

ガード句としてはナシですが、lambda中毒の人が多分岐「式」を書くためなら有りだと思います。というかC#では三項演算子のネスト以外の方法で多分岐「式」を書けないのでは。

# それクラスにしちゃお的なアプローチ 2010/06/25 1:08 C#と諸々

ガード句っぽい選択あー本題からそれてるような気もしますが。あと型名勝手に変えちゃいましたが。class Generation{&#160;&#160;&#160; public static readonly ...

# re: ガード句っぽい選択 2010/06/25 1:45 渋木宏明

ない。

匿名型と LINQ 使って書くもん。

3項演算子は真面目に書くときはネストさせない。

# 
Ito Blog
&raquo; Blog Archive

&raquo; ??????????????????????????? 2010/06/25 14:52 Pingback/TrackBack


Ito Blog
&raquo; Blog Archive

&raquo; ???????????????????????????

# re: ガード句っぽい選択 2010/06/25 15:11 R・田中一郎

皆さんご意見をありがとうございました~
予想通り「なし」の人が多かったのですね。

# re: ガード句っぽい選択 2010/06/25 15:55 とっちゃん

じゃぁありで。この程度ならたぶん3項演算子で書いちゃう。

ちなみに...
  if (age >= 60) return Over60;
  if (age >= 50) return Over50;
  if (age >= 40) return Over40;
  if (age >= 30) return Over30;
  if (age >= 20) return Over20;
  return Under20;
は、ガード句とは言いません。

もし、ここでガード句を書くとしたら、
Debug.Assert( age >= 0 );
if( age < 0 ){
 throw ArgumentException( "年齢にマイナスはダメだろ?", "age" );
}
//以下省略...

です。


ガード句は、本来来ないはずのパラメータをあらかじめチェックしておくということを
処理の内部ではなく最初におこなうことを指します。

信じられないような使い方をする素人が困らないように
自己テストするコードをかっこよく言い換えたにすぎません。

ガード(盾)は、自分自身を防御するための仕組みであって
先頭にif文が並ぶことではありません。

# re: ガード句っぽい選択 2010/06/25 16:41 R・田中一郎

なるほど~
if 文で追い出した後に、実際の処理を書く例を多く見てきたので、if文で処理を抜けるものを広い意味でガード句というのだとばかり思っていました。

# re: ガード句っぽい選択 2010/06/25 16:53 とっちゃん

多くの場合で if で記述が最もわかりやすいので、ガード句はifの羅列になってることが多いというだけですね。

switch のほうがいい場合はswitch で記述しますよ。

# ガード句っぽい選択 2010/06/26 1:01 .NET Clips

素敵なエントリーの登録ありがとうございます - .NET Clipsからのトラックバック

# re: ガード句っぽい選択 2010/06/29 9:20 読者

示されたコードは、自分的には無しだけど。

アセンブラレベルまで落とすと、if文に変わるj○等に変わるのでは?
結局IF文が嫌いと言いながらも、中では使われているのではないのでしょうか。

# re: ガード句っぽい選択 2010/06/29 13:58 R・田中一郎

高級言語の記法の話ですから、アセンブラレベルに落としたあとの状態で考えるのは少し違う気がします。

タイトル
名前
Url
コメント