設(shè)計(jì)
設(shè)計(jì)是否經(jīng)過(guò)多次迭代腹鹉,并最終決定了最好的一個(gè)她奥?
是否同時(shí)使用自上而下和自下而上的方法來(lái)解決設(shè)計(jì)問(wèn)題?
類與類之間的交互關(guān)系是否已經(jīng)設(shè)計(jì)為最小化别厘?
設(shè)計(jì)被劃分為層次嗎虱饿?
你對(duì)把這一程序分解成為子程序,包和類的方式感到滿意嗎触趴?
程序是不是易于維護(hù)氮发?
設(shè)計(jì)是否精簡(jiǎn)?設(shè)計(jì)出來(lái)的每一個(gè)部分都絕對(duì)必要嗎冗懦?
整體而言爽冕,你的設(shè)計(jì)是否有助于最小化偶然性和本質(zhì)性的復(fù)雜度嗎?
類的設(shè)計(jì)
你是否把程序中的類都看做是抽象數(shù)據(jù)類型了披蕉?是否從這個(gè)角度評(píng)估它們的接口了颈畸?
類是否有一個(gè)中心目的?
類的命名是否恰當(dāng)嚣艇?其名字是否表達(dá)了其中新目的承冰?
類的接口是否展現(xiàn)了一致的抽象?
類的接口是否能讓人清楚明白的知道如何用它食零?
類的接口是否抽象困乒,使你能不必顧慮他是如何實(shí)現(xiàn)其服務(wù)的?你能把類看做黑盒子嗎贰谣?
類提供的服務(wù)是否足夠完整娜搂,讓其它類無(wú)需動(dòng)用其內(nèi)部數(shù)據(jù)?
是否已從類中去除無(wú)關(guān)信息吱抚?
是否考慮過(guò)把類進(jìn)一步分解百宇?
在修改類時(shí)是否維持了其接口的完整性?
是否把成員的可訪問(wèn)性降到最忻乇携御?
是否避免暴露類的數(shù)據(jù)成員?
類是否避免對(duì)其使用者既绕,包括其派生類會(huì)如何使用它做了假設(shè)啄刹?
類是否不依賴于其它類?它是松散耦合嗎凄贩?
繼承是否只用來(lái)建立一個(gè)is a關(guān)系誓军?派生類是否遵循了LSP原則。
繼承層次是否很淺疲扎?
類中是否只有大約七個(gè)或者更少的成員昵时?
是否把類直接或者間接調(diào)用其他類的子程序的數(shù)量減到最少捷雕?
類是否在絕對(duì)必要時(shí)才與其他類寫作?
是否在構(gòu)造函數(shù)中初始化了所有的數(shù)據(jù)成員壹甥?
子程序
創(chuàng)建子程序的理由充分嗎救巷?
一個(gè)子程序中所有適合單獨(dú)提出的部分是不是已經(jīng)被提出到單獨(dú)的子程序中了?
過(guò)程的名字是否用了強(qiáng)烈盹廷、清晰的動(dòng)詞加賓語(yǔ)的詞組征绸,函數(shù)的名字是否描述了其返回值?
子程序的名字是否描述它所作的全部事情俄占?
子程序是否具有強(qiáng)烈的功能上的內(nèi)聚性?
子程序之間是否有較松散的耦合淆衷?子程序與其它子程序之間的連接是否是最小的缸榄,明確的,可見(jiàn)的祝拯,靈活的甚带?
子程序的長(zhǎng)度是否是由其功能和邏輯自然確定,而非遵循任何人為的編碼標(biāo)準(zhǔn)佳头?
子程序的參數(shù)表是否表現(xiàn)出一種具有整體性且一致的抽象鹰贵?
子程序參數(shù)的排列順序是否合理?是否與類似的子程序的參數(shù)排列相符康嘉?
接口假定是否在文檔中說(shuō)明碉输?
子程序的參數(shù)是否沒(méi)有超過(guò)7個(gè)?
是否用到了每一個(gè)輸入?yún)?shù)亭珍,是否用到了每一個(gè)輸出參數(shù)敷钾?
子程序是否避免了把輸入?yún)?shù)用作工作變量?
如果子程序是一個(gè)函數(shù)肄梨,那么它是否在所有可能的情況下都能返回一個(gè)合法的值阻荒?
防御式編程
子程序是否保護(hù)自己免遭有害輸入數(shù)據(jù)的破壞?
你用斷言來(lái)說(shuō)明編程假定嗎众羡?其中包括了前條件和后條件了嗎侨赡?
斷言是否只說(shuō)明從來(lái)不應(yīng)該發(fā)生的情況?
你是否在架構(gòu)或者高層設(shè)計(jì)中規(guī)定了一組特定的錯(cuò)誤處理技術(shù)粱侣?
你是否在架構(gòu)或者高層設(shè)計(jì)中規(guī)定了是讓錯(cuò)誤處理更傾向于健壯性還是正確性羊壹?
代碼中用到輔助調(diào)試的代碼了嗎?
在防御式編程時(shí)引入的代碼量是否適宜甜害,既不過(guò)多也不過(guò)少舶掖?
你在項(xiàng)目中定義了一套標(biāo)準(zhǔn)化的異常處理方案嗎?
如果可能的話尔店,是否在局部處理了錯(cuò)誤而不是把它當(dāng)成一個(gè)異常跑出去眨攘?
所有異常是否都與拋出他們的子程序在同一抽象層次上主慰?
每個(gè)異常是否包含了關(guān)于異常發(fā)生的所有背景信息?
代碼中是否沒(méi)有空的catch語(yǔ)句鲫售?
檢查有害輸入數(shù)據(jù)的代碼是否也檢查了故意的緩沖區(qū)溢出共螺,SQL注入,HTML注入情竹,整數(shù)溢出及其他惡意輸入數(shù)據(jù)藐不?
是否檢查了所有的錯(cuò)誤返回碼?
是否捕獲了所有的異常秦效?
出錯(cuò)消息中是否避免出現(xiàn)有助于攻擊者攻入系統(tǒng)所需的信息雏蛮?
偽代碼
是否檢查過(guò)已滿足所有的先決條件?
定義好這個(gè)類要解決的問(wèn)題了嗎阱州?
高層次的設(shè)計(jì)是否清晰挑秉?能給這個(gè)類和其中的每個(gè)子程序起一個(gè)好的名字嗎?
考慮過(guò)該如何測(cè)試這個(gè)類及其中的每個(gè)子程序嗎苔货?
關(guān)于效率的問(wèn)題犀概,你主要從穩(wěn)定的接口和可讀的實(shí)現(xiàn)這兩個(gè)角度考慮嗎?還是主要從滿足資源和速度的預(yù)期目標(biāo)的角度考慮過(guò)呢夜惭?
從標(biāo)準(zhǔn)庫(kù)函數(shù)和其它代碼庫(kù)中尋找過(guò)可用的子程序或者組件嗎姻灶?
從參考書中查過(guò)有用的算法了嗎?
是否用詳盡的偽代碼設(shè)計(jì)好每一個(gè)子程序诈茧?
你在腦海里檢查過(guò)偽代碼嗎产喉?這些偽代碼容易理解嗎?
關(guān)注過(guò)那些可能讓你重返設(shè)計(jì)的警告信息了嗎若皱?
是否把偽代碼正確的翻譯成代碼了镊叁?
你反復(fù)使用偽代碼編程過(guò)程了嗎?
在做出假定的時(shí)候有沒(méi)有對(duì)它們加以說(shuō)明走触?
已經(jīng)刪除了那些冗余的注釋了嗎晦譬?
你是否采取了幾次迭代中最好的那個(gè)結(jié)果?還是在第一次迭代之后就停止了互广?
你完全理解你的代碼了嗎敛腌?這些代碼是否容易理解?
變量
變量聲明位置靠近變量第一次使用的位置嗎惫皱?
盡可能在變量聲明的同時(shí)初始化變量嗎像樊?
計(jì)數(shù)器和累加器經(jīng)過(guò)適當(dāng)初始化了嗎?如果需要再一次使用旅敷,之前重新初始化了嗎生棍?
適當(dāng)?shù)闹匦鲁跏蓟靶枰貜?fù)執(zhí)行的代碼里的變量”了嗎?
代碼在通過(guò)編譯器編譯的時(shí)候是不是沒(méi)有警告信息媳谁?你啟用了所有可用的警告信息了嗎涂滴?
如果語(yǔ)言允許隱式聲明友酱,你為由此可能引發(fā)的問(wèn)題做好補(bǔ)償措施了嗎?
如果可能柔纵,所有變量都被定義為具有最小的作用域嗎缔杉?
各變量的引用點(diǎn)都盡可能集中在一起嗎?對(duì)同一個(gè)變量的兩次相鄰引用搁料,或者變量的整個(gè)生命期都這樣做了嗎或详?
控制結(jié)構(gòu)符合數(shù)據(jù)類型嗎?
所有聲明的變量都用了嗎郭计?
變量都在合適的時(shí)間綁定了嗎霸琴?也就是說(shuō)你有意識(shí)的在晚期綁定所帶來(lái)的靈活性和增加復(fù)雜度之間做出平衡了嗎?
每個(gè)變量都有且僅有一項(xiàng)用途嗎拣宏?
每個(gè)變量的含義都很明確且沒(méi)有隱含含義嗎沈贝?
變量命名
名字完整并且準(zhǔn)確的表達(dá)了變量所代表的含義嗎?
名字足夠長(zhǎng)勋乾,可以讓你無(wú)需苦苦思索嗎?
如果有計(jì)算限定符嗡善,它被放在名字后面嗎辑莫?
名字中用Count或者index來(lái)掉提Num了嗎?
循環(huán)小標(biāo)的名字有意義嗎罩引?
所有臨時(shí)的變量都重新命名為更有意義的名字了嗎各吨?
當(dāng)布爾變量為真時(shí),變量能準(zhǔn)確表達(dá)其含義嗎袁铐?
枚舉中的名字含有能夠表示其類別的前綴或者后綴嗎揭蜒?
具名常量是根據(jù)它所代表的抽象實(shí)體兒不是它所代表的數(shù)字來(lái)命名的嗎?
命名規(guī)則能夠區(qū)分局部數(shù)據(jù)剔桨,類的數(shù)據(jù)和全局?jǐn)?shù)據(jù)嗎屉更?
規(guī)則能夠區(qū)分類型名,具名常量洒缀,枚舉類型和變量名嗎瑰谜?
規(guī)則能夠在編譯器不強(qiáng)制檢測(cè)只讀參數(shù)的語(yǔ)言里表示出子程序的輸入?yún)?shù)嗎?
規(guī)則能盡可能地與語(yǔ)言的標(biāo)準(zhǔn)規(guī)則兼容嗎树绩?
名字為可讀性而加以格式化了嗎萨脑?
是否避免只為了省一個(gè)字符而縮寫的情況?
所有單詞的縮寫方式都一致嗎饺饭?
名字能夠讀出來(lái)嗎渤早?
避免使用容易被看錯(cuò)和讀錯(cuò)的名字嗎?
在縮寫對(duì)照表里對(duì)端名字做出說(shuō)明了嗎瘫俊?
基本數(shù)據(jù)類型
代碼中避免使用神秘?cái)?shù)值了嗎鹊杖?
代碼考慮了除零錯(cuò)誤了嗎悴灵?
類型轉(zhuǎn)換很明顯嗎?
如果一條語(yǔ)句中存在兩個(gè)不同類型的變量仅淑,那么這條語(yǔ)句會(huì)像你期望的那樣求值嗎称勋?
代碼避免了混合類型比較嗎?
使用整數(shù)除法表達(dá)式能按預(yù)期的那樣工作嗎涯竟?
整數(shù)表達(dá)式避免整數(shù)溢出問(wèn)題了嗎赡鲜?
代碼避免了對(duì)數(shù)量級(jí)相差具體大浮點(diǎn)數(shù)做加減運(yùn)算了嗎?
代碼系統(tǒng)地阻止了舍入錯(cuò)誤的發(fā)生嗎庐船?
代碼避免對(duì)浮點(diǎn)數(shù)值做等量比較了嗎银酬?
代碼避免使用神秘字符和字符串了嗎?
使用字符串時(shí)避免了off-bye-one錯(cuò)誤了嗎筐钟?
程序用額外的布爾變量來(lái)說(shuō)明條件判斷了嗎揩瞪?
程序用額外的布爾變量來(lái)簡(jiǎn)化條件判斷了嗎?
程序用枚舉類型而非具名常量來(lái)提高可讀性和可修改行了嗎篓冲?
當(dāng)變量不能用true和false表示的時(shí)候李破,程序用枚舉類型來(lái)取代布爾變量了嗎?
針對(duì)枚舉類型的才測(cè)試檢測(cè)了非法數(shù)值了嗎壹将?
把枚舉類型的第一項(xiàng)條目保留為“非法的”了嗎嗤攻?
具名常量使用一致嗎?沒(méi)有在某些位置使用具名常量又在其他位置使用文字量诽俯?
所有的數(shù)組下標(biāo)都沒(méi)有超出數(shù)組邊界嗎妇菱?
數(shù)組引用沒(méi)有出現(xiàn)off-by-one的錯(cuò)誤嗎?
所有的多維數(shù)組的下標(biāo)順序都正確嗎暴区?
在嵌套循環(huán)里闯团,把正確的變量用于數(shù)組下標(biāo)來(lái)避免下標(biāo)錯(cuò)亂嗎?
常見(jiàn)的數(shù)據(jù)類型
你使用結(jié)構(gòu)體而不是使用單純的變量來(lái)組織和操作相關(guān)的數(shù)據(jù)嗎仙粱?
你考慮過(guò)創(chuàng)建一個(gè)類來(lái)代替使用結(jié)構(gòu)體嗎房交?
所有的變量是否都是局部或者是類范圍的?除非絕對(duì)有必要才是全局的缰盏?
你對(duì)所有的全局變量都加以文檔說(shuō)明嗎涌萤?
避免使用偽全局?jǐn)?shù)據(jù),即被四處傳遞且含有雜亂數(shù)據(jù)的的巨大對(duì)象嗎口猜?
用訪問(wèn)器子程序來(lái)取代全局?jǐn)?shù)據(jù)了嗎负溪?
把訪問(wèn)其子程序和數(shù)據(jù)組織到類里了嗎?
訪問(wèn)器子程序提供了一個(gè)在底層數(shù)據(jù)類型實(shí)現(xiàn)之上的抽象層嗎济炎?
所有相關(guān)的訪問(wèn)器子程序都位于同一抽象層嗎川抡?
把指針操作隔離在子程序里了嗎?
指針引用合法嗎?或者指針有可能成為懸空指針嗎崖堤?
代碼在使用指針之前檢查它的有效性了嗎侍咱?
在使用指針?biāo)赶虻淖兞恐皺z查其有效性了嗎?
指針用完后被設(shè)置為空了嗎密幔?
就可讀性而言楔脯,代碼用了所有需要使用的指針變量了嗎?
鏈表中的指針是按正確的順序加以釋放的嗎胯甩?
程序分配了一片保留的內(nèi)存后備區(qū)域昧廷,以便在耗盡內(nèi)存的時(shí)候能夠優(yōu)雅地退出嗎?
是不是在沒(méi)有其他方法可用的情況下最終才使用指針的偎箫?
組織直線型代碼
代碼使得語(yǔ)句之間的依賴關(guān)系變得明顯嗎木柬?
子程序的名字使得依賴關(guān)系變得明顯嗎?
子程序的參數(shù)使得依賴關(guān)系變得明顯嗎淹办?
如果依賴關(guān)系不明確眉枕,你是否用注釋進(jìn)行了說(shuō)明?
你用“內(nèi)務(wù)管理變量”來(lái)檢查代碼中關(guān)鍵位置的順序依賴關(guān)系了嗎怜森?
代碼容易按照自上而下的順序閱讀嗎速挑?
相關(guān)的語(yǔ)句組織在一起嗎?
把相對(duì)獨(dú)立的語(yǔ)句組放進(jìn)各自的子程序里嗎副硅?
使用條件語(yǔ)句
代碼的正常路徑清晰嗎梗摇?
if-then測(cè)試對(duì)等量分支的處理方式正確嗎?
使用了else字句并加以說(shuō)明了嗎想许?
else字句用的對(duì)嗎?
用對(duì)了if和else字句断序,即沒(méi)有把它們用反嗎流纹?
需要執(zhí)行的正常情況維護(hù)if而不是else字句里嗎?
if-then-else-if把復(fù)雜的判斷封裝到布爾函數(shù)里了嗎违诗?
if-then-else-if先判斷最常見(jiàn)的情況了嗎漱凝?
if-then-else-if判斷包含所有的情況嗎?
if-then-else-if是最佳的實(shí)現(xiàn)嗎诸迟?比Case語(yǔ)句還要好嗎茸炒?
case子句排序的有意義嗎?
case子句的每種情況操作簡(jiǎn)單嗎阵苇?必要的時(shí)候調(diào)用了其它子程序了嗎壁公?
case語(yǔ)句檢測(cè)的是一個(gè)真實(shí)的變量,而不是為了濫用case語(yǔ)句而而刻意制造變量嗎绅项?
默認(rèn)字句用的合法嗎紊册?
用默認(rèn)字句來(lái)檢測(cè)和報(bào)告意料之外的情況了嗎?
在c,c++和java里快耿,每一個(gè)case的末尾有一個(gè)break嗎囊陡?
循環(huán)
在合適的情況下用while循環(huán)取代for循環(huán)了嗎芳绩?
循環(huán)是由內(nèi)到外創(chuàng)建的嗎?
是從循環(huán)的頭部進(jìn)入循環(huán)的嗎撞反?
初始化代碼是直接位于循環(huán)前面嗎妥色?
循環(huán)是無(wú)限循環(huán)或者事件循環(huán)嗎?阿德結(jié)構(gòu)是否清晰遏片?
避免使用像for i = 1 to 9999這樣的代碼嗎嘹害?
如果這是一個(gè)c++,c或java中的for循環(huán),那么把循環(huán)頭留給循環(huán)控制代碼了嗎丁稀?
循環(huán)使用了{(lán)}及其等價(jià)物來(lái)括上循環(huán)體吼拥,以防止因修改不當(dāng)而出錯(cuò)嗎?
循環(huán)體內(nèi)有內(nèi)容嗎线衫?他是非空的嗎凿可?
把內(nèi)務(wù)處理集中地放在循環(huán)開(kāi)始或者循環(huán)結(jié)束處了嗎?
循環(huán)像定義良好的子程序那樣只執(zhí)行一件操作嗎授账?
循環(huán)短的足以一目了然嗎枯跑?
循環(huán)的嵌套層次不多于3層嗎?
把長(zhǎng)循環(huán)的內(nèi)容提取成單獨(dú)的子程序嗎白热?
如果循環(huán)很長(zhǎng)敛助,那么它非常清晰嗎?
如果這是一個(gè)for循環(huán)屋确,那么其中的代碼有沒(méi)有隨意修改循環(huán)下標(biāo)值纳击?
是否把重要的循環(huán)下標(biāo)值保存在另外的變量里,而不是在循環(huán)體外使用該循環(huán)下標(biāo)攻臀?
循環(huán)下標(biāo)是序數(shù)類型或者枚舉類型焕数,而不是浮點(diǎn)類型嗎?
循環(huán)下標(biāo)的名字有意義嗎?
循環(huán)避免了下標(biāo)串話問(wèn)題嗎刨啸?
循環(huán)是在所有可能的條件下都能終止嗎堡赔?
如果建立了某種安全計(jì)數(shù)器標(biāo)準(zhǔn),循環(huán)使用了安全計(jì)數(shù)器了嗎设联?
循環(huán)的退出條件清晰嗎善已?
如果使用了break或者continue,那么它們用對(duì)了嗎离例?
不常見(jiàn)的控制結(jié)構(gòu)
每一個(gè)子程序都僅在有必要的時(shí)候才使用return嗎换团?
使用return有助于增強(qiáng)可讀性嗎?
遞歸子程序中包含了停止遞歸的代碼嗎粘招?
子程序用安全計(jì)數(shù)器來(lái)確保子程序能停下來(lái)嗎啥寇?
遞歸只位于一個(gè)子程序里面嗎?
子程序遞歸深度處于程序棧容量可以滿足的限度內(nèi)嗎?
遞歸是實(shí)現(xiàn)子程序的最佳方法嗎辑甜?它要好于簡(jiǎn)單的迭代嗎衰絮?
是否在萬(wàn)不得已的時(shí)候才使用goto?如果用了goto磷醋,是否僅僅處于增強(qiáng)可讀性和可維護(hù)性呢猫牡?
如果處于效率因素而使用的goto,那么對(duì)這種效率上的提升做出衡量并且加以說(shuō)明了嗎邓线?
一個(gè)子程序里最多只用了一個(gè)goto標(biāo)號(hào)嗎淌友?
所有的goto都向前跳轉(zhuǎn),而不是向后跳轉(zhuǎn)嗎骇陈?
所有的goto標(biāo)號(hào)都用到了嗎震庭?
表驅(qū)動(dòng)法
你考慮過(guò)把表驅(qū)動(dòng)法作為復(fù)雜邏輯的替代方案嗎?
你考慮過(guò)把表驅(qū)動(dòng)法作為復(fù)雜繼承結(jié)構(gòu)的替代方案嗎你雌?
你考慮過(guò)把表數(shù)據(jù)存儲(chǔ)在外部并在運(yùn)行期間讀入器联,以便在不修改代碼的情況下就可以改變這些數(shù)據(jù)嗎?
如果無(wú)法用一種簡(jiǎn)單的數(shù)組索引去訪問(wèn)表婿崭,那么你把機(jī)酸訪問(wèn)鍵值的功能提取成單獨(dú)的子程序拨拓,而不是在代碼中重復(fù)地計(jì)算鍵值嗎?
一般控制問(wèn)題
表達(dá)式中用的是true和false氓栈,而不是1和0嗎渣磷?
布爾值和true以及false做比較是隱式進(jìn)行的嗎?
對(duì)數(shù)值做比較是顯式進(jìn)行的嗎授瘦?
有沒(méi)有通過(guò)增加新的布爾變量醋界,使用布爾函數(shù)和決策表來(lái)簡(jiǎn)化表達(dá)式?
布爾表達(dá)式是用肯定形式表達(dá)的嗎提完?
括號(hào)配對(duì)嗎物独?
在需要括號(hào)來(lái)明確的地方都使用括號(hào)了嗎
判斷是按照數(shù)軸順序編寫了嗎?
如果適當(dāng)?shù)脑捖仍幔琷ava中的判斷用的是a.equals(b)方式,而沒(méi)有用a==b方式嗎婉陷?
空語(yǔ)句表述得明顯嗎帚称?
用重新判斷部分條件,轉(zhuǎn)換成if-then-else或者case語(yǔ)句秽澳、把嵌套代碼提取成單獨(dú)的子程序闯睹、換成一種更面向?qū)ο蟮脑O(shè)計(jì)或者其他的改進(jìn)方法來(lái)簡(jiǎn)化嵌套語(yǔ)句了嗎?
如果一個(gè)子程序的決策點(diǎn)超過(guò)10個(gè)担神,那么能提出不重新設(shè)計(jì)的理由嗎楼吃?