2012-05-01 49 views
1

我一直在考慮一些代碼經歷和發現問題和事情,可以改善和改變(這是一門功課的任務,但這個問題是無關的任務本身),部分代碼是:爲什麼不在VB.NET中使用'Return'語句?

Function CheckIfSameCell(ByVal FirstCellPosition As CellReference, ByVal SecondCellPosition As CellReference) As Boolean 
    Dim InSameCell As Boolean 
    InSameCell = False 
    If FirstCellPosition.NoOfCellsSouth = SecondCellPosition.NoOfCellsSouth And FirstCellPosition.NoOfCellsEast = SecondCellPosition.NoOfCellsEast Then 
     InSameCell = True 
    End If 
    CheckIfSameCell = InSameCell 
End Function 

我不明白爲什麼InSameCell是變量被創建的時候,它只能分配給函數名CheckIfSameCell

或者只是使用如下所示的return語句?

Function CheckIfSameCell(ByVal FirstCellPosition As CellReference, ByVal SecondCellPosition As CellReference) As Boolean 
    If FirstCellPosition.NoOfCellsSouth = SecondCellPosition.NoOfCellsSouth And FirstCellPosition.NoOfCellsEast = SecondCellPosition.NoOfCellsEast Then 
     Return True 
    End If 
    Return False 
End Function 

我能理解無法在If語句直接返回的表達,以增加可讀性。我知道爲函數名稱賦值的返回值不會退出函數,而Return可以,但它只是一個人的風格,或者對第一個版本有任何優勢(IMO,第二個更多可讀)?

+2

我認爲它只是個人選擇而不是規則,也有一些程序員遵循他們從書本或在線閱讀的模式。我也更喜歡第二個代碼(並且我以這種風格編寫我的代碼),它很容易閱讀並使用一個較少的變量。 –

+1

你的建議是更好的和正確的方法,通過使用'return'而不是使用函數名稱。前面的函數可能已經寫在VB6中,然後轉換爲.Net,因爲VB6被編碼爲 –

+0

當開關進行結構化編程時,一個規則是[每個函數應該有一個單一的出口點](http:///c2.com/cgi/wiki?SingleFunctionExitPoint)。從鏈接頁面引用,「現在,結構化編程已經贏得了很長時間,現在沒有人特別關心這個問題」。 – stakx

回答

2

第二種方法更具可讀性,我同意。這也恰好是我偏好退出方法。 我真的無法想象後者在比較中有一個缺點,但可以爲前者。如果方法變長並且有人忘記設置布爾標誌會發生什麼?一個微妙的錯誤將誕生。此外,它還需要更多的代碼。在後一種方法中,如果代碼缺少返回,代碼將不會編譯,而且它也會更短。

需要返回類型的局部變量是在第一次確定返回值之後例程需要做其他工作的時候。在你發佈的例子中,情況並非如此。

Code Complete, 2nd Edition同意391頁:

使用返回當它增強了可讀性在某些程序,一旦 你知道答案,你想將其返回到調用程序 立即。如果例程的定義方式不是 在檢測到錯誤後需要進一步清理,則立​​即不返回 意味着您必須編寫更多代碼。


注:至於其他的答案[12]提到,可以減少方法單一代碼語句。還使用AndAlso都應有助於加速通過評估短路邏輯表達式,如果早期的第一部分是假的:

Return FirstCellPosition.NoOfCellsSouth = SecondCellPosition.NoOfCellsSouth 
    AndAlso FirstCellPosition.NoOfCellsEast = SecondCellPosition.NoOfCellsEast 
5

也許過去有更多的檢查,其中InSameCell值可能會改變幾次,只有然後才能返回。使用return則會改變行爲。

也許作者想避免繁瑣的回憶。你知道,當你想重新命名一個函數,並且你在它自己的體內多次使用該函數的名字時,那麼你有很多地方要替換,而當你引入一個變量時,你將只有一個地方來改變它的名字。 (我知道IDE會爲你正確地做到這一點;但在VB6中並不是這種情況,並且習慣很難打破。)

也許作者更熟悉VB6,沒有return

也許這是一個風格或政策問題。

Function CheckIfSameCell(ByVal FirstCellPosition As CellReference, ByVal SecondCellPosition As CellReference) As Boolean 
    Return FirstCellPosition.NoOfCellsSouth = SecondCellPosition.NoOfCellsSouth AndAlso FirstCellPosition.NoOfCellsEast = SecondCellPosition.NoOfCellsEast 
End Function 
3

分配結果的函數名是在VB6中使用了舊的風格,不應該被用在VB.NET更多:

無論如何,我會爲它寫。使用Return value

個人我不喜歡發言的風格

If condition Then 
    Return True 
Else 
    Return False 
End If 

他們只是愚蠢的,因爲condition已經得到的返回值!更好:

Return condition 

這也是GSerg選擇的解決方案。


沒有人會寫

If x + y = 0 Then 
    Return 0 
ElseIf x + y = 1 Then 
    Return 1 
ElseIf x + y = 2 Then 
    Return 2 
ElseIf x + y = 3 Then 
    Return 3 
... 

但有些人不斷在做它時,表達的是布爾類型。我認爲他們沒有意識到條件等同於算術表達式。它們只是布爾運算而不是數字運算。

另一個誤解是If語句需要一些比較,如If x > 0 Then。如果他們有一個布爾變量b他們寫If b = True Then。但是,所有的If語句需求都是布爾表達式給出的布爾值。這個表達式可以像查詢變量一樣簡單:If b Then

爲什麼這樣嗎?因爲如果bTrue那麼b = True產生True並且如果bFalseb = True產生False。所以,b = True非常像說x * 1。當然,這與x相同。

0

有一個重要的事情返回並分配值的函數名稱。如果你(因爲任何扭曲的原因)想寫這樣的東西

Public Function TestFunct() as Boolean 
    Dim testVar as Boolean = True 
    If testVar then 
    TestFunct = True 
    Else 
    TestFunct = False 
    EndIf 
    'do more stuff here 
    ... 
    TestFunct = False 
End Function 

它總是會返回false。如果您使用返回,則執行將停止,並且該函數將返回正確的值。

0

如果由於某種原因,它需要出現在賦值的右邊,則可以使用一個變量,你不希望產生一個遞歸:

Dim Function F() As Boolean 
    F = True 
    If a = b Then 
     F = Not F() 
    End If 
End Function 
0

總之 - 是你的最後一個例子非常有效。

但是,作業中使用的大多數例子都是用來顯示其他教學示例。作業手冊中的代碼僅以傳統方式展示了使用功能的基礎知識,第二個例子展示了下一步的學習步驟,並且是實現所需結果的最緊湊方式。

另外,第一個例子也可以用來重新執行早先學到的教訓 - 例如,關於分配變量,使用布爾值等。

提高您的編碼技能的最佳方法之一是反覆練習所學知識。

相關問題