C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 関数の真偽によってその他の関数の実行を制御したい


(過去ログ 118 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■68892 / inTopicNo.1)  関数の真偽によってその他の関数の実行を制御したい
  
□投稿者/ krk (1回)-(2013/11/24(Sun) 03:05:02)

分類:[C#] 

初めまして。いつもお世話になっています。
C#に関する質問です。

早速ですが、
真偽を返す関数がいくつも存在するとします。(たとえば、A(), B(), C(), D()...)
また、処理は関数内のみで完了するものとします。
上から順番に関数を実行して、ある関数が真を返す場合にはそれ以下の関数は実行しないようにしたい場合に、

if(!A()){ }
else if(!B()){ }
else if(!C()){ }
else if(!D()){ }
...
----------------

if(A() || B() || C() || D() || ...){/*処理なし*/}

----------------

bool b = A() || B() || C() || D() || ...;
// bは使用しない
----------------

以上のうち、どの書き方が一番よいのでしょうか?
又は、他にいい書き方がありますでしょうか。
どの書き方も、何となく気持ちがわるくて、もっといいやり方があるんじゃないかと考えてしまいますが、思いつきません。
ご教授いただけますと幸いです。よろしくお願いいたします。
引用返信 編集キー/
■68893 / inTopicNo.2)  Re[1]: 関数の真偽によってその他の関数の実行を制御したい
□投稿者/ 774RR (120回)-(2013/11/24(Sun) 07:04:23)
どれでも同じだから、単に気分の問題ならどう書いてもいい。

void func() {
  if (A()) return;
  if (B()) return;
  if (C()) return;
  D();
}
とかでもいいかもしれないし。

なぜ気持ち悪いのか
どのへんがが気持ち悪いのか
自己分析してみるといいかもしれないな。

引用返信 編集キー/
■68894 / inTopicNo.3)  Re[1]: 関数の真偽によってその他の関数の実行を制御したい
□投稿者/ Jitta (104回)-(2013/11/24(Sun) 10:14:08)
Jitta さんの Web サイト
No68892 (krk さん) に返信
> 初めまして。いつもお世話になっています。
> C#に関する質問です。
>
> 早速ですが、
> 真偽を返す関数がいくつも存在するとします。(たとえば、A(), B(), C(), D()...)
> また、処理は関数内のみで完了するものとします。
> 上から順番に関数を実行して、ある関数が真を返す場合にはそれ以下の関数は実行しないようにしたい場合に、
>
> if(!A()){ }
> else if(!B()){ }
> else if(!C()){ }
> else if(!D()){ }
> ...
> ----------------
>
> if(A() || B() || C() || D() || ...){/*処理なし*/}
>
> ----------------
>
> bool b = A() || B() || C() || D() || ...;
> // bは使用しない
> ----------------
>
> 以上のうち、どの書き方が一番よいのでしょうか?
> 又は、他にいい書き方がありますでしょうか。
> どの書き方も、何となく気持ちがわるくて、もっといいやり方があるんじゃないかと考えてしまいますが、思いつきません。
> ご教授いただけますと幸いです。よろしくお願いいたします。

「もっと良いやり方」という曖昧な言葉ではなく、不満な点、解消したい点を明確にしてください。
あなたの中にある「不満に思っている点」は、誰にものぞき見ることはできません。


> 上から順番に関数を実行して、ある関数が真を返す場合にはそれ以下の関数は実行しない
 最初の if 文の列は、この文をそのままコードに変換しています。
つまり、「実行したいこと」を一番的確に表現できています。
それよりも「もっと良いやり方」とは、何を基準に「良い」「悪い」を判断するのでしょうか。

> if(A() || B() || C() || D() || ...){/*処理なし*/}
> bool b = A() || B() || C() || D() || ...;
 これらが「何となく気持ちがわる(い)」のは、使用しない処理があるからでしょう。



