代碼大全之個(gè)人精粹版_第1頁(yè)
代碼大全之個(gè)人精粹版_第2頁(yè)
代碼大全之個(gè)人精粹版_第3頁(yè)
代碼大全之個(gè)人精粹版_第4頁(yè)
代碼大全之個(gè)人精粹版_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

代碼大全精粹——個(gè)人整理版本目錄設(shè)計(jì)編碼質(zhì)量?jī)?yōu)化設(shè)計(jì)設(shè)計(jì)關(guān)鍵點(diǎn)1.封裝——信息隱藏類(lèi)或模塊,只提供合適的接口,并保持不變。實(shí)現(xiàn)細(xì)節(jié)和成員不要暴露給外界即其他模塊。反例:

pDomain=&(g_AAADomain[DomainID]);if(READY==pDomain->Status){…}正例:if(DomainIsReady(DomainID)){…}設(shè)計(jì)關(guān)鍵點(diǎn)封轉(zhuǎn)的好處:a.降低耦合。尤其是大模塊之間。b.降低復(fù)雜度。修改和閱讀代碼時(shí),一個(gè)時(shí)刻只用關(guān)心一層的設(shè)計(jì),不用在龐大的代碼中左支右絀。c.屏蔽變化源。例如某數(shù)據(jù)索引表從Hash表改成AVL樹(shù),不應(yīng)對(duì)外部產(chǎn)生影響,封裝可實(shí)現(xiàn)這種屏蔽。Notice:

封裝不僅應(yīng)該用在大模塊上,也應(yīng)該用在模塊內(nèi)的各子模塊上。C語(yǔ)言中不希望被外部調(diào)用的函數(shù),可通過(guò)函數(shù)名前加static前綴來(lái)實(shí)現(xiàn)信息隱藏設(shè)計(jì)關(guān)鍵點(diǎn)設(shè)計(jì)關(guān)鍵點(diǎn)2.隔離容易改變的區(qū)域找出明顯容易變化的功能,將之分離出來(lái)成獨(dú)立模塊。設(shè)計(jì)良好接口,使變化不影響模塊外部。容易變化的地方:a.業(yè)務(wù)規(guī)則。例如電話(huà)費(fèi)、上網(wǎng)費(fèi)的收費(fèi)模式、費(fèi)率等。b.硬件依賴(lài)性c.困難的設(shè)計(jì)區(qū)域和實(shí)現(xiàn)區(qū)域。因?yàn)檫@些設(shè)計(jì)和代碼不是很好,可能需要重新做。隔離使之對(duì)系統(tǒng)影響最低。舉例:請(qǐng)教練結(jié)合自己項(xiàng)目舉例設(shè)計(jì)關(guān)鍵點(diǎn)3.抽象抽象是從眾多的事物中抽取出共同的、本質(zhì)性的特征,而舍棄其非本質(zhì)的特征。抽象本身很“抽象”,不太容易理解。我們來(lái)通過(guò)軟件實(shí)例理解:C++項(xiàng)目中的抽象類(lèi)C項(xiàng)目中的通用算法庫(kù),例如Hash,就是抽象出了Hash算法的本質(zhì),而把具體的“雜湊函數(shù)”留給使用者注冊(cè)。請(qǐng)教練結(jié)合自己項(xiàng)目舉例設(shè)計(jì)關(guān)鍵點(diǎn)抽象的好處:關(guān)注高層規(guī)則,忽略無(wú)關(guān)細(xì)節(jié),降低軟件復(fù)雜度寫(xiě)出高復(fù)用性代碼更好的軟件層次結(jié)構(gòu)Notice:

抽象與語(yǔ)言無(wú)關(guān),C語(yǔ)言同樣可實(shí)現(xiàn)抽象。編碼子程序和變量名子程序長(zhǎng)度

