2015-06-16 23 views
2

首先,我知道使用Goto永遠不是一個好主意。但是我很難看到以下結構之間的區別......它們都按順序處理條件,當它們找到真值時停止處理,然後將控制返回到代碼中的指定位置(下一行,作爲這就是這個特定的「GoTo」目標所在)。是什麼區別:與轉到GoTo,使用Select和使用單獨的函數有什麼區別?

IFS:

If ConditionA then 'This is designed to skip the evaluation of condition B if condition A is met. 
    Do something 
    Goto Resume 
End If 
If ConditionB then 
    Do something 
    Goto Resume 
End If 
Resume: 

選擇案例:

Select ConditionIsTrue 'This will also skip the evaluation of B if A is true. 
    Case A 
     Do something 
    Case B 
     Do something 
End select 

獨立的子:

EvaluateConditions(condition) 

Sub EvaluateConditions(condition) 
    If A then 
     DoSomething 
     Exit Sub 
    End If 
    If B then 
     DoSomething 
     Exit Sub 
    End If 
End Sub 
+0

我認爲GOTO的不良遺產最好能夠與通常伴隨它的舊的原始BASIC行號一同考慮,這導致當天很多非常難以遵循的代碼。 –

+0

因此,出現一系列GoTos會帶來更多問題,這些GoTos會將所有代碼都帶到您的手中,而不是將它用作「如果您找到了真正的價值時跳過下一個位置」的方向? – nwhaught

+0

我當然認爲至少有一個有效的觀點。我確實認爲,即使在這種情況下,GOTO可能被認爲是一種「代碼味道」,這意味着有機會重新設計代碼塊,使行爲更加流暢/不言而喻,即使只是視覺上。它不需要太多的GOTO就可以開始游泳 - 然後再次,太多的Javascript回調可以做同樣的事情:) –

回答

2

一般而言,

  1. 'goto'將執行控制權轉移給您正在分配的標籤。控件永遠不會回到你使用'goto'的地方。由於程序流程完全改變,因此不宜使用「goto」。它變得很難調試。

  2. 當您編寫子程序並從代碼的其他部分調用該子程序時,一旦子程序的執行完成,該控件將被傳回到代碼的被調用部分。因此,與goto不同,程序流程不會受到影響,建議使用子程序而不是goto。

  3. 在select語句的情況下,它與多個'if-else'語句沒有多大區別。您可以使用'select'來獲得更清晰的代碼,而不是有太多'if-else'。

具體到你問什麼,所有三個都是一樣的,沒有區別。您選擇什麼取決於您的要求,條件數量,代碼片段的重複使用性以及未來的增強功能。

如果你有很少的條件(2或3),並且如果你確定這段代碼不需要將來增強,那麼使用goto是可以的(仍然不是一個好的選擇)

如果這段代碼應該是可重用的,否則使用子例程是最好的選擇。事實上,即使你有很少的條件,最好在子程序中使用'select'語句,這樣你的代碼看起來很乾淨,並且很容易在將來添加更多的條件。

相關問題