Change Dir

          先知cd——熱愛生活是一切藝術(shù)的開始

          統(tǒng)計(jì)

          留言簿(18)

          積分與排名

          “牛”們的博客

          各個(gè)公司技術(shù)

          我的鏈接

          淘寶技術(shù)

          閱讀排行榜

          評(píng)論排行榜

          從形式上寫優(yōu)秀代碼

           

          1.    優(yōu)秀代碼

          什么樣的代碼是優(yōu)秀的代碼?這個(gè)概念目前還沒有人能確切的定義。然而廣大的程序設(shè)計(jì)人員普遍都認(rèn)可的一系列標(biāo)準(zhǔn)基本上從各個(gè)層面提出了對(duì)優(yōu)秀代碼的要求。最近在讀《編程匠藝》,覺得文章都寫的很出色,相比之前讀《卓有成效的程序員》,該作從代碼本身講述了編程“那些事”。深受啟發(fā),寫寫讀后總結(jié)。

          http://gxgonline.bokee.com/679308.html 這里有一段“優(yōu)秀代碼標(biāo)準(zhǔn)”,具體限于篇幅不再贅述。只是從自己這個(gè)編程菜鳥的角度,去談?wù)剬?duì)編寫優(yōu)秀代碼的理解。正如每個(gè)人心中都有一個(gè)衡量標(biāo)準(zhǔn)一樣,我對(duì)優(yōu)秀代碼也有一個(gè)衡量的標(biāo)準(zhǔn):結(jié)果正確的,形式優(yōu)美的,性能高效的,易重用和健壯。當(dāng)然結(jié)果的正確性和程序本身的性能取決于算法設(shè)計(jì),這是另一回事,不是本文所討論的問題,本文只討論與代碼的形式和結(jié)構(gòu)有關(guān)的問題。

          2. 編寫優(yōu)秀代碼

                 優(yōu)秀的代碼首先具有優(yōu)美的樣式,我想這點(diǎn)是所有編程人員所共識(shí)的。沒有人愿意讀晦澀難懂的代碼,相反,如果放在你面前的代碼結(jié)構(gòu)清晰,樣式優(yōu)美,那么讀程序的人想必也讀的心曠神怡了。要記住一點(diǎn),代碼寫出來并不是永遠(yuǎn)給自己看的,而且就算給自己看,也不是一直都能看的懂的。那么如何寫出形式優(yōu)美的代碼呢?第一點(diǎn)應(yīng)該注意的就是代碼樣式,什么是好的樣式:一致,傳統(tǒng),簡(jiǎn)潔。

          一致的代碼主要指程序中代碼縮進(jìn)要一致,括號(hào)的位置要一致……其實(shí)不用細(xì)數(shù),所有的一切關(guān)于代碼的東西,都要一致。正像那些大師們說的,“挑選一種適合你的風(fēng)格,然后堅(jiān)持下去”,這就是一致。那么好了,有哪些好的風(fēng)格呢,經(jīng)典的括號(hào)位置有K&R風(fēng)格和懸掛式風(fēng)格,具體是什么樣的,見下表:

          1. 括號(hào)風(fēng)格

          K&R風(fēng)格

          void k_r_style() {
              
          // Do something
          }

           

          懸掛式風(fēng)格

           

          void exdented()
          {
              
          // Do something
          }

           

          另外一個(gè)要一致的東西就是命名了,就像文章由斷落、章句和字詞組成一樣,代碼也由變量、函數(shù)、類型等等構(gòu)成。合理一致的命名對(duì)于代碼的樣式同樣重要。“恰當(dāng)?shù)孛年P(guān)鍵是準(zhǔn)確理解你所命名的對(duì)象。只有這樣你才能給它起一個(gè)有意義的名稱。如果你不能為某個(gè)對(duì)象起一個(gè)號(hào)名字,那么你就不會(huì)真的知道這個(gè)對(duì)象是什么或者這個(gè)對(duì)象真的有必要存在嗎?”

          接下來說說名字,名字首先得是描述性的,單純的字母命名是我們編程最常用的,為什么如此,我把它歸結(jié)為我們初學(xué)編程時(shí)那一點(diǎn)點(diǎn)的懶惰,隨便的定義int a, int b這樣的變量,完成著短小的程序。但是當(dāng)程序漸漸的大起來,文件漸漸的多起來,這樣的變量名字顯得那么的渺小和蒼白而最終毫無意義。所以如果無法描述一個(gè)對(duì)象,就不要為它起名字。第二,技術(shù)上是正確的,關(guān)于這點(diǎn),由于現(xiàn)在的編程工作大多是在IDE下進(jìn)行,因此這部分的檢查工作我們程序員都交給了IDE,當(dāng)然如果命名滿足了第一條——具有描述性——那么也基本不會(huì)違反技術(shù)規(guī)范了。第三,恰當(dāng)?shù)?,恰?dāng)?shù)拿w現(xiàn)在長(zhǎng)度和格調(diào)上,也許你為一個(gè)變量起了一個(gè)具有描述性的名字并且也是技術(shù)上正確的(且符合語(yǔ)言習(xí)慣),但是它卻長(zhǎng)達(dá)30個(gè)字符(theNumberOfImagesInMyComputer)或者只有1個(gè)字符(a,b等等),這樣的做法是不好的。對(duì)于命名格調(diào)的理解,我想這是一個(gè)文化背景的問題,有的人很喜歡用foobar這樣的詭異名字,這樣做其實(shí)違反了“傳統(tǒng)”原則,這個(gè)稍后會(huì)提到。關(guān)鍵需要記住的“了解你的語(yǔ)言的命名規(guī)則。但更重要的是看,了解這種語(yǔ)言的習(xí)慣用法。公共命名約定是什么?應(yīng)用這些語(yǔ)言習(xí)慣和約定。”

          編碼要符合標(biāo)準(zhǔn),這樣就會(huì)與別人的一致,同樣也會(huì)與自己過去寫的代碼一致。這種縱向橫向的一致往往從一個(gè)編程標(biāo)準(zhǔn)開始。當(dāng)然編程標(biāo)準(zhǔn)的制定也應(yīng)該是盡量符合傳統(tǒng),這就說到第二個(gè)問題了。

          不要去新鮮的創(chuàng)造樣式,而應(yīng)該去遵循傳統(tǒng)。這樣可以確保別人讀懂你的代碼,同時(shí)不會(huì)讓未來的自己和其他人犯暈。我理解的傳統(tǒng)更像是一種大眾化,就像上面講到命名時(shí)說的,不要用詭異的名字,foobar不是什么好的選擇。

          簡(jiǎn)潔講的更多是一種補(bǔ)充。假設(shè)你自己訂立一個(gè)標(biāo)準(zhǔn)的話,你遵循了傳統(tǒng),也一直堅(jiān)持使用它,但是由于你的天才你把編程標(biāo)準(zhǔn)弄的過于復(fù)雜,這樣可是苦了其他的程序員了。所以,能簡(jiǎn)潔是盡量簡(jiǎn)潔,不要追求華而不實(shí)的代碼樣式。記得自己以前寫代碼,總寫一些類似于“a[index++] = some();”這樣的代碼?,F(xiàn)在想想,還是改成“a[index] = some(); index++;”這樣更簡(jiǎn)潔。簡(jiǎn)潔不意味著代碼行數(shù)少,而是讓人看著舒服。

          我認(rèn)為,程序員寫代碼就像作家寫文章一樣,清新的結(jié)構(gòu),行云流水的成文往往能令讀者身臨其境。而我們作為讀者讀代碼的過程中,也無不希望代碼優(yōu)美,就像是在看優(yōu)美的散文一樣。其實(shí)說了這么多,無論是縮進(jìn)或者括號(hào)位置更甚者是命名,這都是在增強(qiáng)我們代碼的可讀性。當(dāng)你讀代碼像讀文章一樣,那時(shí)你就是一個(gè)專業(yè)程序員了,當(dāng)你寫代碼能像寫文章時(shí),那時(shí)你就是一個(gè)優(yōu)秀程序員了。

          當(dāng)然代碼的可讀性離不開注釋,注釋本身不是代碼,但是確是優(yōu)秀代碼所必不可少的東西。“注釋的目標(biāo)讀者是人,而不是計(jì)算機(jī)。”注釋是一種內(nèi)部的文檔化機(jī)制。什么時(shí)候?qū)懽⑨屇兀窟@個(gè)問題其實(shí)很好回答:當(dāng)你需要解釋代碼為什么時(shí),去寫注釋。那么如何寫呢?記住幾條法則,確保遵循這些法則,那么你也能寫出美妙的注釋。第一,不要描述代碼,“一個(gè)事實(shí)——一個(gè)源頭,不要在注釋中重復(fù)代碼。”因?yàn)楸旧砟闶窃诮忉尀槭裁炊鴮懘a,這是一種目的解釋,而不是過程描述。所以如果你有解釋代碼的注釋習(xí)慣,那么,摒棄它吧(當(dāng)然個(gè)別難以理解的算法除外)。第二,不要取代代碼,“當(dāng)你發(fā)現(xiàn)自己在編寫密密麻麻的注釋來解釋你的代碼時(shí),趕快停下來。”注釋的字?jǐn)?shù)不會(huì)太多,大量的注釋看著也讓人頭痛。第三,確保注釋有用,“想一想你在注釋中寫些什么,不要不動(dòng)腦筋就輸入。寫完之后要在代碼的上下文中回顧一遍這些注釋。它們是否包含了正確的信息?”確保注釋是有價(jià)值的,是真的,是容易理解和清晰明了的,不要用一些含混不清的俚語(yǔ)或個(gè)人幽默。最后,避免分心。注釋中不應(yīng)該包含那些陳年舊事,也不應(yīng)該用各種ASCII圖形來美化,因?yàn)樽煮w寬度變化的多種編輯器可能讓你這種美化丑陋不堪。同時(shí)我也不是很支持在代碼塊的結(jié)尾用“//end if(a<1)”這樣的注釋來解釋。清晰的縮進(jìn)和括號(hào)已經(jīng)可以解釋一切了。

          說到底,清晰代碼結(jié)構(gòu),良好的編碼風(fēng)格和注釋,都是在提高我們代碼的可讀性。而我們寫這樣代碼的目標(biāo)就是代碼的自文檔化。我們總會(huì)在寫完代碼的時(shí)候,花費(fèi)大量的時(shí)間去寫文檔,這其實(shí)從架構(gòu)層面來講,增大了耦合,誰(shuí)的耦合?代碼和文檔的。代碼一經(jīng)改變,文檔相應(yīng)也要改變。這樣的復(fù)雜關(guān)聯(lián)總是耗費(fèi)了編程人員大量的精力,那么為什么不去在代碼本身的形式上花些功夫呢?如果我們都能編寫可以閱讀的代碼,人性化,簡(jiǎn)單易懂,那么文檔還需要嗎?就像我們看書籍作品,很少見哪本小說還配著一部說明文檔的。

          最后,再說一說代碼的易用性和健壯性。除了美觀可讀這些外部特性外,編寫代碼還應(yīng)該具有易用性和健壯性?!?/span>Code Craft》里提倡使用防御性編程,并給出了防御性編程的一些技巧。當(dāng)然我并不是防御性編程的fans,也不是契約式編程的死忠。只是從健壯性的角度看,防御性編程是必須的。然而過多的防御降低了代碼的效率,有時(shí)候甚至是美觀,這樣的代碼也許使問題復(fù)雜了。不管怎么說,代碼的易用和健壯是經(jīng)驗(yàn)積累的體現(xiàn),怎樣寫出這樣的代碼?好吧,沒有捷徑,大量的編寫代碼并閱讀其他人寫的優(yōu)秀的代碼。漸漸的,你會(huì)發(fā)現(xiàn),你的代碼也可以同樣的優(yōu)秀。

          3. 小結(jié)

                 本文主要從代碼的形式上講述了編寫優(yōu)秀代碼應(yīng)該注意的一些細(xì)節(jié)。當(dāng)然,代碼的核心——算法沒有涉及。最后的一些關(guān)于代碼健壯性的認(rèn)識(shí)也是拙劣有余。作為一個(gè)編寫代碼愛好者,寫出優(yōu)秀的代碼是我們追求的目標(biāo)。培養(yǎng)良好的編程習(xí)慣,掌握更多的編程技巧,不斷的編寫和閱讀……一點(diǎn)心得,一點(diǎn)總結(jié)。

          4. 參考文獻(xiàn)及推薦閱讀

          [1]http://gxgonline.bokee.com/679308.html

          [2]編程匠藝, Pete. Goodliffe著,韓江、陳玉譯

          [3]如何編寫優(yōu)秀代碼,http://hi.baidu.com/08027/blog/item/bc30cefe78e1bf305d6008ef.html

          posted on 2010-04-19 10:35 changedi 閱讀(596) 評(píng)論(0)  編輯  收藏 所屬分類: 雜談

          主站蜘蛛池模板: 乌苏市| 印江| 扎囊县| 永和县| 柞水县| 凤凰县| 本溪市| 柳江县| 崇左市| 西昌市| 辉县市| 安庆市| 通道| 始兴县| 福建省| 会昌县| 浮山县| 姚安县| 青冈县| 德格县| 浙江省| 台湾省| 天长市| 大荔县| 桦甸市| 黔江区| 沧州市| 枣阳市| 易门县| 宁武县| 浦城县| 章丘市| 英山县| 五指山市| 雅江县| 察隅县| 遂宁市| 夹江县| 连城县| 肇东市| 彰化市|