2013-03-20 82 views
0

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

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 
+1

向我们展示 - 如果我们看不到代码,我们不知道您的意思。 – Oded 2013-03-20 19:54:29

+0

是的,我用来创建long if语句,但是我发现它们很难调试,如果语句有问题,您不知道问题出在哪里,那么if语句很大就是不好的形式 – 2013-03-20 19:58:34

+0

取决于它的易理解性是。不喜欢他们自己太容易迷路。 – 2013-03-20 20:04:04

回答

0

UPDATE

我收回,你可以用这个代替ALL你的代码:

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 

海量如果块被巨大的令人难以接受的。一般来说,如果可能,最好将它们分解出来。例如,你会经常看到沿

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

提供了一些有关重构主题的伟大链接。

+0

非常感谢你:) – 2013-03-20 22:45:42

0

这很难看,但正确的缩进可以减轻这一点。这也可能表明你是代码需要重构。作为一个例子,很长if语句可以这样写:

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

    ... 

} 

此外,一定要采取短路布尔语句的优势,把最容易首先评估表达。

+0

VB甚至有短路吗? – ThiefMaster 2013-03-20 19:57:43

+2

@ThiefMaster - 相当于'&&'是'AndAlso'而不是'And'。而且“短路”,而不管第一个结果如何,都将评估这两个表达式。 – keyboardP 2013-03-20 19:59:22

+0

那么我已经使用了循环增加的东西的价值,而不是写出相同的如果陈述了7次,个人,我觉得很容易找到我想编辑的位,所以我只是想知道它是否可以接受,它似乎不是使用switch语句的正确位置。 – 2013-03-20 20:00:34

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。

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

注意可能已经塞满了VB,因为我是一个C#的男孩,我要让你填写它的其余部分... 我我会在一个数组中的单选按钮和那么这只是一个改变所有这一切的问题,如果不然就会想出一些类似于循环的开始和结束的东西,并且在你怀疑它们之后。

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

看着它,你可以开始工作,并与几条数学线。可能会挑战你的老师,但我不知道你有多远。当你用五行代码给出时,他们可能会产生怀疑,如果我为你做这件事,你将无法学会nuffin。

程序员规则#21 - 我们不喜欢做很多打字。