什么是Code Review 代码审查
Code Review?是一種通過(guò)復(fù)查代碼提高代碼質(zhì)量的過(guò)程,在XP方法中占有極為重要的地位,也已經(jīng)成為軟件工程中一個(gè)不可缺少的環(huán)節(jié)。
本文通過(guò)對(duì)Code Review的一些概念和經(jīng)驗(yàn)的探討,就如何進(jìn)行Code Review和Code Review中應(yīng)該注意什么提出一些建議。
本文中涉及的問(wèn)題大部分針對(duì)Java類(lèi)代碼。同時(shí)本文不涉及Code Review過(guò)程和組織。
關(guān)鍵詞:?Code Review?? JAVA??? 代碼質(zhì)量?? 軟件工程
一、Code Review簡(jiǎn)介
1 Code Review的目的
凡事知其然還要知其所以然,我們首先需要知道什么是Code Review和我們使用它的目的是什么。
Code Review是一種用來(lái)確認(rèn)方案設(shè)計(jì)和代碼實(shí)現(xiàn)的質(zhì)量保證機(jī)制,通過(guò)這個(gè)機(jī)制我們可以對(duì)代碼、測(cè)試過(guò)程和注釋進(jìn)行檢查。
Code Review主要用來(lái)在軟件工程過(guò)程中改進(jìn)代碼質(zhì)量,通過(guò)Code Review可以達(dá)到如下目的:
- 在項(xiàng)目早期就能夠發(fā)現(xiàn)代碼中的BUG
- 幫助初級(jí)開(kāi)發(fā)人員學(xué)習(xí)高級(jí)開(kāi)發(fā)人員的經(jīng)驗(yàn),達(dá)到知識(shí)共享
- 避免開(kāi)發(fā)人員犯一些很常見(jiàn),很普通的錯(cuò)誤
- 保證項(xiàng)目組人員的良好溝通
- 項(xiàng)目或產(chǎn)品的代碼更容易維護(hù)
2 Code Review的前提
知道了Code Review的目的,我們就可以看看如何做Code Review了,但在做Code Review前我們還有事要做,所謂預(yù)則立,不預(yù)則廢,就是說(shuō)如果在進(jìn)入Code Review之前我們不做些準(zhǔn)備工作,Code Review很容易就變得沒(méi)有意義或是流于形式,這在我們周?chē)怯泻芏嗬拥陌 _M(jìn)入Code Review需要檢查的條件如下:
這一點(diǎn)也是為了保證Code Review前一些語(yǔ)法和功能問(wèn)題已經(jīng)得到解決,Code Review人員可以將精力集中在代碼的質(zhì)量上。
3 Code Review需要做什么
好了,進(jìn)入條件準(zhǔn)備好了,有人在這些條件中看到Code Review這也不負(fù)責(zé),那也不檢查,不禁會(huì)問(wèn),Code Review到底做什么?
其實(shí)Code Review主要檢查代碼中是否存在以下方面問(wèn)題:代碼的一致性、編碼風(fēng)格、代碼的安全問(wèn)題、代碼冗余、是否正確設(shè)計(jì)以滿(mǎn)足需求(性能、功能)等等
下邊我們一一道來(lái)。以下內(nèi)容參考了《Software Quality Assurance: Documentation and Reviews》一文中的代碼檢查部分。
3.1 完整性檢查(Completeness)
- 代碼是否完全實(shí)現(xiàn)了設(shè)計(jì)文檔中提出的功能需求
- 代碼是否已按照設(shè)計(jì)文檔進(jìn)行了集成和Debug
- 代碼是否已創(chuàng)建了需要的數(shù)據(jù)庫(kù),包括正確的初始化數(shù)據(jù)
- 代碼中是否存在任何沒(méi)有定義或沒(méi)有引用到的變量、常數(shù)或數(shù)據(jù)類(lèi)型
3.2 一致性檢查(Consistency)
- 代碼的邏輯是否符合設(shè)計(jì)文檔
- 代碼中使用的格式、符號(hào)、結(jié)構(gòu)等風(fēng)格是否保持一致
3.3 正確性檢查(Correctness)
- 代碼是否符合制定的標(biāo)準(zhǔn)
- 所有的變量都被正確定義和使用
- 所有的注釋都是準(zhǔn)確的
- 所有的程序調(diào)用都使用了正確的參數(shù)個(gè)數(shù)
3.4 可修改性檢查(Modifiability)
- 代碼涉及到的常量是否易于修改(如使用配置、定義為類(lèi)常量、使用專(zhuān)門(mén)的常量類(lèi)等)
- 代碼中是否包含了交叉說(shuō)明或數(shù)據(jù)字典,以描述程序是如何對(duì)變量和常量進(jìn)行訪問(wèn)的
- 代碼是否只有一個(gè)出口和一個(gè)入口(嚴(yán)重的異常處理除外)
3.5 可預(yù)測(cè)性檢查(Predictability)
- 代碼所用的開(kāi)發(fā)語(yǔ)言是否具有定義良好的語(yǔ)法和語(yǔ)義
- 是否代碼避免了依賴(lài)于開(kāi)發(fā)語(yǔ)言缺省提供的功能
- 代碼是否無(wú)意中陷入了死循環(huán)
- 代碼是否是否避免了無(wú)窮遞歸
3.6 健壯性檢查(Robustness)
- 代碼是否采取措施避免運(yùn)行時(shí)錯(cuò)誤(如數(shù)組邊界溢出、被零除、值越界、堆棧溢出等)
3.7 結(jié)構(gòu)性檢查(Structuredness)
- 程序的每個(gè)功能是否都作為一個(gè)可辯識(shí)的代碼塊存在
- 循環(huán)是否只有一個(gè)入口
3.8 可追溯性檢查(Traceability)
- 代碼是否對(duì)每個(gè)程序進(jìn)行了唯一標(biāo)識(shí)
- 是否有一個(gè)交叉引用的框架可以用來(lái)在代碼和開(kāi)發(fā)文檔之間相互對(duì)應(yīng)
- 代碼是否包括一個(gè)修訂歷史記錄,記錄中對(duì)代碼的修改和原因都有記錄
- 是否所有的安全功能都有標(biāo)識(shí)
3.9 可理解性檢查(Understandability)
- 注釋是否足夠清晰的描述每個(gè)子程序
- 是否使用到不明確或不必要的復(fù)雜代碼,它們是否被清楚的注釋
- 使用一些統(tǒng)一的格式化技巧(如縮進(jìn)、空白等)用來(lái)增強(qiáng)代碼的清晰度
- 是否在定義命名規(guī)則時(shí)采用了便于記憶,反映類(lèi)型等方法
- 每個(gè)變量都定義了合法的取值范圍
- 代碼中的算法是否符合開(kāi)發(fā)文檔中描述的數(shù)學(xué)模型
3.10 可驗(yàn)證性檢查(Verifiability)
- 代碼中的實(shí)現(xiàn)技術(shù)是否便于測(cè)試
二、Code Review經(jīng)驗(yàn)檢查項(xiàng)
以下是在實(shí)踐中建立的檢查列表(checklist),通過(guò)分類(lèi)和有針對(duì)性的檢查項(xiàng),保證了Code Review可以有的放矢。
1 JAVA編碼規(guī)范方面檢查項(xiàng)
- 檢查項(xiàng)參照J(rèn)AVA編碼規(guī)范執(zhí)行,見(jiàn)《Java語(yǔ)言編碼規(guī)范(Java Code Conventions)》
2 面向?qū)ο笤O(shè)計(jì)方面檢查項(xiàng)
這幾點(diǎn)的范圍都很大,不可能在本文展開(kāi)討論,有專(zhuān)門(mén)的書(shū)籍介紹這方面問(wèn)題,當(dāng)然在Code Review中主要靠經(jīng)驗(yàn)來(lái)判斷。
3 性能方面檢查項(xiàng)性能檢查
在大多數(shù)代碼中都是需要嚴(yán)重關(guān)注的方面,也是最容易出現(xiàn)問(wèn)題的方面,常常有程序員寫(xiě)出了功能和語(yǔ)法沒(méi)有絲毫問(wèn)題的代碼后,正式運(yùn)行時(shí)卻在性能上表現(xiàn)不佳,從而不得不做大量的返工,甚至是推倒重來(lái)。
4 資源泄漏處理方面檢查項(xiàng)
對(duì)于JAVA來(lái)說(shuō)由于存在垃圾收集機(jī)制,所以?xún)?nèi)存泄漏不是太明顯,但使用不當(dāng),仍然存在內(nèi)存泄漏的問(wèn)題。而對(duì)于其它的語(yǔ)言,如C++等在這方面就要嚴(yán)重關(guān)注了。當(dāng)然數(shù)據(jù)庫(kù)連接資源不釋放的問(wèn)題也是廣大程序員最常見(jiàn)的,相信有很多的PM被這個(gè)問(wèn)題折磨的死去活來(lái)。
5 線程安全方面檢查項(xiàng)
線程安全問(wèn)題實(shí)際涉及兩個(gè)方面,一個(gè)是性能,另一個(gè)是資源的一致性,我們需要在這兩方面做個(gè)權(quán)衡,現(xiàn)在就是到了權(quán)衡利弊的時(shí)候了。
6 程序流程方面檢查項(xiàng)
7 數(shù)據(jù)庫(kù)處理方面
很多Code Review人員在面對(duì)代碼中涉及到的數(shù)據(jù)庫(kù)可移植性和提高數(shù)據(jù)庫(kù)性能方面的沖突時(shí)表現(xiàn)的無(wú)所適從,凡事很難兩全其美的啊。
8 通訊方面檢查項(xiàng)
9 JAVA對(duì)象處理方面檢查項(xiàng)
這個(gè)檢查項(xiàng)的基礎(chǔ)是對(duì)JAVA對(duì)象有較深的理解,但現(xiàn)實(shí)是很多看過(guò)《Thinking in Java》的程序員,仍然在程序中無(wú)法區(qū)分傳值和傳引用,以及對(duì)象和reference的區(qū)別。這或許就是理論和實(shí)踐難以結(jié)合的問(wèn)題啊。正所謂知而不行,非真知也。
10 異常處理方面檢查項(xiàng)
JAVA中提供了方便的異常處理機(jī)制,但普遍存在的是異常被捕獲,但并沒(méi)有得到處理。我們可以打開(kāi)一段代碼,最常見(jiàn)的現(xiàn)象是進(jìn)入某個(gè)方法后,一個(gè)大的try/catch將所有代碼行括住,然后在catch中將異常打印到控制臺(tái),而且該異常是Exception對(duì)象。
11 方法(函數(shù))方面檢查項(xiàng)
12 安全方面檢查項(xiàng)
13 其他
三、總結(jié)
通過(guò)在項(xiàng)目中實(shí)施Code Review將為我們帶來(lái)多方面的好處,表現(xiàn)在提高代碼質(zhì)量,保證項(xiàng)目或產(chǎn)品的穩(wěn)定性,開(kāi)發(fā)經(jīng)驗(yàn)的積累等,具體的實(shí)施當(dāng)然也要看項(xiàng)目的實(shí)際情況,因?yàn)?Code Review也是需要成本的,這方面屬于Code Review過(guò)程的問(wèn)題,將在其他文章中進(jìn)行探討。
from:?http://blog.csdn.net/ithomer/article/details/6147178
總結(jié)
以上是生活随笔為你收集整理的什么是Code Review 代码审查的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 防止重复提交表单
- 下一篇: C语言编译全过程剖析