R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

if 文怖い(その2)

http://blogs.wankuma.com/rti/archive/2008/11/05/160519.aspx
if 文怖い

の続きです。

行が選択されている場合のみ有効なコマンドがあるとします。
これは、以下のコードのように「行が選択されていればコマンドを有効にする」という考え方ができます。


if (selectedRowCount > 0) {
  printButton.Enabled = true;
  deleteButton.Enabled = true;
}
else {
  printButton.Enabled = false;
  deleteButton.Enabled = false;
}


一方で、以下のコードのように「このコマンドが有効な場合は行が選択されている場合である」という考え方もできます。


printButton.Enabled = selectedRowCount > 0;
deleteButton.Enabled = selectedRowCount > 0;


僕は

if 文を使わない

こっちの方を好んで書きます。

また、比較演算を 2 回処理させるのは嫌なので、以下のように書き換えます。


printButton.Enabled = deleteButton.Enabled = selectedRowCount > 0;


でも、更に複雑になる場合は、以下のように目的を明確にします。


var existSelectedRow = selectedRowCount > 0;
printButton.Enabled = existSelectedRow;
deleteButton.Enabled = existSelectedRow;


条件演算子も使いますが、このケースは稀です。


class HogeHoge {
  public string Method(int i) {
    return
      i == 0 ? "A" :
      i == 1 ? "B" :
      i == 2 ? "C" : string.Empty;
}


else if を繰り返すような書き方はしたことがありません。
switch case も嫌いです。

条件演算子が唯一許せる理由は、流れ制御をしないからです。

オブジェクトを使うことも多いです。


class BaseClass {
  public int Value { get; protected set; }
  public string Text { get; protected set; }
}

class A : BaseClass {
  public A() {
    base.Value = 0;
    base.Text = "A";
  }
}

class B : BaseClass {
  public A() {
    base.Value = 1;
    base.Text = "B";
  }
}

class C : BaseClass {
  public A() {
    base.Value = 2;
    base.Text = "C";
  }
}

class HogeHoge {
  public string Method(BaseClass x) {
    return x == null ? string.Empty : x.Text;
  }
}


最近は enum を使う場面で、最初から上記を使ってしまうことの方が多くなりました。

投稿日時 : 2008年11月6日 13:49

Feedback

# re: if 文怖い(その2) 2008/11/06 14:24 みきぬ

大体イメージがつかめました。ありがとうございます。

> printButton.Enabled = selectedRowCount > 0;
これは私もよく使います。

> オブジェクトを使うことも多いです。
Strategy パターンってやつですかねぇ。
# 実はいまだにデザインパターンをきちんと理解していない(恥

私は説明のしやすさをとって、enum と Select Case を使ってしまうことが多いですね。
こんな感じ?

enum OperationType {
A,
B,
C
}

class HogeHoge {
private string getText(OperationType value) {
switch (value)
{
case OperationType.A:
return "A";

case OperationType.B:
return "B";

case OperationType.C:
return "C";
}
}

public string Method(OperationType value) {
return x == null ? string.Empty : getText(value);
}
}

主要な処理の部分では分岐を避けているとも言えるので、思想は案外共通しているのかも?

# re: if 文怖い(その2) 2008/11/06 14:49 じゃんぬねっと

おー、やはり私とほぼいっしょ。
だけど私は括弧で括って明示するぞい。

# re: if 文怖い(その2) 2008/11/06 15:17 渋木宏明(ひどり)

>if 文を使わない

同じく。

>でも、更に複雑になる場合は、以下のように目的を明確にし

も同じく。

ちなみに、「複雑かどうか」の僕の判定基準は「3つ以上」です。

>switch case も嫌いです。

も同じ。

条件が3つ以上になる場合は、Dictionary でジャンプテーブル作ってます>じぶん

# re: if 文怖い(その2) 2008/11/06 22:42 よねけん

私もおんなじようなことはしますね。
仕事ではメンバーのスキル等も考慮して
そうするかどうかはいつも同じではないですが。

> 条件演算子が唯一許せる理由は、流れ制御をしないからです。

言葉のあやだと思いますが、この説明の「流れを制御しない」は違うと思います。条件演算子は見た目が違うだけで、
if文同様に流れを制御しています。
テストパターンは変わりませんから。

# re: if 文怖い(その2) 2008/11/07 13:56 R・田中一郎

みきぬ さん

>Strategy パターンってやつですかねぇ。

ですね~

># 実はいまだにデザインパターンをきちんと理解していない(恥

ご提示いただいたサンプルコードは Strategy パターン に置き換えやすいと思います。
>
>私は説明のしやすさをとって、enum と Select Case を使ってしまうことが多いですね。

enum で分類した種類に、もっといろいろなものを付加したくなる場合ってありませんか?
OperationType をユーザーに選択させるために選択肢として日本語の題名をつけたいとか、OperationType.A は、クイックソートで、OperationType.B はバブルソートで、OperationType.C はシェルソートを使って処理したいとか・・・
置き換えてみると、かなりハマりますよw

>主要な処理の部分では分岐を避けているとも言えるので、思想は案外共通しているのかも?

そう思います。

------------------------------
じゃんぬねっと さん

>だけど私は括弧で括って明示するぞい。

あー、僕もそうしていたんですが、最近はさぼり癖がついてきちゃいました^^;

------------------------------
渋木宏明(ひどり) さん

>条件が3つ以上になる場合は、Dictionary でジャンプテーブル作ってます>じぶん

確かに・・・一回作れば、使い回しが楽ですもんね。

------------------------------
よねけん さん

>仕事ではメンバーのスキル等も考慮して

ですよねー
メンバーによっては、独りよがりなコードになってしまうことが悲しい。

>> 条件演算子が唯一許せる理由は、流れ制御をしないからです。
>
>言葉のあやだと思いますが、この説明の「流れを制御しない」は違うと思います。条件演算子は見た目が違うだけで、

この一文を書いた時に、このご指摘は覚悟していました。
仰る通り、微妙な解釈の違いだと思います。

仕組みとしては実際に流れ制御をしていますが、条件演算子という名前の通りコード上では単なる演算子として考えてしまって良いと思っています。

# re: if 文怖い(その2) 2008/11/07 16:12 みきぬ

> enum で分類した種類に、もっといろいろなものを付加したくなる場合ってありませんか?
> OperationType をユーザーに選択させるために選択肢として日本語の題名をつけたいとか、OperationType.A は、クイックソートで、OperationType.B はバブルソートで、OperationType.C はシェルソートを使って処理したいとか・・・

その場合は、それ用に switch 文を1つ追加することで対応しますね。それが複数箇所で利用されるものなら、共通メソッドとしておいて。
異論があることは承知しているんですが、A, B, C という Strategy で仕分けされているよりも、分岐した先で何をしているのかが一箇所に固まっているほうにメリットを感じるんですよね。
それに Strategy 使いましょう! という人に今まで出会ったことがない…。

> 条件演算子が唯一許せる理由は、流れ制御をしないからです。
ここって、if 文より if 式ということだと解釈したんですが、あってますか?
# VB だと IIF(Of T) を自前で作らないといけないところが悲しい。Option Strict On 環境で IIF は使いたくないし。

# re: if 文怖い(その2) 2008/11/07 23:40 よねけん

>>R・田中一郎 さん

「流れを制御しない」という表現が気になっただけなので、

> 仕組みとしては実際に流れ制御をしていますが、
> 条件演算子という名前の通りコード上では単なる演算子として考えてしまって良いと思っています。

この主張は私も同じ感覚ですねー。
#テストパターンは変わらないよと意識してないと
#見落としの危険があるけど

># VB だと IIF(Of T) を自前で作らないといけないところが悲しい。Option Strict On 環境で IIF は使いたくないし。

>> みきぬさん
># VB だと IIF(Of T) を自前で作らないといけないところが悲しい。Option Strict On 環境で IIF は使いたくないし。

VB2005前提の話ですか?
VB2008(VB9)だったらIf式がありますよ~。

# re: if 文怖い(その2) 2008/11/07 23:55 れい

まんじゅう嫌い、の類の話題かと思ったのに…。

私はif使いますね。その日の気分で。
やさぐれてる日は分岐条件が50個あるのにifで書いたり。
「僕は惨めな汚い人間なのでこんなコードしかかけないんです」
とか言いながら。
だんだん調子にのってくると
「これでもう誰にも読めないぜ!ざまみろ」
「こんなスパゲティ作れるのは俺しかいない!俺最強!」
「世界を混沌で埋め尽くしてくれるわ!!」
みたいなノリに。


で、結局あとで困って一人でコソコソなおします。

# re: if 文怖い(その2) 2008/11/08 11:04 みきぬ

> VB2008(VB9)だったらIf式がありますよ~。
おおっ! 知らなかった。VB2005 にもほしいなー。
http://msdn.microsoft.com/ja-jp/library/bb513985.aspx

# re: if 文怖い(その2) 2008/11/10 13:35 R・田中一郎

みきぬ さん

>異論があることは承知しているんですが、A, B, C という Strategy で仕分けされているよりも、分岐した先で何をしているのかが一箇所に固まっているほうにメリットを感じるんですよね。
>それに Strategy 使いましょう! という人に今まで出会ったことがない…。

あ~、じゃ僕が最初になりますw
「Strategy 使いましょう!」

>> VB2008(VB9)だったらIf式がありますよ~。
>おおっ! 知らなかった。VB2005 にもほしいなー。

VB は進化をつづけていますね~
次の VB とか凄いことになってます。

------------------------------
よねけん さん

>#テストパターンは変わらないよと意識してないと
>#見落としの危険があるけど

ですね。
注意しなくては・・・

------------------------------
れい さん

>まんじゅう嫌い、の類の話題かと思ったのに…。

落語ですかw

>だんだん調子にのってくると
>「これでもう誰にも読めないぜ!ざまみろ」

そういう気分になる気持ちって、何となくわかります。

>で、結局あとで困って一人でコソコソなおします。

そういうこともありますけど、ブラックボックスの内側ってことで放置しちゃうことも多いですよね^^;

# fBtezASBQnTPlyLAIk 2011/12/27 19:05 http://www.spytown.com/

I decided to help and sent a post to the social bookmarks. I hope to raise it in popularity!!...

# tYsWmclIGSNrbpyn 2011/12/29 20:26 http://www.healthinter.org/health/page/protonix.ph

However, the author created a cool thing..!

# fwKihfvetb 2012/01/07 8:45 http://www.luckyvitamin.com/m-1507-usp-labs

Author, keep doing in the same way..!

タイトル  
名前  
Url
コメント