Bad programming practice 1

在新公司第一次仔細trace別人的程式碼,才發現原來程式可以寫得這麼髒!這裡記載一下我當時面臨的問題,希望以後我自己在寫程式的時候能夠儘量避免。

Variables

1. Lots of global variables/flags

當一個程式員要在極短時間內修正一個問題,或是當他必須在不完全了解程式的情況解決一個bug,最常出現的現象之一就是新增一個global variable來特別處理他所面臨的問題。久而久之你就會發現一個if statement必須要檢查六個變數,而六個變數之間好像有那麼一點關係,但是那個關係又沒有明顯到一眼可以看出來。於是你必須要去檢查這六個變數到底在哪裡定義,又是在哪裡更改,然後你發現第一個變數在六個函式內被更改,第二個變數在三個函式內裡更改…。然後你又突然發現,在第二個判斷條件為真的時候,第四個判斷條件好像不可能為真,所以你就開始懷疑為什麼要加第四個條件呢?是不是有什麼情況我沒有想到?到了下班時間時,你發現你連一行if 都還沒看完…

2. No naming convention

變數的命名方式一直是個充滿爭議的項目,就和縮行、括號一樣,每個人都有自己喜歡的方式。我自己當然也有我喜歡的方式,可是我理解當我去修改一個現存的系統時,依照原有的習慣是一個「有禮貌」的做法,所以我會改變我的習慣去適應它。可是當原來的習慣是一團亂的時候,我也只能「fire at will」了。

3. Exactly same name is used as a local variable, a static variable and a global variable

這個大概是對variable scope的終極考驗了。不過我搞不清楚在程式碼裡這樣做有什麼好處,是要懲罰那些對scope搞不清楚的菜鳥工程師?還是想一個新的名字真的這麼難?

4. One/two character(s) variable

我記得我看過一篇文章,它說在一個函式裡面,出現過一次用一個字母的變數來當做迴圈變數是可以接受的,可是出現兩次就有點醜了,出現三次就完全無法理解。我想兩個字母的變數也應該包括在裡面才對。我不是很懂為什麼這麼多人要用縮寫,少打幾個字是可以省多少時間?我保證當你半年後重新回來看這段程式時,一定會多花幾倍於你省下的打字時間來搞清楚你當初到底在寫什麼。而且相信我,你一定會再回來看這段程式的,不管是多久以後。

5. Unclear/unknown abbreviation

有時候縮寫常常是一些專用術語,拿來當做變數名稱無可厚非,但是要判斷是不是每個人都知道它是專用術語卻有相當的難度,常常很多時候你覺得是很一般的術語,對方卻不知道你在講什麼,這就增加了溝通上的難度。所以我傾向儘可能寫出完整的名詞,確保下一個看我程式碼的工程師能夠百分之百了解我在講什麼。反正現在大部分的編輯器都有auto complete的功能,不會增加太多打字的時間,而且現在的LCD 螢幕又那麼大,每行的字數應該不是問題。所以如果多幾個字能多增進一點溝通的效率,多保留一點原作者的想法,這絕對是很划算的。

講到這裡不得不提一下Apple的XCode真的是很好用,儼然編輯器界的iPhone,它把auto complete的功能推廣到local variable和global function name上面,一整個就是好用,害我白天上班用eclipse時常常會搞混。(據我使用經驗,Visual Studio 2008 和eclipse c/c++ 不支援local variable和global function的auto complete,也許是我不會用也說不定)

6. Variable name is not meaningful

變數名稱到底能不能真實反應出你的想法,這是一個見人見智的問題,但在討論這個問題前,我認為我們必須回過頭來想想什麼樣的程式叫做「好程式」。我覺得整個程式寫作的第二終極目標就是要能讓另一個平均水準的工程師在最短的時間內完全理講你的想法,進而能夠改正其中的錯誤或是以它為基礎發展其他的功能 (第一終極目標是要能夠動)。如果一個你覺得名字取得很好的變數被其他人認為不能理解,也許這已經不是變數名稱本身的問題了,而是你整個函式的設計就有問題,讓其中的變數沒有辦法很容易的對應它應有的角色。

廣告

About Weicheng Chu

創業中,微碧愛普科技 (www.weibyapp.com) 已婚, 有一對雙胞胎兒子, 現居住在美國加州、台灣台中
本篇發表於 軟體工程 並標籤為 , , , 。將永久鏈結加入書籤。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s