在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 牛人業(yè)話 > <讀書筆記> 代碼整潔之道

            <讀書筆記> 代碼整潔之道

            作者: 時(shí)間:2016-08-01 來源:網(wǎng)絡(luò) 收藏

              二、關(guān)于函數(shù)的一些規(guī)則

            本文引用地址:http://www.biyoush.com/article/201608/294841.htm

              1、短小

              函數(shù)的第一規(guī)則就是短小。

              長度以20行封頂為最佳。

              if,else,while語句的塊應(yīng)該只有一行,這樣不但能保持函數(shù)短小,還能增加可讀性。

              函數(shù)的層級(jí)不應(yīng)該多于兩層,這樣才容易理解和閱讀。

              2、只做一件事

              函數(shù)應(yīng)該只做一件事,做好這一件事。

              判斷函數(shù)是否只做了一件事的方法就是看其是否能夠拆出一個(gè)函數(shù),該函數(shù)不是單純的重新詮釋其實(shí)現(xiàn)。

              3、每個(gè)函數(shù)一個(gè)抽象層級(jí)

              要確保函數(shù)做做一件事情,函數(shù)中的語句都要在同一抽象層級(jí)上。這是保持函數(shù)短小的要訣。

              4、函數(shù)參數(shù)

              最好少于3個(gè),0個(gè)和1個(gè)最佳,3個(gè)以上請(qǐng)使用結(jié)構(gòu)體代替。

              輸出參數(shù)比輸入?yún)?shù)更加難以理解,讀函數(shù)時(shí),習(xí)慣于認(rèn)為信息通過參數(shù)輸入函數(shù),通過返回值輸出。

              給函數(shù)起個(gè)好名字,使其能夠很好的解釋函數(shù)的意圖、以及參數(shù)的順序。比如assertExpectedEqualsActual(expected,actual)就容易理解和記憶。

              5、無副作用

              副作用指的是被其隱藏起來的事情,比如開機(jī)檢查密碼函數(shù),如果調(diào)用前密碼未經(jīng)初始化,就會(huì)出錯(cuò),就隱藏了其時(shí)序性耦合的要求。應(yīng)該在其函數(shù)中增加初始化密碼的功能,盡管違反了只做一件事的。

              6、分割指令與查詢

              函數(shù)修改某對(duì)象的狀態(tài)或者獲取該對(duì)象的參數(shù),應(yīng)該分為兩個(gè)函數(shù)實(shí)現(xiàn)。

              比如函數(shù)設(shè)置某個(gè)指定屬性,如果成功就返回true,失敗返回false,用例如下:

              if(set("username","unclebob"))...

              這樣的語句理解上面有歧義,set是動(dòng)詞,但是在上下文中感覺像形容詞,從讀者角度看,這句語句的意思是問username的屬性是否已經(jīng)設(shè)置為unclebob?還是詢問username的屬性是否成功設(shè)置為unclebob?因此最好改為如下所示:

              if(attributeExists("username"))

              {

              setAttribute("username","unclebob");

              }

              7、使用異常代替返回錯(cuò)誤值

              直接返回錯(cuò)誤鼓勵(lì)了在if語句中把指令當(dāng)做表達(dá)式使用,會(huì)導(dǎo)致多層次嵌套結(jié)構(gòu)。如果返回異常代替錯(cuò)誤碼,錯(cuò)誤處理代碼就可以從主路徑代碼中分離出來,得到簡(jiǎn)化

              8、不要重復(fù)

              重復(fù)的代碼可維護(hù)性差,如果算法修改,所涉及的地方都要更新,代碼臃腫,還會(huì)增加放過錯(cuò)誤的可能!

              如果一個(gè)算法在不同函數(shù)中重復(fù)出現(xiàn),則需要使用一個(gè)獨(dú)立的函數(shù)修復(fù)它。

              面向?qū)ο蠛兔嫦蚪M件編程也多多少少都是消除重復(fù)的策略。

              9、結(jié)構(gòu)化編程

              只要保持函數(shù)短小,偶爾出現(xiàn)return、break、continue語句沒有什么壞處,甚至比單入單出更具表達(dá)力。

              goto語句只在大函數(shù)中才能用到,因此盡量避免使用。

              10、如何寫出短小的函數(shù)

              寫代碼和寫文章一樣,先寫出初稿、再細(xì)細(xì)打磨,直至達(dá)到心中的樣子。

              初寫的函數(shù),一般都是冗長而復(fù)雜,有太多縮進(jìn)和嵌套循環(huán),名稱隨意性大,代碼有重復(fù)。通過分解函數(shù)、修改名稱、消除重復(fù),然后遵循本章的規(guī)則,重新組裝函數(shù),就可以寫出短小精煉的函數(shù)。

              三 關(guān)于注釋的規(guī)則

              1、注釋不能美化糟糕的代碼

              帶有少量注釋的整潔而有表達(dá)力的代碼,要比帶有大量注釋的零碎而復(fù)雜的代碼像樣的多!

              與其花時(shí)間寫注釋,不如花時(shí)間清理早搞定糟糕的代碼。

              代碼在變動(dòng)、演化,而很不幸,注釋不是總隨之變動(dòng),時(shí)間越久,注釋離代碼的本意就越久。只有代碼是唯一真正準(zhǔn)確的信息來源。。

              2、用代碼闡述

              使用代碼本身解釋其行為。

              比如//Check to see if the employee is eligible for full benefits

              if((employee.flags &HOURLY_FLAG)&&(employee.age > 65))

              通過創(chuàng)建與注釋所言同一事物的函數(shù)即可。

              if(employee.isEligibleForFullBenefits())

              3、好注釋

              法律信息,比如公司代碼規(guī)范要求寫的有關(guān)法律的注釋,版權(quán)聲明等。

              提供信息的注釋,更好的方法是使用函數(shù)名稱傳達(dá)信息。

              對(duì)意圖的解釋:注釋不僅提供了有關(guān)實(shí)現(xiàn)的有用信息,而且還提供了某個(gè)決定后面的意圖。

              闡釋:把晦澀難懂的參數(shù)或者返回值翻譯為可讀形式的注釋是有用的。

              警示:用于警告其它程序員會(huì)出現(xiàn)某種后果的注釋也是有用的。

              4、壞的注釋

              喃喃自語式:只是覺得因?yàn)檫^程需要就增加的注釋。

              多余的注釋:本身并不能比代碼提供更多的信息,就是多余。

              誤導(dǎo)性注釋:含義不精確或者容易引起誤導(dǎo)的注釋。

              循規(guī)性注釋:每個(gè)函數(shù)或者每個(gè)變量都要有注釋的規(guī)矩是全然可笑的,只會(huì)搞亂代碼。

              日志式注釋:在有源碼控制系統(tǒng)的今天,這種冗長的記錄只會(huì)讓模塊變得凌亂不堪,應(yīng)該刪除

              廢話注釋:對(duì)顯然之事喋喋不休,毫無新意。看代碼的人員,也幾乎對(duì)其視而不見。因此用整理代碼的決心替代廢話的沖動(dòng),會(huì)使你成為更優(yōu)秀的程序員。

              可怕的廢話:在知名開源庫的J**adoc中,也可以看到復(fù)制黏貼錯(cuò)誤,意思就是變量不一樣,注釋卻一樣。

              位置標(biāo)記:少用標(biāo)記欄,比如//Action//////////////////////////////,特定函數(shù)放在這個(gè)下面,多數(shù)時(shí)候是在不必要。

              括號(hào)后面的注釋:盡管對(duì)于多層嵌套有幫助,但是更應(yīng)該使用短小、封裝的函數(shù),如果你想標(biāo)記右括號(hào),其實(shí)應(yīng)該做的是縮短函數(shù)。

              歸屬與署名:源碼控制系統(tǒng)很善于記錄是誰在何時(shí)改動(dòng)了什么,沒有必要用小小的簽名搞臟代碼。比如注釋/*Added by Rick*/

              注釋掉的代碼:直接把代碼注釋掉是討厭的做法,別人可能認(rèn)為其一定有原因才留在這里不敢刪除,最后注釋掉的代碼像渣滓一樣堆在那里,別這么干!

              信息過多的注釋:別再注釋中增加歷史性話題或者無關(guān)的細(xì)節(jié)描述。

              不明顯的聯(lián)系:注釋的作用是解釋未能自我解釋的代碼,如果本身還需要解釋就沒有必要了。

              函數(shù)頭:短函數(shù)不需要太多注釋,只需要寫一個(gè)好名字就比注釋強(qiáng)得多!

              四 關(guān)于代碼格式的規(guī)則

              你應(yīng)該保持良好的代碼格式,選用一套管理代碼格式的簡(jiǎn)單規(guī)則,然后貫徹實(shí)施。如果在團(tuán)隊(duì)中工作,則團(tuán)隊(duì)?wèi)?yīng)該一致同意采用一套簡(jiǎn)單的格式規(guī)則,所有成員都要遵從。使用能幫你應(yīng)用這些格式規(guī)則的自動(dòng)化工具會(huì)很有幫助。

              1、格式的目的

              原始代碼修改很久之后,其代碼風(fēng)格和可讀性仍會(huì)影響到可維護(hù)性和擴(kuò)展性。

              代碼格式關(guān)乎溝通,而溝通時(shí)專業(yè)開發(fā)者的頭等大事!

              哪些代碼格式方面能幫助我們溝通呢?

              2、垂直格式

              垂直尺寸

              單個(gè)文件的長度尺寸與可理解性相關(guān),統(tǒng)計(jì)數(shù)據(jù)表明,用大多數(shù)為200行到500行的單個(gè)文件可以構(gòu)造出出色的系統(tǒng),短文件通常比長文件容易理解!

              函數(shù)布局

              函數(shù)名稱應(yīng)該足夠告訴我們是否在正確的模塊中,源文件頂部應(yīng)該給出高層次的概念和算法,細(xì)節(jié)應(yīng)該向下逐次展開,直至源文件中最低層的函數(shù)和細(xì)節(jié)。就像報(bào)紙一樣,標(biāo)題統(tǒng)領(lǐng)提綱概要,內(nèi)容逐次展開細(xì)節(jié)。

              空行

              在包聲明、函數(shù)之間、代碼塊之間應(yīng)該使用空行隔開,這條簡(jiǎn)單的規(guī)則極大的影響到代碼的視覺外觀。空白行作為一條線索,標(biāo)示出獨(dú)立的概念。

              靠近 如果說空白行隔開了概念,靠近的代碼則暗示了他們之間的緊密聯(lián)系。因此關(guān)系緊密的應(yīng)該互相靠近.

              垂直距離

              全局變量聲明應(yīng)該放到文件第一個(gè)函數(shù)聲明前,局部變量聲明放到函數(shù)頂部。相關(guān)函數(shù)應(yīng)該放在一起,調(diào)用者放在被調(diào)用者上面,這樣就能輕易找到被調(diào)用函數(shù),極大增強(qiáng)模塊的可讀性

              3、橫向格式

              行寬

              一行代碼應(yīng)該多寬?統(tǒng)計(jì)數(shù)據(jù)表明,70%的代碼行少于60個(gè)字符,代碼行應(yīng)該盡量短小,死守80字節(jié)有點(diǎn)僵化,但是不要超過100字符或者120字符。簡(jiǎn)單的規(guī)則是無需向右拖動(dòng)滾動(dòng)條,就可以看到全部代碼。

              水平區(qū)隔與靠近

              在運(yùn)算符號(hào)兩端(乘號(hào)除外,因其優(yōu)先級(jí)較高,多數(shù)格式化工具都忽視優(yōu)先級(jí))、函數(shù)名和右括號(hào)之間之間,函數(shù)參數(shù)之間增加空格!

              水平對(duì)齊

              經(jīng)驗(yàn)表明一組類聲明中的變量名、或者賦值語句的右值對(duì)齊沒有什么實(shí)際作用,因此左端對(duì)齊,使用同樣的空格區(qū)分規(guī)則即可。

              縮進(jìn)

              有縮進(jìn)的代碼結(jié)構(gòu),閱讀時(shí)可以很容易查找新的聲明、變量、類和函數(shù)塊,否則就需要折騰一番才能明白,程序員應(yīng)該依賴縮進(jìn)模式(在python中強(qiáng)制使用縮進(jìn)表示for循環(huán)的范圍,C語言中使用大括號(hào),但是也要依賴縮進(jìn)增強(qiáng)可讀性)。

              空范圍

              有時(shí)while或for語句的語句體為空,如下所示.右端的分號(hào)很難看見,容易讓人迷惑。

              while(dis.read(buf,0,readBufferSize) != 1);

              因此最好改為如下格式

              while(dis.read(buf,0,readBufferSize) != 1)

              {

              }

              團(tuán)隊(duì)規(guī)則

              在團(tuán)隊(duì)中,各成員應(yīng)該采用一致的代碼格式,如果各自風(fēng)格不同,會(huì)增加項(xiàng)目代碼的復(fù)雜度。

              五 單元測(cè)試

              過去10年來,編程專業(yè)領(lǐng)域進(jìn)步很大,特別是敏捷和(測(cè)試驅(qū)動(dòng)開發(fā))運(yùn)動(dòng)鼓舞了很多程序員編寫單元測(cè)試。要我們?cè)诰帉懮a(chǎn)代碼之前先編寫測(cè)試,其還有三大定律:

              定律一:再編寫不能測(cè)試通過的測(cè)試驅(qū)動(dòng)前,不可編寫生產(chǎn)代碼

              定律二:只可編寫剛好無法通過的單元測(cè)試,不能編譯也不算通過

              定律三:只可編寫剛好足以通過當(dāng)前失敗測(cè)試的生產(chǎn)代碼。

              這些定律要求測(cè)試與生產(chǎn)代碼一起編寫,測(cè)試代碼先寫,這樣寫程序,測(cè)試將覆蓋所有生產(chǎn)代碼。

              1、保持測(cè)試的整潔

              測(cè)試代碼和生產(chǎn)代碼一樣,需要被思考、設(shè)計(jì)和照料,像生產(chǎn)代碼一樣整潔

              正是單元測(cè)試讓你的代碼可擴(kuò)展、可維護(hù)、可復(fù)用。如果沒有測(cè)試,每次修改都可能帶來缺陷,無論架構(gòu)如何有擴(kuò)展性,設(shè)計(jì)劃分如何好,如果沒有單元測(cè)試,你的改動(dòng)都可能帶來不可預(yù)知的缺陷。

              2、整潔的測(cè)試

              整潔的唯一要素的就是可讀性,在單元測(cè)試中,可讀性比生產(chǎn)代碼還重要。如何做到可讀性?就是要明確、簡(jiǎn)潔和具有足夠的表達(dá)力。

              測(cè)試要采用構(gòu)造-操作-檢驗(yàn)?zāi)J?,每個(gè)測(cè)試均要可以清晰的拆分為三個(gè)環(huán)節(jié),第一個(gè)環(huán)節(jié)構(gòu)造測(cè)試數(shù)據(jù),第二個(gè)環(huán)節(jié)操作測(cè)試數(shù)據(jù),第三個(gè)環(huán)節(jié)檢驗(yàn)操作是否得到期望的結(jié)果。

              3、每個(gè)測(cè)試一個(gè)斷言

              單個(gè)測(cè)試函數(shù)有且僅有一個(gè)斷言是個(gè)好準(zhǔn)則。

              每個(gè)測(cè)試做測(cè)試一個(gè)概念,如果一個(gè)測(cè)試測(cè)量三件事情,可能會(huì)導(dǎo)致遺漏。

              4、整潔的5條規(guī)則

              快速(fast),測(cè)試應(yīng)該快速運(yùn)行,你才能想要頻繁運(yùn)行它,如果不頻繁運(yùn)行,就不能盡早發(fā)現(xiàn)問題。

              獨(dú)立(Independent),測(cè)試應(yīng)該互相獨(dú)立,從而可以單獨(dú)運(yùn)行每個(gè)測(cè)試。

              可重復(fù)(Repeatable),測(cè)試應(yīng)該在任何環(huán)境中重復(fù)通過,否則當(dāng)前環(huán)境具備時(shí),你也會(huì)無法運(yùn)行測(cè)試。

              自足驗(yàn)證(Self-Validating),測(cè)試應(yīng)該有布爾值輸出去,無論如何不應(yīng)該查看日志文件來確認(rèn)測(cè)試是否通過。

              及時(shí)(Timely),測(cè)試應(yīng)該及時(shí)編寫,如果在生產(chǎn)代碼之后編寫測(cè)試,你會(huì)發(fā)現(xiàn)代碼難以測(cè)試。


            上一頁 1 2 下一頁

            關(guān)鍵詞: 代碼 TDD

            評(píng)論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