掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
If文またはSelect文を効率よくコーディングするには? (ID:143335)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> bが1かつ2かつcが3かつ4ならフラグを立てる たとえば、b が 2 で c が 3 のときは、上記条件に合致しませんよね。 この場合にフラグが立つ状況というのは、b と c それぞれに 何という数値が入っている場合のことでしょうか? > Elseif b = 2 OrElse b = 3 AndAlso d = 1 AndAlse d = 2 AndAlso c = 5 then 上記と同じ理由で、「d = 1 AndAlse d = 2」などは、条件として不自然です。 「d = 1 OrElse d = 2」とか、「x = 1 AndAlso y = 2」とか、 「d >= 1 AndAlso d <= 2」などであれば分かりますけれども。 > のような内容です。 そもそもの設問に無理がありますし、「フラグ」および変数 flg の意図も読み取れません。 この場合の flg とは、なにを管理する値なのでしょうか? 提示されたコードでは、初期値 0 に対して、各種条件で 0 をセットしてますが、 それってなにもしなくても同じことですよね。質問の意図が読み取れませんでした。 > こんな簡単な内容で申し訳ないのですがよろしくお願いします。 一般論として、「flg」のような変数名は付けるべきではありません。 flg = 0 がどういう状態を意味しているのか、コードを読む第三者には 伝わりませんし、flg = -1 や flg = 9999 が許容されるのかも不明です。 状態を表す変数を使うのであれば、 Dim dataReady As Boolean If dataReady Then 'データの準備ができているとき Dim selectedReportType As ReportType If selectedReportType = ReportType.DailySales Then '「日別売上」という帳票が選択されたとき などのように、コメント無しでもある程度意味がつかめる名前にするべきですし、 値についても、0 や 1 といったマジックナンバーではなく、 Boolean、列挙型、定数値などを用いて表現するようにします。 また、If 文に付いてですが、あまり複雑な判定文とになるときには一時変数を利用します。たとえば、 If document.AtEndOfStream() AndAlso Not inputError AndAlso MIN_LINES <= lineCount AndAlso lineCount <= MAX_LINES AndAlso Not ErrorProcessing() Then のような長い判定文だと、コードの意図を読み取りにくいですが、 Dim allDataRead As Boolean = document.AtEndOfStream() AndAlso Not inputError Dim legalLineCount As Boolean = MIN_LINES <= lineCount AndAlso lineCount <= MAX_LINES If allDataRead AndAlso legalLineCount AndAlso Not ErrorProcessing() Then のようにまとめると、何をするための処理かが分かりやすくなります。 もう一つ、提示いただいたコードの > c = 6 OrElse c = 7 OrElse c = 8 といった Or の処理ですが、同じ値に対する判定数が多い場合には、 Select Case c Case 6, 7, 8, 12 のように、Select Case を使って処理することができます。 ただし、 > b = 5 AndAlse c = 6 OrElse c = 7 OrElse c = 8 のように、他の変数の判定も行う場合は、Select Case では 対処しにくい場合があると思います。このような場合には、 Private editableColumns As New List(Of Integer)() Private Sub Form1_Load(…… editableColumns.Add(6) editableColumns.Add(7) editableColumns.Add(8) editableColumns.Add(12) End Sub のように、値の条件をあらかじめ配列やList型の変数にまとめておくと便利です。 そうすれば、 If baseRow = 5 AndAlso (col = 6 OrElse col = 7 OrElse col = 8 OrElse col = 12) Then のようなコードを If baseRow = 5 AndAlso editableColumns.Contains(col) Then のようにまとめられるので、判定数が多くなっても対処しやすくなります。 もう一点。たとえば If b = 5 AndAlso c = 6 OrElse c = 7 OrElse c = 8 Then '変更前 のようなコードの場合、括弧の併用を検討してみてください。たとえば、 If (b = 5 AndAlso c = 6) OrElse (c = 7 OrElse c = 8) Then 'パターン1 If b = 5 AndAlso (c = 6 OrElse c = 7 OrElse c = 8) Then 'パターン2 などに書き換えるという事です。(上記 2 つは、異なる意味を持ちます) このようにすると、And と Or の優先順位を知らない人にとっても、コードが読みやすくなります。 なお言語仕様的には、And は Or よりも優先される(* や / が、+ や - より優先されるのと同じ)ため、 変更前のコードはパターン1 の動作を意味します。パターン2の動作とはならないことに注意してください。 演算子の優先順位を理解している人の中には、And/Or を交えた複合条件でも括弧をあえて 表記しないという人もいますが、それはあまり良いコードではありません。プログラマが どちらの意図で書いたのかを明確にするため、括弧を併用した方が望ましいです。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.