無(wú)標(biāo)準(zhǔn)。但超過(guò)200行請(qǐng)小心,一般只有復(fù)雜算法(如AVL樹(shù),加密等)才會(huì)寫(xiě)出長(zhǎng)函數(shù),其余情況出現(xiàn)長(zhǎng)函數(shù)則要反省設(shè)計(jì)、分層是否合理。一個(gè)子程序只在自己的抽象層次上做一件事情。如果一個(gè)子程序的名字無(wú)法完全描述它做的事,就違背了這一原則。子程序和變量的名字:

總原則是讓代碼讀起來(lái)就跟自然語(yǔ)言一樣流暢。例如if(NameIsValid(userName)){

RemoveAllSpace(userName)…}子程序和變量名過(guò)程性子程序起強(qiáng)烈的“動(dòng)詞+賓語(yǔ)”的名字,例如RemoveAllSpace()等。邏輯判斷子程序,名字寫(xiě)為肯定語(yǔ)句。

面向?qū)ο罄樱篵oolCLASS_USER_NAME::IsValidName();C語(yǔ)言例子:BOOLNameIsValid(&userName);

使用時(shí)就是如下流暢的語(yǔ)句:if(userName.IsValidName())或if(!userName.IsValidName())if(NameIsValid(&userName))語(yǔ)句1.循環(huán)循環(huán)變量使用有意義的變量名,避免習(xí)慣性使用i,j,k反例:for(i=0;i<MAX_USER_ID;i++){for(j=0;j<MAX_PAYOUT_TYPE;i++){sum+=employee[i].payout[j];}}正例for(userID=0;userID<MAX_USER_ID;userID++){for(payType=0;payType<MAX_PAYOUT_TYPE;payType++){sum+=employee[userID].payout[payType];}}好處:提高可讀性避免i,j,k寫(xiě)代碼手誤設(shè)計(jì)關(guān)鍵點(diǎn)語(yǔ)句2.判斷語(yǔ)句判斷語(yǔ)句盡量寫(xiě)為肯定形式,少用==判斷反例:if(TRUE==procResult){….}正例:if(procSuccess){….}好處:接近自然語(yǔ)言,提高可讀性;避免==手誤為=設(shè)計(jì)關(guān)鍵點(diǎn)語(yǔ)句語(yǔ)句3.克服深層嵌套一份研究表明,很少有人能理解超過(guò)三層的嵌套。當(dāng)寫(xiě)出深層嵌套時(shí),如何改進(jìn)?方法一:重新梳理判斷邏輯,重新設(shè)計(jì)被嵌套的代碼。某些情況下深層嵌套是混亂思路的產(chǎn)物。方法二:把深層嵌套的代碼提取出來(lái)放進(jìn)單獨(dú)的子程序。只要提取的代碼是一個(gè)完整、獨(dú)立的概念。注釋1.盡量寫(xiě)出“自說(shuō)明代碼”盡量讓代碼像自然語(yǔ)言一樣流暢,即使不用注釋也能輕松看懂。通過(guò)好的子程序名、變量名、良好邏輯分層、清晰布局、低復(fù)雜度的控制流程和數(shù)據(jù)結(jié)構(gòu)等實(shí)現(xiàn)該目標(biāo)。2.注釋只允許有如下三類(lèi):1)概述性注釋。說(shuō)明某一段代碼的總體意思。例如一個(gè)子程序中,各功能段的概述說(shuō)明。2)目的性注釋。說(shuō)明一段代碼的意圖,要解決的問(wèn)題,而非解決的方法。例如函數(shù)頭的函數(shù)功能說(shuō)明3)說(shuō)明代碼無(wú)法表述的信息。例如與設(shè)計(jì)有關(guān)的注意事項(xiàng),優(yōu)化標(biāo)記等。其他類(lèi)型的注釋?zhuān)词菬o(wú)用的,重復(fù)說(shuō)明代碼本身已經(jīng)明白無(wú)誤的內(nèi)容;要么說(shuō)明代碼本身含糊不清,必須要另外說(shuō)明,這種情況下最好改進(jìn)代碼。

