《新約.約翰福音》:
不可按外貌斷定是非,總要按公平斷定是非永毅。
一客燕、重要的版面與樣式
- 程序員根據(jù)代碼的版面理解代碼的含義场勤。
- 版面可以說明和支持代碼的結(jié)構(gòu)混槐,幫組閱讀者理解代碼真實(shí)的內(nèi)容编兄。
- 可以說,版面和樣式是區(qū)分優(yōu)秀代碼和糟糕代碼的一個(gè)主要特征声登。
- 我們有理由認(rèn)為狠鸳,版面漂亮的代碼是經(jīng)過精心設(shè)計(jì)的代碼。更有理由認(rèn)為悯嗓,格式混亂的代碼一定沒有好好下功夫件舵。
二、了解你的讀者
為了寫出有效的源代碼脯厨,我們需要了解誰會(huì)閱讀這些代碼芦圾。我們有三類讀者:
我們自己
你不僅需要能夠讀懂剛剛寫下的代碼,也需要若干年后仍然能明白它的含義俄认。編譯器
只要沒有語法錯(cuò)誤个少,編譯器并不在乎你的代碼樣式是否美觀其他人
它們是最重要的洪乍,也是最容易被忽視的讀者群。
很顯然夜焦,編譯器對(duì)我們的影響最小壳澳。我們使用版面與樣式,是向人類讀者強(qiáng)調(diào)代碼的邏輯結(jié)構(gòu)茫经。這是一種溝通巷波,應(yīng)當(dāng)越清晰越好。
三卸伞、什么是好的樣式
下面是幾種衡量樣式風(fēng)格質(zhì)量的標(biāo)準(zhǔn):
- 一致
《C程序設(shè)計(jì)語言》中Kernighan和Ritchie:
括號(hào)的位置并不重要抹镊,盡管人們固執(zhí)己見。我們從幾種流行的風(fēng)格中選擇一種即可荤傲。挑選一種適合你的風(fēng)格垮耳,然后堅(jiān)持使用下去。
不管在什么情況下遂黍,大小括號(hào)的位置终佛,縮進(jìn)的空格數(shù)等應(yīng)當(dāng)前后一致。
傳統(tǒng)
采用一種業(yè)內(nèi)流行的主要樣式雾家,比自己創(chuàng)造一種縮進(jìn)規(guī)則要明智得多铃彰。這樣閱讀你代碼的人更容易接受和理解你的代碼。簡(jiǎn)潔
四芯咧、了解常用代碼版面風(fēng)格
我們應(yīng)當(dāng)認(rèn)識(shí)我們所選擇的語言的常用代碼版面風(fēng)格牙捉,充分了解它們的優(yōu)缺點(diǎn),再根據(jù)你的審美觀敬飒、你所處的編程文化以及你的習(xí)慣等邪铲,選擇一種合適自己的風(fēng)格。
下面是幾種常用的括號(hào)位置風(fēng)格
- K&R風(fēng)格
int k_and_r ( ) {
int a = 0, b = 0;
while (a != 10){
b++;
a++;
}
return b;
}
優(yōu)點(diǎn):占用空間較小驶拱,一屏可以顯示更多的代碼;后括號(hào)與對(duì)應(yīng)的語句縮進(jìn)相同晶衷,容易找到括號(hào)所終止的構(gòu)造蓝纲。
缺點(diǎn):前后括號(hào)上下不對(duì)齊,視覺上不匹配晌纫;如果頁(yè)面右側(cè)的前括號(hào)丟失税迷,不易察覺;代碼語句看上去縮在一團(tuán)锹漱。
為了讓印刷頁(yè)的利用率最大化箭养,在雜志中常使用K&R風(fēng)格。
- 懸掛式
int hang ( )
{
int a = 0, b = 0;
while (a != 10)
{
b++;
a++;
}
return b;
}
優(yōu)點(diǎn):格式清晰整潔哥牍;由于前后括號(hào)明顯毕泌,利于區(qū)分代碼塊喝检,易于瀏覽代碼。
缺點(diǎn):占用豎向空間較多撼泛;如果有很多只包含一條語句的代碼塊挠说,很浪費(fèi)空間。
- 縮進(jìn)的括號(hào)風(fēng)格
int indented ( )
{
int a = 0, b = 0;
while (a != 10)
{
b++;
a++;
}
return b;
}
優(yōu)點(diǎn):將代碼塊以及包括代碼塊的括號(hào)聯(lián)接在一起愿题。
缺點(diǎn):許多人并不喜歡损俭。
-
其他風(fēng)格
GNU:介于懸掛式和縮進(jìn)式之間的一種風(fēng)格,把括號(hào)放置在各個(gè)縮進(jìn)級(jí)別一半的位置上潘酗;
Linux內(nèi)核:一半是K&R杆兵,一半是懸掛式;
五仔夺、選擇風(fēng)格
程序員們常常在編碼風(fēng)格的選擇上發(fā)生分歧琐脏,甚至成為了一種信仰之爭(zhēng),更不幸的是囚灼,這種強(qiáng)烈的意見分歧有時(shí)蛻變成相互的漫罵和攻擊骆膝。
我們應(yīng)當(dāng)了解:
只要你編寫代碼時(shí)使用的風(fēng)格是好的,具體使用哪種風(fēng)格并不重要灶体。
所以我們不爭(zhēng)論哪種風(fēng)格更好阅签,只需:
選擇一種好的編碼風(fēng)格,并堅(jiān)持使用它
六蝎抽、內(nèi)部風(fēng)格
許多軟件公司都有自己的內(nèi)部編碼風(fēng)格政钟,內(nèi)部風(fēng)格將提高代碼的質(zhì)量,并使軟件開發(fā)更安全樟结。具體好處如下:
- 任何向公司外部發(fā)布的代碼养交,其樣式整潔一致,會(huì)顯得有整體規(guī)劃瓢宦,顯得更職業(yè)化碎连。
- 有統(tǒng)一的句式和方法,能保證寫出來的程序符合同一個(gè)標(biāo)準(zhǔn)驮履,有助于防止出現(xiàn)糟糕的代碼鱼辙。
- 你可立即看懂同行的代碼,能快速地維護(hù)玫镐,節(jié)約閱讀時(shí)間倒戏,節(jié)省公司資金。
建議:
如果你的團(tuán)隊(duì)已有一個(gè)編碼標(biāo)準(zhǔn)恐似,那么使用這個(gè)標(biāo)準(zhǔn)杜跷,
即使內(nèi)部樣式跟你的個(gè)人偏好相矛盾。
七、設(shè)立標(biāo)準(zhǔn)
如果你被安排來草擬一份編碼標(biāo)準(zhǔn)葛闷,那么祝你好運(yùn)憋槐!
這項(xiàng)任務(wù)的難度取決于團(tuán)隊(duì)的成員:
- 團(tuán)隊(duì)由多少位程序員?
- 他們?nèi)绾螁为?dú)編寫代碼的孵运?
- 他們的編碼風(fēng)格是否統(tǒng)一秦陋?
- 他們是否想要一套標(biāo)準(zhǔn)?
- 他們已經(jīng)做好改變編碼風(fēng)格的準(zhǔn)備了嗎治笨?
下面是為這項(xiàng)艱巨任務(wù)提供的幾條實(shí)用建議:
界定任務(wù)范圍
你要確定這個(gè)任務(wù)是為你的直屬團(tuán)隊(duì)驳概,還是為一個(gè)部門或整個(gè)公司。對(duì)象不同旷赖,標(biāo)準(zhǔn)內(nèi)容和實(shí)施方式也會(huì)不同顺又。贏得廣泛參與
(a).在設(shè)立標(biāo)準(zhǔn)之前,讓每個(gè)人都贊成需要出臺(tái)一個(gè)標(biāo)準(zhǔn)等孵;讓他們理解代碼一致的好處稚照,以及特立獨(dú)行的代碼樣式的危害。
(b).讓團(tuán)隊(duì)的人盡量參與制定標(biāo)準(zhǔn)俯萌,他們將更有可能遵循標(biāo)準(zhǔn)果录。
(c).如果你的團(tuán)隊(duì)有很多程序員,不要嘗試讓所有人參與咐熙,而是選擇一個(gè)精明強(qiáng)干的小組完成這項(xiàng)任務(wù)弱恒。做出成果
把所有標(biāo)準(zhǔn)寫成一個(gè)可理解的文檔,可供查閱和參考棋恼。文檔不但包含一系列規(guī)則返弹,還要有相應(yīng)的解釋(尤其是對(duì)有爭(zhēng)議的條款)。使最佳做法標(biāo)準(zhǔn)化
確保標(biāo)準(zhǔn)體現(xiàn)團(tuán)隊(duì)目前最佳的做法爪飘,讓大家知道他們正在作正確的事义起。突出重點(diǎn)
如果你只使用C語言,就不要為C师崎、C++默终、Java語言都創(chuàng)建樣式標(biāo)準(zhǔn)吧。逐步完善
一種明智的做法犁罩,是一次只完善一小部分內(nèi)部風(fēng)格齐蔽。比如先確定括號(hào)布局和縮進(jìn),當(dāng)大家都接受和執(zhí)行之后昼汗,再實(shí)施其他的標(biāo)準(zhǔn)肴熏。為推廣做計(jì)劃
不要采用懲罰措施鬼雀,但可以采用一些激勵(lì)辦法顷窒,如在代碼審核時(shí)進(jìn)行一個(gè)公開的表?yè)P(yáng)。
八、正義的戰(zhàn)爭(zhēng)
喬治.奧威爾(George Orwell):
要結(jié)束一場(chǎng)戰(zhàn)爭(zhēng)鞋吉,最快的辦法是輸?shù)羲?/p>
在編程社會(huì)中鸦做,代碼版面不是唯一的燙手山芋,會(huì)引起爭(zhēng)議的地方還有很多谓着,如編輯器泼诱、編譯器、方法論赊锚、最好的語言治筒。
作為一名職業(yè)程序員,我們應(yīng)當(dāng)從這些無謂的爭(zhēng)論中脫身舷蒲。我們要有有根據(jù)的個(gè)人意見耸袜,但不能傲慢地認(rèn)為自己就是對(duì)的。