作者beagle1 (滿城飛絮風吹雪)
看板b92902xxx
標題Coding Style
時間Thu Dec 4 21:54:04 2003
最近兩三個星期來, 收到的幾份 source code , 多半都排得很亂,
向前看齊的也有, 前後亂跳的也有, 通常寫程式會做縮排, 各位好像不知道... :p
還好我有 indent -kr 這秘招, 靠大師庇佑勉強看得懂... (其實他們還沒死)
Coding Style 可以說是程式的外觀或風格,
排版, 變數取名, 註解, 最好整份程式都能遵守一定的規律...
更深入的例如記憶體和其他資源的管理, 函式的結構, 也常常要定下規則來,
這樣做主要的功用是 1. 易懂 2. 避免寫出 bug ...
那麼你一定要問了, 程式自己懂就好, 寫得太好懂不是方便別人抄嗎?
這也不一定, 有時候自己寫的 code 過兩星期再看就看不懂了, 無從改起...
現在的作業, 一部份 code 有可能是明年修別的課可以再 reuse 的...
另外, 如果你星期一寫的星期三就看不懂, 豈不是有苦說不出?
另外停止量產 bug 也是很重要的, 有結構地寫程式, 辨明流程, 分清楚區塊,
就可以減少大部份語法及流程上的 bug, 萬一有問題也可以迅速找出位置...
不知道各位聽過流程圖嗎? 那是麻瓜用的, 程式流程寫清楚的話是不需要這個的...
* * *
Coding Style 是人訂的, 你愛怎麼定都行, 只要符合一些要點, 就能達到目的...
C 語言的 coding style, 除了上次我提到的三個流派以外, 不同 leader 可能都會
訂不同的 style... 不同語言也會有不同的 coding style ...
1. 縮排與大括號:
原理: 縮排是為了分清楚各區塊 (code block) 的起始結束
code 分層結構中, 內層的句子往內縮, 同一個 compund statement 裡面每一行都要
對齊, 這樣才能分清哪一塊是這個 if 的 then 哪一塊是 else :
if (x == y) {
we do a;
we do b;
} else {
we do c;
return;
}
如果沒有縮排, 當 if 裡面還有 if 的時候, 一定會分不清哪個 else 配哪個 if ..
如果你用的是 Visual Studio, 他會這樣排:
if (x == y)
{
we do a;
}
這樣也可以, 分割 code block 的作用一樣有達到...
大部份人都會把後面的大括號單獨寫一行, 以便清楚標示出 code block 結尾...
下面這種狀況是不被鼓勵的, 幾乎沒人這樣做:
if (x == y) {
we do a; }
不過你如果很堅持, 那也隨便你, 至少有縮排了...
縮排的寬度, 主流有 8 派和 4 派, 前者剛好一個 tab 寬, 後者可以放比較多層,
另外也有少數人用 2 格, 甚至還有用 3 格的, 這就看各位喜好了...
大部份編輯器都能設定 tab 縮排的寬度, 例如說 vi 可以這樣:
:set ts=4
其他的多半也都能設定, 好像只有 Windows 記事本不行...
我一年級用 2 格, 這樣可以開心的一直縮一直縮,
但是後來發現縮排超過 5 層的話, 容易寫出 bug, 整個 code 會因為層數太多亂掉,
所以現在不管縮排是用幾格, 只要層數到 6 層我都會儘量提出來另外寫 function
寫壞了怎麼辦?
GNU 有一個小工具, 叫 indent (這個字是縮排的意思), 可以用來重排 code ,
有 -gnu(預設) -kr -orig 三種 style 可以選, 還有其他許多選項可以調整,
例如 indent -kr -i2 hw2.c 可以用 K&R style, 一次縮排 2 個空白,
原理: 程式做縮排不能治療寫出爛 code 的毛病
用 Visual Studio 或其他自動縮排編輯器的也要注意自己的 coding style,
寫的時候要想清楚, 心中也必需段落分明, 如果發現想得和螢幕上排出來的不一樣,
就要特別注意是不是寫錯了...
只要你曉得怎樣利用, VC 和 Emacs 這種自動編排的功能幫助非常大...
2. 變數及 function 取名:
各位寄來的 code, 取名常常是一個字母, 至於 function 這東西好像沒看過...
一個字母對用後即丟小變數來說不錯, 節省空間也節省打字時間...
for 裡面的 i , 改叫他 counter 並沒有任何好處, 沒有人會因為 i 短就看錯...
但是對重要的資料, 最好用簡單的單字表示, 例如 inbuf 和 outbuf ...
至少比 a 和 b 容易知道那一個是輸入哪一個是輸出...
如果是很多地方都用到, 散布四處的 global 變數, 最好描述清楚...
data_symbol_table 不要縮寫成 DtSymTab, 那很難看懂, 你還得另外寫註解去說...
微軟有一種奇怪的習慣, 愛在變數和 function 開頭寫上 data type,
例如 dwStyle 表示 double word ... nCount 代表 int ...
這樣做有點累贅, 因為 compiler 不管這個, 他本來就知道 data type 是什麼,
但 compiler 不會幫你檢查 "頭銜" 寫錯...
結果 type 寫在名字前面只會擾亂寫程式的人... (也難怪微軟的程式 bug 一大堆)
不過如果你喜歡這樣做, 那也隨便你... :p
如果你的 function 中(包括main), local variable 超過 10 個,
那通常表示這個 function 可以再照不同功能切成小 function ...
3. 註解:
原理: 有註解非常好, 但註解太多也很危險, 和code有出入的話更不如不寫
註解要做的是, 解釋 code 要 "做什麼" "為啥要做這個", 而不是詳細寫出解法,
解法在 code 本身, 與其花時間寫註解不如把 code 寫得好懂一點...
而且, 花時間解釋髒兮兮的爛 code 根本就是浪費時間...
註解最好寫在整個 function 的開頭, 以及變數定義的地方, 比較容易找,
插在 code 中的註解通常是用來做警告, 或是提示注意事項,
所以這種註解越少越容易引起注意...
只要寫了註解就要負責, code 改了註解也要跟著改, code 搬動註解也要跟著搬...
* * *
好幾個同學一起寫 term project 的時候, 最好大家先講好 coding style,
這樣才容易互相 debug ... 但也不要為了 coding style 吵架, 每個人有每個人的
習慣, 定了其中一種方法大家 follow 就可以了, 通常大家的 coding style 不會
相差太多, 會吵架的通常都是 tab 寬度, 只要會用編輯器去調, 問題並不大...
--
我十七歲, 我不灌水...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.161.3.4
→ sskywind:推~~是畢業的學長嗎? ^^ 推 218.160.214.54 12/04
→ beagle1:嗯, 十七歲這 comment 是十年前寫的 推 218.161.3.4 12/04
→ beagle1:寫得真好,我朗誦八遍了,到處轉貼去 ^O^ 推 218.161.3.4 12/04