if文の条件などに使われる真偽値は、trueとfalseどちらで統一すべきでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
0
ベストアンサー
if文の中は当然trueとfalseの両方が発生するので「統一」するものではないですね。
ですので、下記の前者で統一すべきか? 後者で統一すべきか?との質問と理解しました。
外していたらすいません。
C++
1if (今日は晴れ) { 2 // 晴れ処理 3} else { 4 // 晴れでない時の処理 5} 6 7if (今日は晴れでない) { 8 // 晴れでない時の処理 9} else { 10 // 晴れ処理 11}
私は原則として前者で統一しようと努力してます。
「晴れ処理」がなく「晴れでない時の処理」だけの時は、後者を使います。
他に、他の処理との絡みで処理の順序を合わせたい等の特殊事情があれば後者を使うこともあります。
あ、間違って条件を逆に書いてしまい、後からヒックリ返した時は後者になってしまうことも結構あります。可読性が低下するのであまり良くないのですが、一度動作確認できた条件文はあまり触りたくないのでつい。
投稿2015/11/30 04:34
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/11/30 13:43 編集
2015/12/02 03:28 編集
0
例えば、Trueで統一した結果、THEN節には処理がなく、ELSE節にのみ処理が存在するという結果になってしまったら、どう考えますか?
Trueに統一することで、下記のようなコードが頻発するようだと、特に統一のルールなど設けずに、ケースバイケースで良いのではないかと思います。
C
1 2if (条件式){ 3 // THEN節の処理無し 4} 5else { 6 i = a+b; 7}
投稿2015/11/30 03:41
編集2015/11/30 07:48総合スコア924
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
自分なら「何を判断したくて条件分を記述しているのか」がわかりやすいことを第一に考えます。
例えば、エラーの時に中断したい場合、
VB
1If isError = True Then 2 'エラー時 3 Exit Sub 4Else 5 '正常時 6End If
という感じになると思います。
同じ内容でも、エラーが発生していなければ実行したい、という場合であれば
VB
1If isError = False Then 2 '正常時の処理 3Else 4 'エラー時 5 Exit Sub 6End If
とすると思います。
もちろんどちらの条件も同程度という場合もあります。
そういう場合はTrueを優先して記述することが多いですが、If~Else~EndIfの関係が掴みやすくなるよう処理内容が少ないものを先に記述する場合もあります。
ここは人によって好みが分かれるかもしれません。
VB
1If isError = False Then 2 'エラー処理 3 Exit Sub 4Else 5 '正常処理 6 ・・・ 7 '(1画面に収まらないくらい長いコード) 8 ・・・ 9End If
本題からは少しずれてしまいますが、関数の戻り値についてはより注意深く戻り値を検討しています。
例えばチェック関数の戻り値の場合、基本的にはチェック結果が正常値の場合にTrue、異常値があった場合にFalseとするようにしています。
VB
1If CheckInputValue() = False Then 2 '異常値の場合 3Else 4 '正常値の場合 5End If
となるからです。
ただし、関数名をIsErrorとかFindErrorValueのようにつけた場合は、異常値をTrueとしたほうが自然になります。
大事なのは、何も知らない人がソースを読んだときにできるだけ自然な解釈で読めるよう心がけることだと思います。
投稿2015/11/30 05:32
編集2015/11/30 05:37総合スコア3013
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
すでにベストアンサーが決まっているようですが、私の場合は次の順で選びます。
##条件チェックする対象の値や論理表現が主(それに合わせてif文条件式を書く)
条件チェック対象の変数やオブジェクトとロジックの表現仕様が先であり、IF文内の表現の肯定否定はそれに合わせた後付けです。
分岐の際に、条件チェックする対象(オブジェクトなど)のプロパティやメソッド戻り値の表現が主で、IF文内の条件式はあくまでその表現と実現したいロジックとを合わせる従の存在です。
ご質問は、IF文で利用する想定の、状態を表現するBoolean変数を抜き出すとしたらどちらにするかとの趣旨なのかな?と解釈しました。
cs
1//開いてたら、閉じる。その1 2bool isClosed = ...; 3if(!isClosed) 4{ 5 Close(); 6} 7 8//開いてたら、閉じる。その2 9bool isOpen = ...; 10if(isOpen) 11{ 12 Close(); 13}
上記をふまえて、IF文の記述について言及させていただくと...私は基本的に
1. IF文条件式のコードを読んで、意味がわかりやすいほうにする。
csharp
1var fs = File.Open(); 2... 3if((fs != null) && (!fs.Closed)) 4{ 5// fsがnullではなくかつ、閉じられていなければ(fs.ClosedプロパティがFalseであれば)、閉じる(fs.Closeメソッドを呼ぶ)。 -> 閉じてほしいんだな。 6 fs.Close(); 7}
2. コード全体が簡素になるほうにしてコードの見通しを良くする
例えばサブルーチンやメソッドを記述している場合、コードが短くなるように、自ルーチン・メソッド内で処理する必要のない条件を先に抽出し、さっさと return してしまいます。 そのあとも、短いコードになるほうを真条件にしてメソッド内の上方に書くことで、自ルーチン・メソッドの可読性・ロジックの見通しやすさが上がります。あるロジックの結果に従属するロジックがあれば、当然その前後関係は保ちますが...
cs
1bool Func(string path, int numOfCopy) 2{ 3 // 引数チェック 4 if(String.IsNullOrEmpty(path)) 5 { 6 return false; 7 } 8 if(!System.IO.File.Exists(path)) 9 { 10 return false; 11 } 12 if(numOfCopy < 1) 13 { 14 return false; 15 } 16 // 本処理 17 int idx = 1; 18 for(... 19 ... 20 ... 21 ... 22 return true; 23}
投稿2015/12/02 00:50
編集2015/12/02 01:01総合スコア728
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。