iT邦幫忙

DAY 17
6

程式設計心法系列 第 17

程式設計心法:16.流程控制--Goto & Return

  • 分享至 

  • xImage
  •  

Goto 是程式設計中的一個很受爭議的指令,也是歷史公案,到現在也還沒有一個定論。因為廣大的 VB 使用者(或說比爾蓋茲)都支持保留 Goto 的用法。
Go To Statement Considered Harmful
Structured Programming with go to Statements

有興趣可以看一下兩篇文章的正反意見。

當然,在沒有提供 Goto 語法的語言中,這根本不是問題,而且對長期使用結構化程式設計的程式設計師來說,Goto 的問題根本不存在。

有一個不得不用 Goto 的方式,就是 VB6 或 VBA 中,Error Handling 的機制,On Error Goto ErrorHandling(錯誤處理的機制我們在 Error Handling 單元在說明)。不過 VB.Net 已經提供 Try-Catch-Finally Block 可供使用,算是進步的一種作法。

而 Return 這個函數傳回值的用法,最常見的就是忘了回傳值,或是用了太多 Return 增加程式閱讀的困難度。

針對這兩個議題,我們就來看看,有什麼比較好的處理方式。
使用 Goto 的原則
.如果有對等的流程控制,就不要使用 Goto
使用 Goto 很怕的就是,指到不該去的地方,例如:

if (SomeExpressionTrue) then
  ...
  if (isErrorRaised) then
    goto Label1
  end if
else
Label1:
  doSomething()
end if

這一段程式碼,明明就是兩個不同的邏輯,卻使用 Goto 將狀況混在一起,如果是這樣,表示一開始的邏輯條件不夠正確,可以改寫如下:

if (SomeExpressionTrue) and not (isErrorRaised) then
  ...
else
  doSomething()
end if

或者是採用 ErrorHadling 的機制來處理,有時候多思考一下,就可以發現其實與其用 Goto 還有更好的方式可以使用。

.確定所有的 Label 都有使用到
在程式中加了一大堆 Label 會讓程式在閱讀上產生困擾,因為會不曉得什麼時候會跳到這一段程式,所以最好是降低 Label 的使用,並且確定 Define 出來的 Label 都會有相對應的 Goto 使用到他。

.確認使用 Goto 不會造成某段程式永遠不會執行
當然了,寫了一堆程式然後使用不到,不僅對程式沒有用處,也增加 Compiler 了工作與程式的 Size,如果有這種情況,那就把 Goto 或 Label 拿掉吧。

使用 Return 該注意的地方
.一開始就給定 Return 的初始值
模組化的設計的好處就是我們可以很容易的自定所需要的函數,來處理負責的運算,或讓程式碼重複的使用,達到最佳的效率。可是常常發生的情況是,預期程式該傳回某數值的,結果卻是傳回 null!這樣就造成程式判斷錯誤而中斷流程,所以比較好的方式,是在函數或常式的一開始,就為 Return 值給定初始值。例如:

Function A() as Variant
  Dim ret as Integer
  ret=0

  if SomeExpress then
    ret=1
  end if

  A=ret
End Function

.盡量減少單一常式中使用 Return 的次數
當 Return 出現在常式的很多地方時,會造成閱讀上以及維護上的困擾,如果可能盡量減少 Return 的使用,或者將邏輯判斷重新檢視過,也許就可以發現不需要使用那麼多的 Return。

本系列文章


上一篇
程式設計心法:15.流程控制--迴圈
下一篇
程式設計心法:17.程式撰寫風格
系列文
程式設計心法31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
海綿寶寶
iT邦大神 1 級 ‧ 2009-10-23 10:15:59

"一開始就給定 Return 的初始值"

還好還好,這一點我有做到 ^_^

0
牛哥
iT邦好手 1 級 ‧ 2011-07-21 11:46:38

透過jamesjan的內容闡述~
應該是「少」用,但不「禁」用。

受教了!

我要留言

立即登入留言