這是理想情況。在現(xiàn)有代碼無(wú)法達(dá)到自說(shuō)明的情況下,還是要將理解有困難的地方都進(jìn)行注釋。注釋質(zhì)量?jī)?yōu)化降低程序復(fù)雜度1.什么是程序復(fù)雜度程序復(fù)雜度的一個(gè)標(biāo)準(zhǔn):為了理解應(yīng)用程序,你必須在同一時(shí)間記住的智力實(shí)體的數(shù)量直觀標(biāo)準(zhǔn):理解程序所需要花費(fèi)的精力。復(fù)雜度代表什么?復(fù)雜度與程序可靠性成反比,與程序錯(cuò)誤率成正比。復(fù)雜度高的代碼可讀性差,難以理解2.如何度量復(fù)雜度TomMcCabe方法:通過(guò)子程序中“決策點(diǎn)”來(lái)數(shù)量衡量復(fù)雜度。1.從1開(kāi)始,一直往下通過(guò)程序2.一旦遇到以下關(guān)鍵字,或者其同類(lèi)的詞,就加1:if,while,repeat,for,and,or3.給case語(yǔ)句中的每一種情況都加1例子:如下子程序復(fù)雜度為多少?

int

firstNum(inta,intc){for(b=0;b<MAX_NUM;b++){if(a<b&&b<c){returnb;}}}降低程序復(fù)雜度4降低程序復(fù)雜度3.如何處理復(fù)雜度度量結(jié)果0-5子程序可能還不錯(cuò)6-10得想辦法簡(jiǎn)化子程序10+把子程序的某一部分拆分成另一個(gè)子程序并調(diào)用它把子程序的一部分提取成另一個(gè)子程序,不會(huì)降低整個(gè)程序的復(fù)雜度,只是把決策點(diǎn)移到其他地方。但這樣可以降低你在同一時(shí)間必須關(guān)注的復(fù)雜度水平。有時(shí)混亂的代碼是混亂思維的產(chǎn)物,這種情況需要重新整理出清晰的函數(shù)邏輯。(這條是我個(gè)人的總結(jié))10的上限不是絕對(duì),只是一個(gè)警示。有些情況下子程序高復(fù)雜度不可避免。開(kāi)發(fā)者測(cè)試1.什么是開(kāi)發(fā)者測(cè)試完整測(cè)試過(guò)程:?jiǎn)卧獪y(cè)試、組件測(cè)試、集成測(cè)試、回歸測(cè)試、系統(tǒng)測(cè)試。開(kāi)發(fā)者測(cè)試主要指前三項(xiàng):?jiǎn)卧獪y(cè)試:類(lèi)或子程序測(cè)試組件測(cè)試:也就是我們的模塊測(cè)試集成測(cè)試:多模塊的聯(lián)合測(cè)試2.推薦的測(cè)試項(xiàng)對(duì)每一項(xiàng)相關(guān)需求進(jìn)行測(cè)試對(duì)每一個(gè)相關(guān)設(shè)計(jì)關(guān)注點(diǎn)進(jìn)行測(cè)試典型數(shù)據(jù)、邊界數(shù)據(jù)、錯(cuò)誤數(shù)據(jù)測(cè)試舉例:四則運(yùn)算程序,請(qǐng)大家給出測(cè)試項(xiàng)。開(kāi)發(fā)者測(cè)試3.推薦的測(cè)試方法測(cè)試先行保留測(cè)試用例,用于后續(xù)重新測(cè)試(回歸測(cè)試)自動(dòng)化測(cè)試,使測(cè)試可快速、頻繁進(jìn)行。例如測(cè)試用例函數(shù)中使用Assert判斷結(jié)果,而非打印出來(lái)肉眼觀察。開(kāi)發(fā)者測(cè)試重構(gòu)重構(gòu)的定義:在不改變軟件外部行為的前提下,對(duì)其內(nèi)部結(jié)構(gòu)進(jìn)行改變,使之更容易理解并便于修改。問(wèn)題:何處需要重構(gòu),怎么重構(gòu)?1.何處需要重構(gòu),怎么重構(gòu)這里只說(shuō)明幾種常見(jiàn)類(lèi)型重復(fù)。代碼重復(fù)、結(jié)構(gòu)重復(fù)、邏輯重復(fù)。重復(fù)的代碼是抽象不夠的表現(xiàn)。如果是一個(gè)獨(dú)立完整的概念,可以提取成一個(gè)子程序(抽象)。舉例:多處的排序算法。冗長(zhǎng)子程序。如果把子程序的一部分提取來(lái)作為另一個(gè)獨(dú)立的子程序,可以讓代碼更清晰,就提取成子程序。循環(huán)過(guò)長(zhǎng)或嵌套過(guò)深。循環(huán)內(nèi)部的復(fù)雜代碼往往可以轉(zhuǎn)換成子程序。嵌套過(guò)深可以用前面“語(yǔ)句”中提過(guò)的方法解決。子程序命名不當(dāng)。需要子程序重命名,或合并、拆分子程序。難懂、拙劣的代碼。需要重整邏輯和流程。問(wèn)題:何時(shí)進(jìn)行重構(gòu)?重構(gòu)2.重構(gòu)的時(shí)機(jī)開(kāi)發(fā)時(shí),不斷重構(gòu)。在開(kāi)發(fā)階段,每完成一個(gè)小功能點(diǎn)、或修補(bǔ)一個(gè)缺陷時(shí),都應(yīng)該審視是否有需要重構(gòu)的地方,保證持續(xù)集成中代碼不腐化。維護(hù)時(shí),因故障或需求變化而修改某功能時(shí),對(duì)修改到的代碼進(jìn)行重構(gòu)。但注意只能重構(gòu)修改的地方!不能在解決故障時(shí)重構(gòu)與之無(wú)關(guān)的代碼!問(wèn)題:如何保證重構(gòu)安全?這可能是阻礙我們進(jìn)行重構(gòu)的最大因素!重構(gòu)3.如何保證重構(gòu)安全重構(gòu)前保存初始代碼,保證重構(gòu)失敗可以返回。重構(gòu)的步伐要小。盡量一次只處理一項(xiàng)重構(gòu),除非是最為簡(jiǎn)單的重構(gòu)。重新測(cè)試(回歸測(cè)試)。開(kāi)發(fā)者自測(cè)階段請(qǐng)保留測(cè)試用例,最好是自動(dòng)化測(cè)試用例,可以迅速重新測(cè)試,看重構(gòu)后的代碼能否通過(guò)之前的測(cè)試用例。重構(gòu)性能優(yōu)化1.性能優(yōu)化誤區(qū)隨時(shí)隨地進(jìn)行優(yōu)化

為微觀的最終效果不足道的優(yōu)化,可能浪費(fèi)了大量的時(shí)間,而對(duì)整個(gè)系統(tǒng)全局性的重要優(yōu)化視而不見(jiàn)。同時(shí)也為了微弱的性能提升而犧牲了正確性、可讀性等其他重要的軟件質(zhì)量。優(yōu)化=修改代碼

遍歷查找數(shù)據(jù)的代碼,再怎么修改優(yōu)化,也不可能超越Hash查找算法、AVL樹(shù)查找算法——優(yōu)化需要先從更高層的需求、設(shè)計(jì)做起!2.什么是真正的優(yōu)化按如下的優(yōu)先順序來(lái)思考提高性能:需求設(shè)計(jì)程序同操作系統(tǒng)交互代碼編譯硬件代碼調(diào)整首先從需求、設(shè)計(jì)、編譯器優(yōu)化等級(jí)、硬件等上面提高效率,可以更全局、簡(jiǎn)單、安全、高效地提高效率。最后才是考慮代碼

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論