首页
学习
活动
专区
圈层
工具
发布

长if语句
EN

Stack Overflow用户
提问于 2013-03-21 03:53:47
回答 3查看 559关注 0票数 0

我正在为我的学校课程构建一个计算项目,我有一个相当大的if语句。当我运行这个程序时,它一点也不慢,但我只是想知道,编写大型if语句是否被认为是不好的。

代码语言:javascript
复制
    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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-21 05:41:43

更新

我收回它,你可以用下面的代码替换你的代码的所有:

代码语言:javascript
复制
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块是非常不受欢迎的。总而言之,如果可能的话,最好把它们排除在外。例如,您通常会看到类似以下内容的内容

代码语言:javascript
复制
Sub DoStuff()
    If conditionA Then
        DoSomeStuff()
        If conditionB Then
            DoMoreStuff()
        End If
    End If
End Sub

这可以重构为:

代码语言:javascript
复制
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

在重构的主题上提供了一些很好的链接。

票数 0
EN

Stack Overflow用户

发布于 2013-03-21 03:56:19

这很难阅读,但适当的缩进可以缓解这种情况。这也可能是你的代码需要一些重构的标志。举个例子,非常长的if语句可以这样写:

代码语言:javascript
复制
if (condition == A && condition == C 
        && (someCondition >= 1000 || someOtherCondition != C) 
        || someThirdCondition == D) {

    ...

}

此外,一定要利用短路的布尔语句,并将最容易计算的表达式放在第一位。

票数 0
EN

Stack Overflow用户

发布于 2013-03-21 04:46:44

代码语言:javascript
复制
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,否则您的代码不会做任何事情。

这看起来不是什么大事,但如果你开始像这样切掉一些东西,你就会得到真正的东西。

笔记可能已经填满了VB,因为我是一个C#男孩,我将让你填写它的其余部分……我会把那些单选按钮放在一个数组中,然后就会有一个问题,那就是改变所有的if和like,然后想出一些东西,比如循环的开始和结束,然后在你暂停它们之后。

代码语言:javascript
复制
For rb = rbStart To rbEnd
  MyButtons[rb].Enabled = False
Next

看着它,你可以从几行数学开始计算出来。可能会挑战你的老师,我不知道你还差多远。当你在大约五行代码中给出这一点时,他们可能会怀疑,如果我为你做,你就不会学习鼻塞。

程序员规则#21 -我们不喜欢做太多的打字工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15533378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档