0

学校の授業でコンピューティング プロジェクトを作成していて、かなり大きなifステートメントがあります。ifプログラムを実行すると、まったく遅くはありませんが、大きなステートメントを書くのは悪いと考えられているのではないかと思っていました.

    For BookingNumber = 0 To intBookingCount - 1
            If intStartPeriod(BookingNumber) = 1 And strComputerRoom(BookingNumber) = strCR Then
                radRadioButton1.Enabled = False
                If intLength(BookingNumber) = 1 Then
                ElseIf intLength(BookingNumber) = 2 Then
                    radRadioButton2.Enabled = False
                ElseIf intLength(BookingNumber) = 3 Then
                    radRadioButton2.Enabled = False
                    radRadioButton3.Enabled = False
                ElseIf intLength(BookingNumber) = 4 Then
                    radRadioButton2.Enabled = False
                    radRadioButton3.Enabled = False
                    radRadioButton4.Enabled = False
                ElseIf intLength(BookingNumber) = 5 Then
                    radRadioButton2.Enabled = False
                    radRadioButton3.Enabled = False
                    radRadioButton4.Enabled = False
                    radRadioButton5.Enabled = False
                ElseIf intLength(BookingNumber) = 6 Then
                    radRadioButton2.Enabled = False
                    radRadioButton3.Enabled = False
                    radRadioButton4.Enabled = False
                    radRadioButton5.Enabled = False
                    radRadioButton6.Enabled = False
                ElseIf intLength(BookingNumber) = 7 Then
                    radRadioButton2.Enabled = False
                    radRadioButton3.Enabled = False
                    radRadioButton4.Enabled = False
                    radRadioButton5.Enabled = False
                    radRadioButton6.Enabled = False
                    radRadioButton7.Enabled = False
                End If
            ElseIf intStartPeriod(BookingNumber) = 2 And strComputerRoom(BookingNumber) = strCR Then
                radRadioButton2.Enabled = False
                If intLength(BookingNumber) = 2 Then
                    radRadioButton3.Enabled = False
                ElseIf intLength(BookingNumber) = 3 Then
                    radRadioButton3.Enabled = False
                    radRadioButton4.Enabled = False
                ElseIf intLength(BookingNumber) = 4 Then
                    radRadioButton3.Enabled = False
                    radRadioButton4.Enabled = False
                    radRadioButton5.Enabled = False
                ElseIf intLength(BookingNumber) = 5 Then
                    radRadioButton3.Enabled = False
                    radRadioButton4.Enabled = False
                    radRadioButton5.Enabled = False
                    radRadioButton6.Enabled = False
                ElseIf intLength(BookingNumber) = 6 Then
                    radRadioButton3.Enabled = False
                    radRadioButton4.Enabled = False
                    radRadioButton5.Enabled = False
                    radRadioButton6.Enabled = False
                    radRadioButton7.Enabled = False
                End If
            ElseIf intStartPeriod(BookingNumber) = 3 And strComputerRoom(BookingNumber) = strCR Then
                radRadioButton3.Enabled = False
                If intLength(BookingNumber) = 2 Then
                    radRadioButton4.Enabled = False
                ElseIf intLength(BookingNumber) = 3 Then
                    radRadioButton4.Enabled = False
                    radRadioButton5.Enabled = False
                ElseIf intLength(BookingNumber) = 4 Then
                    radRadioButton4.Enabled = False
                    radRadioButton5.Enabled = False
                    radRadioButton6.Enabled = False
                ElseIf intLength(BookingNumber) = 5 Then
                    radRadioButton4.Enabled = False
                    radRadioButton5.Enabled = False
                    radRadioButton6.Enabled = False
                    radRadioButton7.Enabled = False
                End If
            ElseIf intStartPeriod(BookingNumber) = 4 And strComputerRoom(BookingNumber) = strCR Then
                radRadioButton4.Enabled = False
                If intLength(BookingNumber) = 2 Then
                    radRadioButton5.Enabled = False
                ElseIf intLength(BookingNumber) = 3 Then
                    radRadioButton5.Enabled = False
                    radRadioButton6.Enabled = False
                ElseIf intLength(BookingNumber) = 4 Then
                    radRadioButton5.Enabled = False
                    radRadioButton6.Enabled = False
                    radRadioButton7.Enabled = False
                End If
            ElseIf intStartPeriod(BookingNumber) = 5 And strComputerRoom(BookingNumber) = strCR Then
                radRadioButton5.Enabled = False
                If intLength(BookingNumber) = 2 Then
                    radRadioButton6.Enabled = False
                ElseIf intLength(BookingNumber) = 3 Then
                    radRadioButton6.Enabled = False
                    radRadioButton7.Enabled = False
                End If
            ElseIf intStartPeriod(BookingNumber) = 6 And strComputerRoom(BookingNumber) = strCR Then
                radRadioButton6.Enabled = False
                If intLength(BookingNumber) = 2 Then
                    radRadioButton7.Enabled = False
                End If
            ElseIf intStartPeriod(BookingNumber) = 7 And strComputerRoom(BookingNumber) = strCR Then
                radRadioButton7.Enabled = False
            End If
        Next
    Next
End Function
4

3 に答える 3

0

読みにくいですが、適切なインデントでそれを軽減できます。また、コードにリファクタリングが必要であることを示している可能性もあります。例として、非常に長いifステートメントは次のように記述できます。

if (condition == A && condition == C 
        && (someCondition >= 1000 || someOtherCondition != C) 
        || someThirdCondition == D) {

    ...

}

また、短絡ブール文を利用して、最も評価しやすい式を最初に配置してください。

于 2013-03-20T19:56:18.917 に答える
0

アップデート

私はそれを取り戻します。すべてのコードをこれに置き換えることができます:

For BookingNumber = 0 To intBookingCount - 1

    If intStartPeriod(BookingNumber) = 1 Then radRadioButton1.Enabled = False
    If intStartPeriod(BookingNumber) = 2 Then radRadioButton2.Enabled = False
    If intStartPeriod(BookingNumber) = 3 Then radRadioButton3.Enabled = False
    If intStartPeriod(BookingNumber) = 4 Then radRadioButton4.Enabled = False
    If intStartPeriod(BookingNumber) = 5 Then radRadioButton5.Enabled = False
    If intStartPeriod(BookingNumber) = 6 Then radRadioButton6.Enabled = False
    If intStartPeriod(BookingNumber) = 7 Then radRadioButton7.Enabled = False

    Dim total = intStartPeriod(BookingNumber) + intLength(BookingNumber)
    If total >= 3 Then radRadioButton2.Enabled = False
    If total >= 4 Then radRadioButton3.Enabled = False
    If total >= 5 Then radRadioButton4.Enabled = False
    If total >= 6 Then radRadioButton5.Enabled = False
    If total >= 7 Then radRadioButton6.Enabled = False
    If total >= 8 Then radRadioButton7.Enabled = False

Next

大規模な if ブロックは非常に嫌われています。一般に、可能であればそれらを除外するのが最善です。たとえば、次のようなものをよく見かけます。

Sub DoStuff()
    If conditionA Then
        DoSomeStuff()
        If conditionB Then
            DoMoreStuff()
        End If
    End If
End Sub

これは次のようにリファクタリングできます。

Sub DoStuff()
    If Not conditionA Then Return

    DoSomeStuff()

    If Not conditionB Then Return

    DoMoreStuff()
End Sub

しばらく前に同様の(同じではない)質問をしたところ、この非常に役立つ回答が得られました:
https://softwareengineering.stackexchange.com/a/174977/57863

リンク先:
https://softwareengineering.stackexchange.com/a/172910/57863

リファクタリングに関するいくつかの優れたリンクが提供されました。

于 2013-03-20T21:41:42.697 に答える
0
For BookingNumber = 0 To intBookingCount - 1
  bookingNumberLength = intLength(BookingNumber)
  If strComputerRoom(BookingNumber) = strCR then
    Select Case intStartPeriod(BookingNumber)
      Case 1
        radRadioButton1.Enabled = False
        Select Case bookingNumberLength
          Case 2
            radRadioButton2.Enabled = False
          Case 3
            radRadioButton2.Enabled = False
            radRadioButton3.Enabled = False
          Case 4
            radRadioButton2.Enabled = False
            radRadioButton3.Enabled = False
            radRadioButton4.Enabled = False
          Case 5
            radRadioButton2.Enabled = False
            radRadioButton3.Enabled = False
            radRadioButton4.Enabled = False
            radRadioButton5.Enabled = False
          Case 6
            radRadioButton2.Enabled = False
            radRadioButton3.Enabled = False
            radRadioButton4.Enabled = False
            radRadioButton5.Enabled = False
            radRadioButton6.Enabled = False
          Case 7
            radRadioButton2.Enabled = False
            radRadioButton3.Enabled = False
            radRadioButton4.Enabled = False
            radRadioButton5.Enabled = False
            radRadioButton6.Enabled = False
            radRadioButton7.Enabled = False
         End Select
      Case 2
      Case 3
      Case 4
      Case 5
      Case 6
        radRadioButton6.Enabled = False
        If intLength(BookingNumber) = 2 Then
          radRadioButton7.Enabled = False
        End If
      Case 7
        radRadioButton7.Enabled = False
    End Select 
  End If
Next

strComputerRoom(BookingNumber) = strCR でない限り、コードは何もしませんでした。

大したことではないように見えますが、このように切り刻み始めると、物事の本質にたどり着きます。

私はC#の少年なので、VBを詰め込んでいる可能性があることに注意してください。残りの部分はあなたに記入させます...私はそれらのラジオボタンを配列に持っていて、それはちょうどif と elseing をすべて変更して、ループの開始と終了のようなものを考え出し、それらを検討した後の問題です。

For rb = rbStart To rbEnd
  MyButtons[rb].Enabled = False
Next

それを見ると、数行の数学で始めることができます。あなたの先生に挑戦するかもしれません。これを約 5 行のコードで指定すると、彼らは不審に思うかもしれません。

プログラマーのルール #21 - 私たちはたくさんのタイピングをしたくありません。

于 2013-03-20T20:46:43.840 に答える