讀《編程匠藝—編寫卓越的代碼》:源代碼的版面與樣式

《新約.約翰福音》:
不可按外貌斷定是非,總要按公平斷定是非永毅。

一客燕、重要的版面與樣式

  • 程序員根據(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)格

  1. 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)格。

  1. 懸掛式
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)空間

  1. 縮進(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)許多人并不喜歡损俭。

  1. 其他風(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ì)的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末牲平,一起剝皮案震驚了整個(gè)濱河市堤框,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纵柿,老刑警劉巖蜈抓,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異昂儒,居然都是意外死亡沟使,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門荆忍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來格带,“玉大人,你說我怎么就攤上這事刹枉∵闯” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵微宝,是天一觀的道長(zhǎng)棺亭。 經(jīng)常有香客問我,道長(zhǎng)蟋软,這世上最難降的妖魔是什么镶摘? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮岳守,結(jié)果婚禮上凄敢,老公的妹妹穿的比我還像新娘。我一直安慰自己湿痢,他們只是感情好涝缝,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布扑庞。 她就那樣靜靜地躺著,像睡著了一般拒逮。 火紅的嫁衣襯著肌膚如雪罐氨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天滩援,我揣著相機(jī)與錄音纫骑,去河邊找鬼盏触。 笑死钱烟,一個(gè)胖子當(dāng)著我的面吹牛琼了,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播恩袱,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼恰矩,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了憎蛤?” 一聲冷哼從身側(cè)響起外傅,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎俩檬,沒想到半個(gè)月后萎胰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡棚辽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年技竟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屈藐。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡榔组,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出联逻,到底是詐尸還是另有隱情搓扯,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布包归,位于F島的核電站锨推,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏公壤。R本人自食惡果不足惜换可,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望厦幅。 院中可真熱鬧沾鳄,春花似錦、人聲如沸确憨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至磁椒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間玫芦,已是汗流浹背浆熔。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留桥帆,地道東北人医增。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像老虫,于是被迫代替她去往敵國(guó)和親叶骨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 查爾斯.普雷斯特.斯科特(Charles Prestwich Scott):評(píng)論是自由的祈匙,但事實(shí)是神圣的 注釋可以...
    思學(xué)閱讀 1,013評(píng)論 0 10
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法忽刽,類相關(guān)的語法,內(nèi)部類的語法夺欲,繼承相關(guān)的語法跪帝,異常的語法,線程的語...
    子非魚_t_閱讀 31,587評(píng)論 18 399
  • iOS編程規(guī)范0規(guī)范 0.1前言 為??高產(chǎn)品代碼質(zhì)量,指導(dǎo)廣大軟件開發(fā)人員編寫出簡(jiǎn)潔些阅、可維護(hù)伞剑、可靠、可 測(cè)試市埋、高效...
    iOS行者閱讀 4,435評(píng)論 21 35
  • 茫茫人海中 就這么一眼 你便成為唯一 你那迷人的眼眸 毒我一見鐘情 毒我念念不忘 令我心頭小鹿 到處亂竄 我試圖著...
    獨(dú)木前行閱讀 112評(píng)論 0 2
  • 今天是新精英生涯咨詢師執(zhí)業(yè)班上課的第五天黎泣。 如往常一樣,自己提前醒了缤谎,太累了抒倚,沒有睜開眼。當(dāng)早晨的鬧鐘響起時(shí)坷澡,自己...
    楊瑜茹生涯咨詢師閱讀 266評(píng)論 0 0