Func<bool>[] funcs = new Func<bool> { A, B, C, D };
foreach (var f in funcs)
{
  if (f() == true)
  {
    return;
  }
}

だったかな?とか。
引用返信 編集キー/
■68900 / inTopicNo.4)  Re[2]: 関数の真偽によってその他の関数の実行を制御したい
□投稿者/ krk (2回)-(2013/11/24(Sun) 14:46:56)
2013/11/24(Sun) 14:47:27 編集(投稿者)
2013/11/24(Sun) 14:47:23 編集(投稿者)

774RRさん、Jittaさん、ご返信ありがとうございます。

774RRさん>
>なぜ気持ち悪いのか
>どのへんがが気持ち悪いのか
>自己分析してみるといいかもしれないな。
1),2)のやり方は、if文を使っているのに対応する処理を行っていないこと、
3)のやり方は、変数を宣言しているのにそれを使用していないこと
が、何となく気持ち悪かったのです。説明が不足していて申し訳ありませんでした。
おっしゃる通り、実際に処理は通りますので、
人によっては特に問題にしないのかもしれません。

Jittaさん>
>「もっと良いやり方」という曖昧な言葉ではなく、不満な点、解消したい点を明確にしてください。
>あなたの中にある「不満に思っている点」は、誰にものぞき見ることはできません。
その通りですね。
曖昧な質問で本当に申し訳なかったです。

>> 上から順番に関数を実行して、ある関数が真を返す場合にはそれ以下の関数は実行しない
> 最初の if 文の列は、この文をそのままコードに変換しています。
>つまり、「実行したいこと」を一番的確に表現できています。
>それよりも「もっと良いやり方」とは、何を基準に「良い」「悪い」を判断するのでしょうか。
後から読んで処理がすっと理解できるかな?と疑問に思ったのです。
もっと的確にやっている処理がわかりやすい書き方(これも抽象的な表現ですが・・・)
が存在するのではないかと思って質問させていただきました。

>> if(A() || B() || C() || D() || ...){/*処理なし*/}
>> bool b = A() || B() || C() || D() || ...;
> これらが「何となく気持ちがわる(い)」のは、使用しない処理があるからでしょう。
まさにその通りです。以前、どこかで空のif文は是か非かという内容のスレッドを見たことが
あったので、こういう書き方が許容されるのかどうかを知りたかったのです。

ちなみに、お二方がご呈示くださったコードは上記「気持ち悪さ」をうまく解決
されていて、非常に参考になりました。ありがとうございました。
解決済み
引用返信 編集キー/
■68923 / inTopicNo.5)  Re[2]: 関数の真偽によってその他の関数の実行を制御したい
□投稿者/ 魔界の仮面弁士 (425回)-(2013/11/25(Mon) 11:21:48)
No68894 (Jitta さん) に返信
> Func<bool>[] funcs = new Func<bool> { A, B, C, D };
この部分は、
 Func<bool>[] funcs = new Func<bool>[] { A, B, C, D };
かも。

解決済み
引用返信 編集キー/
■69297 / inTopicNo.6)  Re[3]: 関数の真偽によってその他の関数の実行を制御したい
□投稿者/ 日本の人です (1回)-(2013/12/14(Sat) 17:49:37)
日本の人です
はじめまして
ホームページ作成
みんなを歓迎して予約購入します
これからも宜しくお願いします
協力は楽しいです
http://414loving.com/?i=l
http://414loving.com/?i=m
http://414loving.com/?i=n

引用返信 編集キー/
■69307 / inTopicNo.7)  Re[3]: 関数の真偽によってその他の関数の実行を制御したい
□投稿者/ shu (452回)-(2013/12/16(Mon) 10:28:41)
2013/12/16(Mon) 10:33:22 編集(投稿者)

No68900 (krk さん) に返信

書き方をスマートにするなら

bool res = false;
if (!res) res = A();
if (!res) res = B();
if (!res) res = C();
if (!res) res = D();

とするのもよいかと思います。
条件判定的には無駄が発生します。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -