C編碼規范
時間(jian):2016-12-14作(zuo)者:華清遠見
為什么需要編碼規范? 見過 很(hen)多C語言的(de)初學者(zhe)(zhe)寫的(de)代碼(ma),他們并不懂什(shen)么是好(hao)的(de)編碼(ma) 風(feng)格(ge)(ge),寫出來的(de)代碼(ma)風(feng)格(ge)(ge)各異(yi)。有(you)的(de)風(feng)格(ge)(ge)極易導致錯誤,有(you)的(de)風(feng)格(ge)(ge)讓(rang)人難以理解,有(you)的(de)風(feng)格(ge)(ge)讓(rang)人眼花繚(liao)亂(luan),有(you)的(de)風(feng)格(ge)(ge)甚至連(lian)作者(zhe)(zhe)自己都不知道寫代碼(ma)那會自己到底在想什(shen)么。 良(liang)好的(de)(de)編碼風格(ge)(ge),并不是(shi)官僚制(zhi)度下產(chan)生的(de)(de)浪費大(da)家時(shi)間(jian)的(de)(de)制(zhi)度。統(tong)一(yi)的(de)(de)編碼風格(ge)(ge),可(ke)以讓(rang)別人很容易理(li)解代碼意圖(tu),進而快速使用(yong)和二次開發,大(da)大(da)節約開發時(shi)間(jian)。并且極大(da)的(de)(de)簡(jian)化了代碼維護,減少了維護成本。 良好的編碼風格(ge),可(ke)以讓程(cheng)序員避免一些(xie)細節上(shang)的缺失。雖然這些(xie)東(dong)西可(ke)能(neng)很(hen)細微(wei),但若你(ni)不注意這些(xie)細節,那(nei)可(ke)能(neng)會給整(zheng)個軟件的質量帶來(lai)極大的影響,所謂“千里之(zhi)堤毀(hui)于蟻穴”。 很(hen)多大公(gong)司,例(li)如google,華為(wei),騰訊(xun)等(deng),都會在新(xin)員工(gong)入職培(pei)訓的(de)(de)(de)階段(duan)培(pei)訓編(bian)(bian)程標準(zhun)。每個員工(gong)都必須遵循公(gong)司內部制定的(de)(de)(de)編(bian)(bian)程標準(zhun)。程序(xu)就像(xiang)一個作(zuo)品,有素質有修養的(de)(de)(de)程序(xu)員的(de)(de)(de)作(zuo)品必然是一圖精(jing)美的(de)(de)(de)圖畫(hua),一首(shou)美妙的(de)(de)(de)歌(ge)曲(qu),一本賞心悅(yue)目的(de)(de)(de)小說。 如何編寫代碼 注釋 注釋是源(yuan)(yuan)碼中非常(chang)重要的(de)部分,通常(chang)源(yuan)(yuan)程序中的(de)注釋量必須在15%~20%以上。注釋的(de)原則是有(you)助(zhu)于程序的(de)閱讀和理解。所(suo)以注釋語言必須準確,易(yi)懂,簡潔。注釋不宜過多,也不宜太少。 文件或者模塊的注釋 對于一個文件或模塊注釋,應該(gai)有文件名稱,生成日期,作者名字,模塊描述,版本編(bian)號,修改記錄等。例如: /**************************************** 2.函數的注釋 對于(yu)函數,我們需要標注的內容主要是:函數名(ming)稱,參(can)數說(shuo)明,功能描述,返回(hui)值(zhi)說(shuo)明等(deng)。例如: /*************************************************** 3.其他的注釋 i. 邊寫代碼邊注(zhu)釋,對于(yu)具(ju)有一定含義的變(bian)量、常(chang)量、數據(ju)結(jie)構以及相關算法,若其名稱不能充分(fen)說(shuo)(shuo)明其用途或需要添加額外(wai)的說(shuo)(shuo)明,都必(bi)須進行注(zhu)釋。 ii. 注釋(shi)(shi)一般位于需(xu)要注釋(shi)(shi)的語句相鄰(lin)的上(shang)方(fang)或者右方(fang)。禁止在(zai)代碼(ma)的下方(fang)寫(xie)注釋(shi)(shi)。 iii. 將注(zhu)釋與其上面(mian)的代(dai)碼用空行間隔。 iv. 注釋(shi)的格式盡量一(yi)致(zhi),建議使用(yong)/*..........*/ 二、代碼的排版 良(liang)好的(de)(de)排版是優秀代碼風格的(de)(de)關鍵(jian)。以下是代碼排版需要主動的(de)(de)事項。 1.程(cheng)序塊(kuai)要采用縮進(jin)風格(ge)編寫(xie),縮進(jin)的空(kong)格(ge)數(shu)是(shi)4個 2.相對獨立(li)的(de)代碼(ma)塊之間(jian),變量的(de)說明之后(hou),必須加入空行。 例如: if ( ! is_empty(list))) 3.較長(chang)的語句(ju)要分成多(duo)行書寫。循環、判(pan)斷等(deng)語句(ju)中若有較長(chang)的表達(da)式或語句(ju),要進行適當的劃分。 4.不允許把多(duo)個短語(yu)(yu)句(ju)寫(xie)在一(yi)行中,一(yi)行只寫(xie)一(yi)條(tiao)語(yu)(yu)句(ju)。 例如: rect.length = 0; rect.width = 0; 5.if,for,do,while,case,switch,default等獨(du)占一(yi)行(xing),且其中語(yu)句(ju)部分無論幾行(xing)都需要加{}。 6.注意運算符的優先(xian)級,并用(yong)括號明(ming)確表達(da)式的操(cao)作(zuo)順序,避免使(shi)用(yong)默認優先(xian)級。 三、標識符命名 標識符的命名要清晰,有明(ming)確含(han)義。使(shi)用完整的單詞或大家基本可以理解(jie)的縮寫(xie),避免使(shi)人產生誤(wu)解(jie)。 1.常量命(ming)名使(shi)用(yong)大寫(xie) 例如 :MAX_VALUE 2.變量(liang)(liang)命名(ming)禁止取(qu)單個字符,建議除了要有具體(ti)含義外(wai),還能表(biao)明(ming)存儲類(lei)型(xing)、數(shu)據類(lei)型(xing)等,但是i,j,k作為局部不(bu)循(xun)環變量(liang)(liang)是可以(yi)的(de)。 變量(liang)命(ming)名(ming)可以采用匈牙利(li)命(ming)名(ming)法(fa) ,變量(liang)的第一個字母(mu)小寫(xie), 表示其數據類(lei)型(xing),如 int iIndex; char cIndex; 也可(ke)(ke)以采(cai)用(yong)linux通(tong)用(yong)的命名規范,采(cai)用(yong)‘_’分割短語命名一個變(bian)量,例如(ru)一個變(bian)量保(bao)存圖書數目,可(ke)(ke)以命名為 int number_book; 下(xia)列所示的局部變量(liang)方法(fa)可以(yi)借鑒: int liv_width; 其解釋如下: l 局部變量(local) 3.標示符的風格(ge)要自始至終保持一致(zhi),不可來回(hui)變(bian)換。 4.避免不(bu)易理解的數字(zi),要(yao)用有意(yi)義的宏(hong)來代替。例如: #define MAX 128 四、宏 1.用宏定義表達式的(de)時候(hou),要使用完備(bei)的(de)括號(hao)。例(li)如: #define MAX(a,b) a > b ? a : b 2.使用宏的時候,不允許參數發生變化。例(li)如: 如下用法會產生錯(cuo)誤: #define SQUARE(a) ((a) * (a)) 3.將常量聲明為宏(hong),防止代碼(ma)中的硬編碼(ma)。 比如:int user[100]; 誰也不知道100到底表示什么含義,你可以定義一個宏來表示其含義,比如大用戶數量MAX_USER。若程序中突然出現for(i = 0;i < 100;i++)這樣的代碼,你或許根本不知道100表示什么含義。再或者你要改變這個值,100出現幾次就需要修改幾個位置 ,這就是硬編碼帶來的后果。 4.頭文件中的預編譯 當多(duo)個(ge)文件同時包含一個(ge)頭文件的時候(hou),#ifndef是個(ge)很關 鍵的東(dong)西。它能(neng)避免重復包含頭文件所帶來(lai)的命名(ming)沖突。 一般的格式如下: 在/fad/cde.h文件中 #ifndef FAD_CDE_H 五、函數 1.對于所調用的函數的錯誤(wu)返回碼,要進行仔細,全面的處理。 2.函數的規模(mo)盡量限制在200行以內(nei)。 3.一個函(han)數僅完(wan)成一件事情,多功(gong)能的函(han)數,可能會(hui)使函(han)數的理解(jie)、測試、維護變得(de)困(kun)難。 4.檢查所(suo)有參數輸入的有效性,可以使(shi)用斷言。 六、頭文件和源文件 一般來說,頭文(wen)(wen)件(jian)中是(shi)聲明,源文(wen)(wen)件(jian)中是(shi)定義。源文(wen)(wen)件(jian)要編譯成庫文(wen)(wen)件(jian),若別(bie)人要使用(yong)你的函(han)數,就要引用(yong)你的頭文(wen)(wen)件(jian),所以(yi)頭文(wen)(wen)件(jian)一般是(shi)變量、宏定義、枚舉、結構和函(han)數接口的聲明,源文(wen)(wen)件(jian)則是(shi)實現的細節。 頭文(wen)件和源文(wen)件大的用處(chu)就是聲明和實現(xian)(xian)分開(kai)。直接把函(han)數實現(xian)(xian)寫到頭文(wen)件中是很不好的習(xi)慣(guan)。
發表評論
|