iT邦幫忙

DAY 18
5

程式設計心法系列 第 18

程式設計心法:17.程式撰寫風格

程式人人會寫,各有巧妙不同。好的程式碼外觀,讓人賞心悅目;雜亂無章的程式碼,則讓人望文興嘆,不忍觸賭。

我記得當年在宿舍問一個很會寫程式的同學,寫程式有沒有什麼秘訣?

他說有一個說穿了不值錢,但是很有用的方法,就是先把 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 時代所留下來的好習慣了。將宣告的部份盡量擺在程式的前段,同一類型的變數擺在一起,不同的區塊間以空白行隔開,縮排的處理等,這些原則,都可以幫助我們維持美觀又容易維護的程式碼。

本系列文章


上一篇
程式設計心法:16.流程控制--Goto & Return
下一篇
程式設計心法:18.註解行不行
系列文
程式設計心法31
0
海綿寶寶
iT邦超人 1 級 ‧ 7 年前

寫得好,推 bbb

0
海綿寶寶
iT邦超人 1 級 ‧ 7 年前

Borland (現在算embarcadero的)的編輯器裡有提供OpenTools API介面
之前就有人寫了專門檢查coding style的檢查工具

可以針對變數、函數命名
if block
....進行許多規則的檢查

一次對所有程式碼進行檢查
然後將不符規則的部份顯示出來
好不方便 ^_^

0
fillano
iT邦超人 1 級 ‧ 7 年前

Java有很多做靜態程式碼分析的好工具(幾年前為了自己的team工作方便做了一些研究):

  1. CheckStyle:分析程式碼風格是否符合規範
  2. JDepend:分析類別依賴性,來判斷架構變動的風險(耦合越高,風險越大)
  3. JavaNCSS:程式碼的體積與複雜度檢查,通常一段程式太長沒有拆開,或是多層的if條件或者loop都會影響到程式的可閱讀性,也會較難維護而增加風險

但是公司後來好像也沒把這些自動化工具整合到流程裡...

海綿寶寶 iT邦超人 1 級 ‧ 7 年前 檢舉

對啦, 我就是講 CheckStyle ^_^

我覺得所有的規則
如果有自動化的工具來檢核或更正
比起人工手動的方式
成功導入的機會比較大

另一個我認為成功的例子
就是用javadoc的tag「自動產生」出來的註解文件
比起用人工手動寫的各式各樣的註解
要好得多多了....

我要留言

立即登入留言