程式人人會寫,各有巧妙不同。好的程式碼外觀,讓人賞心悅目;雜亂無章的程式碼,則讓人望文興嘆,不忍觸賭。
我記得當年在宿舍問一個很會寫程式的同學,寫程式有沒有什麼秘訣?
他說有一個說穿了不值錢,但是很有用的方法,就是先把 Block 建構好。
這是什麼意思?
就是說當我們程式需要用到 ( ,{ 的時候,先將 () 與 {} 建構好,再於其中撰寫程式,這樣就不用怕會遺漏掉,到時候還要檢查半天。從這位同學的身上我學習到,養成好的寫程式習慣,是一件很重要的事情!
所以我們今天就要來談談,程式撰寫的風格。
說到程式風格,每個人都不盡相同,不然也不會有所謂的個人風格這件事情。
一個人寫的程式,自己看得懂就好,可能也不認為需要有什麼非用不可的撰寫方式。但是當你是一個團隊中的一份子,你的程式能不能讓人一看就懂,或者別人可以很快進入你的程式,維持一定的風格與標準化的動作,就很重要了!
我記得的以前做專案的時候,Leader 規定我們程式碼要放在什麼路徑,路徑的命名方式、檔案命名的方式都要 Follow 既定的規則,這樣如果遇到同仁請假,需要使用或存取所負責的程式碼時,就可以很容易的找到。
當然這是在當時沒有好的管理工具的情況下,後來使用像 Visual Source Safe 等具有 Repository 的機制來管理,就更容易了,透過程式的 Check In/Check Out 一個團隊可以很順暢的運作,及管控程式碼。
其實,程式撰寫風格最重要的就是縮排與空白的處理。很幸運的,現在的開發工具,在這部份都已經幫你設想好了,你只要透過簡單的設定,就可以很容易的維持一貫的程式撰寫風格。如縮排的 Tab 自動補幾個字元,等號前後留空白,內建函數自動 Capital,顏色區隔、強制宣告等等。
更好的是,您可以將固定的撰寫方式做成一個 Coding Block 並將他存成 snippet,透過熱鍵就可以將一個 Coding Block 插入程式中,這樣就好像是骨架建好,再去填入內容即可,對程式開發來說,相當的方便。(甚至於開發工具還會依據您的程式碼,自動將該有的 Coding Block 自動補上,如 If...Then Enter 後自動補上 End If)
雖然說,開發工具已經幫我們做了很多事情,但有些仍然是取決於我們的習慣問題。以下幾點,是一些建議不妨參考:
.在程式段落間插入空白行
密密麻麻的程式擠在一起,對閱讀上會感到很吃力,人的視角有其固定的範圍,如果將程式區塊維持在一定的行數內,對閱讀上來說會比較舒適,或者是將有相關性的程式碼集中放置,不同的程式區塊間以空白行隔開,再配以註解,這樣就很容易閱讀了。
.為單一敘述的程式區塊選擇一致性的撰寫格式
一個簡單的原則,整齊就是美!只要維持固定的撰寫方式,對程式閱讀與維護來說,都是好的。例如:
// 風格 1
if (BooleanExpression) {...}
// 風格 2
if (BooleanExpression) {
...
}
// 風格 3
if (BooleanExpression)
{
...
}
盡量在程式中,維持一個固定的風格,養成習慣,就不會有什麼問題了。
.在複雜的運算中,將個別條件區隔在單獨的一行
這點很重要!而且有好處的!怎麼說?我們看下面這個例子:
if (( '0' <= InChar and InChar <= '9' ) or ( 'a' <= InChar and InChar <='z') or ( 'A' <= InChar and InChar <='Z' )) then
...
這樣還要移動 scroll bar 才能看到程式的全貌,有可能看了前面忘了後面,看了後面又忘了前面。如果改成以下的方式,
if (( '0' <= InChar and InChar <= '9' ) or _
( 'a' <= InChar and InChar <= 'z' ) or _
( 'A' <= InChar and InChar <= 'Z' )) then
...
這樣就很容易閱讀,而且如果有條件要增加或是有條件要移除,只要新增一行或是把它Mark 掉就好了。^^b
.盡量不要超過 80 個字元
一般編輯器可以顯示的字元大概就是 80 個字元,超過了就會需要捲動,而且一般我們要列印程式都是採用 A4 的紙,超過 80 個字元,可能就會自動幫你折行,到時候反而不容易閱讀了。
.善用空白方便閱讀
在陣列、函數傳遞的參數、條件運算式中,留空白的字元,可以讓我們閱讀的視覺有比較好的感受。如:
ReadEmployeeData(MaxEmps,EmpData,InputFile,EmpCount,InputError)
有時候可能會對到底有幾個參數會搞不清楚(尤其是有物件的屬性當做參數時那個 . 跟 , 很容易搞混掉)。如果改成:
ReadEmployeeData( MaxEmps, EmpData, InputFile, EmpCount, InputError )
就會清楚許多。
.將程式區分成宣告區塊、運算區塊、錯誤處理區塊
這算是 Pascal 時代所留下來的好習慣了。將宣告的部份盡量擺在程式的前段,同一類型的變數擺在一起,不同的區塊間以空白行隔開,縮排的處理等,這些原則,都可以幫助我們維持美觀又容易維護的程式碼。
Borland (現在算embarcadero的)的編輯器裡有提供OpenTools API介面
之前就有人寫了專門檢查coding style的檢查工具
可以針對變數、函數命名
if block
....進行許多規則的檢查
一次對所有程式碼進行檢查
然後將不符規則的部份顯示出來
好不方便 ^_^
Java有很多做靜態程式碼分析的好工具(幾年前為了自己的team工作方便做了一些研究):
但是公司後來好像也沒把這些自動化工具整合到流程裡...
對啦, 我就是講 CheckStyle ^_^
我覺得所有的規則
如果有自動化的工具來檢核或更正
比起人工手動的方式
成功導入的機會比較大
另一個我認為成功的例子
就是用javadoc的tag「自動產生」出來的註解文件
比起用人工手動寫的各式各樣的註解
要好得多多了....