亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 軟件教程 > 正文

Code Review理論與實戰詳解

2020-07-18 15:29:39
字體:
來源:轉載
供稿:網友

CodeReview理論與實戰

摘要

CodeReview是一種通過復查代碼提高代碼質量的過程,在XP方法中占有極為重要的地位,也已經成為軟件工程中一個不可缺少的環節。本文通過對CodeReview的一些概念和經驗的探討,就如何進行CodeReview和CodeReview中應該注意什么提出一些建議。本文中涉及的問題大部分針對JAVA類代碼。同時本文不涉及CodeReview過程和組織。

關鍵詞:CodeReview,JAVA,XP,代碼質量,軟件工程

一、CodeReview簡介

1CodeReview的目的

凡事知其然還要知其所以然,我們首先需要知道什么是CodeReview和我們使用它的目的是什么。CodeReview是一種用來確認方案設計和代碼實現的質量保證機制,通過這個機制我們可以對代碼,測試過程和注釋進行檢查。CodeReview主要用來在軟件工程過程中改進代碼質量,通過CodeReview可以達到如下目的:

1,盡早地發現bug;

這里并不是指一些簡單的bug,而是一些可能是因為經驗上不足而出現的潛在的bug。因此codereview人員一定是要比較有經驗的人擔當。

2,幫助初級開發人員學習高級開發人員的經驗,以達到知識共享;

這點也很重要,使得小組成員不斷地進步,這樣才能更有效地工作。

3,保證項目組成員有良好的溝通;

codereview人員起著小組溝通橋梁的作用,而不是去熟悉每個單元代碼,而去調試、編譯等工作,那樣還不如自己去寫整個系統。

4,項目或產品的代碼更容易維護;

這里就是檢查代碼規范、代碼注釋等。使得代碼盡量統一化,最理想的效果是看不出是哪個具體人寫的,而是哪個Team寫的。

5,避免開發人員犯一些很常見,很普通的錯誤

2CodeReview的前提

知道了CodeReview的目的,我們就可以看看如何做CodeReview了,但在做CodeReview前我們還有事要做,所謂預則立,不預則廢,就是說如果在進入CodeReview之前我們不做些準備工作,CodeReview很容易就變得沒有意義或是流于形式,這在我們周圍是有很多例子的啊。進入CodeReview需要檢查的條件如下:

a)CodeReview人員是否理解了CodeReview的概念和CodeReview將做什么

如果做CodeReview的人員不能理解CodeReview對項目成敗和代碼質量的重要程度,他們的做法可能就會是應付了事。

b)代碼是否已經正確的build,build的目的使得代碼已經不存在基本語法錯誤

我們總不希望高級開發人員或是主管將時間浪費在檢查連編譯都通不過的代碼上吧。

c)代碼執行時功能是否正確

CodeReview人員也不負責檢查代碼的功能是否正確,也就是說,需要復查的代碼必須由開發人員或質量人員負責該代碼的功能的正確性。

d)Review人員是否理解了代碼

做復查的人員需要對該代碼有一個基本的了解,其功能是什么,是拿一方面的代碼,涉及到數據庫或是通訊,這樣才能采取針對性的檢查

e)開發人員是否對代碼做了單元測試

這一點也是為了保證CodeReview前一些語法和功能問題已經得到解決,CodeReview人員可以將精力集中在代碼的質量上。

3CodeReview需要做什么

好了,進入條件準備好了,有人在這些條件中看到CodeReview這也不負責,那也不檢查,不禁會問,CodeReview到底做什么?其實CodeReview主要檢查代碼中是否存在以下方面問題:代碼的一致性、編碼風格、代碼的安全問題、代碼冗余、是否正確設計以滿足需求(性能、功能等等),下邊我們一一道來。以下內容參考了《SoftwareQualityAssurance:DocumentationandReviews》一文中的代碼檢查部分。

3.1完整性檢查(Completeness)

代碼是否完全實現了設計文檔中提出的功能需求

代碼是否已按照設計文檔進行了集成和Debug

代碼是否已創建了需要的數據庫,包括正確的初始化數據

代碼中是否存在任何沒有定義或沒有引用到的變量、常數或數據類型

3.2一致性檢查(Consistency)

代碼的邏輯是否符合設計文檔

代碼中使用的格式、符號、結構等風格是否保持一致

3.3正確性檢查(Correctness)

代碼是否符合制定的標準

所有的變量都被正確定義和使用

所有的注釋都是準確的

所有的程序調用都使用了正確的參數個數

3.4可修改性檢查(Modifiability)

代碼涉及到的常量是否易于修改(如使用配置、定義為類常量、使用專門的常量類等)

代碼中是否包含了交叉說明或數據字典,以描述程序是如何對變量和常量進行訪問的

代碼是否只有一個出口和一個入口(嚴重的異常處理除外)

3.5可預測性檢查(Predictability)

代碼所用的開發語言是否具有定義良好的語法和語義

是否代碼避免了依賴于開發語言缺省提供的功能

代碼是否無意中陷入了死循環

代碼是否是否避免了無窮遞歸

3.6健壯性檢查(Robustness)

代碼是否采取措施避免運行時錯誤(如數組邊界溢出、被零除、值越界、堆棧溢出等)

3.7結構性檢查(Structuredness)

程序的每個功能是否都作為一個可辯識的代碼塊存在

循環是否只有一個入口

3.8可追溯性檢查(Traceability)

代碼是否對每個程序進行了唯一標識

是否有一個交叉引用的框架可以用來在代碼和開發文檔之間相互對應

代碼是否包括一個修訂歷史記錄,記錄中對代碼的修改和原因都有記錄

是否所有的安全功能都有標識

3.9可理解性檢查(Understandability)

注釋是否足夠清晰的描述每個子程序

是否使用到不明確或不必要的復雜代碼,它們是否被清楚的注釋

使用一些統一的格式化技巧(如縮進、空白等)用來增強代碼的清晰度

是否在定義命名規則時采用了便于記憶,反映類型等方法

每個變量都定義了合法的取值范圍

代碼中的算法是否符合開發文檔中描述的數學模型

3.10可驗證性檢查(Verifiability)

代碼中的實現技術是否便于測試

二、CodeReview經驗檢查項

以下是在實踐中建立的檢查列表(checklist),通過分類和有針對性的檢查項,保證了CodeReview可以有的放矢。

1JAVA編碼規范方面檢查項

檢查項參照JAVA編碼規范執行,見《JAVA編碼規范(JavaCodeConventions)》

2面向對象設計方面檢查項

這幾點的范圍都很大,不可能在本文展開討論,有專門的書籍介紹這方面問題,當然在CodeReview中主要靠經驗來判斷。

A)類設計和抽象是否合適

B)是否符合面向接口編程的思想

C)是否采用合適的設計范式

3性能方面檢查項

性能檢查在大多數代碼中都是需要嚴重關注的方面,也是最容易出現問題的方面,常常有程序員寫出了功能和語法沒有絲毫問題的代碼后,正式運行時卻在性能上表現不佳,從而不得不做大量的返工,甚至是推倒重來。

A)在海量數據出現時,隊列,表,文件,在傳輸,upload等方面是否會出現問題,有無控制,如分配的內存塊大小,隊列長度等控制參數

B)對hashtable,vector等集合類數據結構的選擇和設置是否合適,如正確設置capacity,loadfactor等參數,數據結構的是否是同步的

C)有無濫用String對象的現象

D)是否采用通用的線程池、對象池模塊等cache技術以提高性能

E)類的接口是否定義良好,如參數類型等,避免內部轉換

F)是否采用內存或硬盤緩沖機制以提高效率

G)并發訪問時的應對策略

H)I/O方面是否使用了合適的類或采用良好的方法以提高性能(如減少序列化,使用buffer類封裝流等)

I)同步方法的使用是否得當,是否過度使用

J)遞歸方法中的疊代次數是否合適,應該保證在合理的??臻g范圍內

K)如果調用了阻塞方法,是否考慮了保證性能的措施

L)避免過度優化,對性能要求高的代碼是否使用profile工具,如Jprobe等

4資源泄漏處理方面檢查項

對于JAVA來說由于存在垃圾收集機制,所以內存泄漏不是太明顯,但使用不當,仍然存在內存泄漏的問題。而對于其它的語言,如C++等在這方面就要嚴重關注了。當然數據庫連接資源不釋放的問題也是廣大程序員最常見的,相信有很多的PM被這個問題折磨的死去活來。

A)分配的內存是否釋放,尤其在錯誤處理路徑上(對非JAVA類)

B)錯誤發生時是否所有的對象被釋放,如數據庫連接、Socket、文件等

C)是否同一個對象被釋放多次(對非JAVA類)

D)代碼是否保存準確的對象reference計數(對非JAVA類)

5線程安全方面檢查項

線程安全問題實際涉及兩個方面,一個是性能,另一個是資源的一致性,我們需要在這兩方面做個權衡,現在就是到了權衡利弊的時候了。

A)代碼中所有的全局變量是否是線程安全的

B)需要被多個線程訪問的對象是否線程安全,檢查有無通過同步方法保護

C)同步對象上的鎖是否按相同的順序獲得和釋放以避免死鎖,注意錯誤處理代碼

D)是否存在可能的死鎖或是競爭,當用到多個鎖時,避免出現類似情況:線程A獲得鎖1,然后鎖2,線程B獲得鎖2,然后鎖1

E)在保證線程安全的同時,要注意避免過度使用同步,導致性能降低

6程序流程方面檢查項

A)循環結束條件是否準確

B)是否避免了死循環的產生

C)對循環的處理是否合適,如循環變量,局部對象,循環次數等能夠考慮到性能方面的影響

7數據庫處理方面

很多CodeReview人員在面對代碼中涉及到的數據庫可移植性和提高數據庫性能方面的沖突時表現的無所適從,凡事很難兩全其美的啊。

A)數據庫設計或SQL語句是否便于移植(注意和性能方面會存在沖突)

B)數據庫資源是否正常關閉和釋放

C)數據庫訪問模塊是否正確封裝,便于管理和提高性能

D)是否采用合適的事務隔離級別

E)是否采用存儲過程以提高性能

F)是否采用PreparedStatement以提高性能

8通訊方面檢查項

A)socket通訊是否存在長期阻塞問題

B)發送接收的數據流是否采用緩沖機制

C)socket超時處理,異常處理

D)數據傳輸的流量控制問題

9JAVA對象處理方面檢查項

這個檢查項的基礎是對JAVA對象有較深的理解,但現實是很多看過《ThinkinginJava》的程序員,仍然在程序中無法區分傳值和傳引用,以及對象和reference的區別。這或許就是理論和實踐難以結合的問題啊。正所謂知而不行,非真知也。

A)對象生命周期的處理,是否對象的reference已經失效,能夠設置為null,并被回收

B)在對象的傳值和傳參方面有無問題,對象的clone方法使用是否過度

C)是否大量經常的創建臨時對象

D)是否盡量使用局部對象(堆棧對象)

E)在只需要對象reference的地方是否創建了新的對象實例

10異常處理方面檢查項

JAVA中提供了方便的異常處理機制,但普遍存在的是異常被捕獲,但并沒有得到處理。我們可以打開一段代碼,最常見的現象是進入某個方法后,一個大的try/catch將所有代碼行括住,然后在catch中將異常打印到控制臺,而且該異常是Exception對象。

A)每次當方法返回時是否正確處理了異常,如最簡單的處理,記錄日志到日志文件中

B)是否對數據的值和范圍是否合法進行校驗,包括采用斷言(assertion)

C)在出錯路徑上是否所有的資源和內存都已經釋放

D)所有拋出的異常都得到正確的處理,特別是對子方法拋出的異常,在整個調用棧中必須能夠被捕捉并處理

E)當調用導致錯誤發生時,方法的調用者應該得到一個通知

F)不要忘了對錯誤處理部分的代碼進行測試,很多代碼在正常情況下執行良好,而一旦出錯,整個系統就崩潰了

11方法(函數)方面檢查項

A)方法的參數是否都做了校驗

B)數組類結構是否做了邊界校驗

C)變量在使用前是否做了初始化

D)返回堆對象的reference,不要返回棧對象的reference

E)方法API是否被良好定義,即是否盡量面向接口編程,便于維護和重構

12安全方面檢查項

A)對命令行執行的代碼,需要詳細檢查命令行參數

B)WEB類程序檢查是否對訪問參數進行合法性驗證

C)重要信息的保存是否選用合適的加密算法

D)通訊時考慮是否選用安全的通訊方式

13其他

A)日志是否正常輸出和控制

B)配置信息如何獲得,是否有硬編碼

三、總結

通過在項目中實施CodeReview將為我們帶來多方面的好處,表現在提高代碼質量,保證項目或產品的穩定性,開發經驗的積累等,具體的實施當然也要看項目的實際情況,因為CodeReview也是需要成本的,這方面屬于CodeReview過程的問題,將在其他文章中進行探討。

四、參考資料

Java語言編碼規范(JavaCodeConventions)SUN

SoftwareQualityAssurance:DocumentationandReviewsDoloresR.Wallace,WendyW.Peng,LauraM.Ippolito

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久综合久中文字幕青草| 亚洲男人天堂手机在线| 亚洲自拍欧美另类| 丝袜情趣国产精品| 久久久这里只有精品视频| 亚洲精品xxx| 亚洲男人的天堂在线| 日韩大陆欧美高清视频区| 欧美日韩亚洲天堂| 久久精品99无色码中文字幕| 亚洲福利在线看| 欧洲精品毛片网站| 久久亚洲精品一区| 岛国av在线不卡| 日韩欧美在线视频日韩欧美在线视频| 超碰精品一区二区三区乱码| 91九色国产社区在线观看| 欧美一级淫片aaaaaaa视频| 国产+成+人+亚洲欧洲| 国产精品91在线观看| 久久99精品久久久久久琪琪| 国产一区二区三区在线观看网站| 国模吧一区二区| 亚洲黄在线观看| 亚洲在线视频观看| 91在线免费看网站| 国外成人在线视频| 国产精品第2页| 91精品一区二区| 亚洲国产精品字幕| 亚洲性日韩精品一区二区| 亚洲自拍高清视频网站| 国产成人精品久久久| 亚洲综合色激情五月| 中文字幕亚洲国产| 色婷婷av一区二区三区久久| 国产精品一区二区3区| 成人xvideos免费视频| 日韩av手机在线| 中文字幕精品www乱入免费视频| 国产日韩欧美一二三区| 亚洲欧洲xxxx| 色综合老司机第九色激情| 精品久久中文字幕| 国产精品欧美激情| 亚洲欧美中文在线视频| 欧美精品www在线观看| 日本久久久久久久久久久| 欧美性猛交xxxx黑人猛交| 欧美成人激情视频| 精品久久久中文| 亚洲自拍偷拍网址| 国产精品一区二区久久| 日韩中文综合网| 欧美亚洲国产视频小说| 亚洲xxxx做受欧美| 国产视频精品va久久久久久| 米奇精品一区二区三区在线观看| 欧美国产在线电影| 欧美日韩国产一中文字不卡| 国产精品视频成人| 日韩在线高清视频| 国产精品日韩欧美| 国产一区二区动漫| 国产精品老牛影院在线观看| 91精品国产亚洲| 69**夜色精品国产69乱| 国产一区二区三区在线免费观看| 91精品久久久久久久久久另类| 亚洲wwwav| 97在线看免费观看视频在线观看| 日韩av在线免费观看一区| 国产精品中文久久久久久久| 青青草99啪国产免费| 亚洲国产日韩精品在线| 亚洲自拍偷拍第一页| 最新国产成人av网站网址麻豆| 亚洲精品女av网站| 91亚洲人电影| 欧美日韩国产999| 国产日韩一区在线| 狠狠躁夜夜躁久久躁别揉| 亚洲成人网av| 欧美日韩激情美女| 国产欧美精品日韩精品| 亚洲欧美日韩在线一区| 97色在线视频观看| 日韩小视频在线观看| 国产日韩在线观看av| 国产欧美亚洲视频| 日韩成人在线视频网站| 亚洲国模精品一区| 国产一区二区视频在线观看| 91在线观看免费高清| 亚洲电影av在线| 国产精品2018| 久久资源免费视频| 日韩中文有码在线视频| 欧美在线观看视频| 国产精品美女无圣光视频| 不卡中文字幕av| 国产视频一区在线| 最近日韩中文字幕中文| 中文字幕日韩欧美在线视频| 91香蕉嫩草神马影院在线观看| 亚洲系列中文字幕| 色爱精品视频一区| 草民午夜欧美限制a级福利片| 国产啪精品视频网站| 国产精品一二三视频| 在线精品视频视频中文字幕| 久久99久久99精品免观看粉嫩| 在线日韩第一页| 在线免费观看羞羞视频一区二区| 国产精品自在线| 久久久91精品国产| 91极品视频在线| 久久九九热免费视频| 欧美国产极速在线| 亚洲欧美色图片| 91久久精品久久国产性色也91| 日韩国产欧美精品在线| 国产成人亚洲综合91精品| 日韩欧美国产激情| 日韩av网址在线观看| 蜜臀久久99精品久久久无需会员| 欧美贵妇videos办公室| 亚洲级视频在线观看免费1级| 丁香五六月婷婷久久激情| 欧美一区二区三区四区在线| 亚洲xxx大片| 亚洲国产婷婷香蕉久久久久久| 亚洲人成网站999久久久综合| 亚洲免费视频一区二区| 日韩中文字幕在线视频| 久久久久久国产精品| 在线观看精品自拍私拍| 久热精品视频在线观看一区| 中文字幕亚洲一区在线观看| 欧美久久精品一级黑人c片| 日韩成人在线视频观看| 亚洲欧美日韩在线高清直播| 一区二区国产精品视频| 亚洲久久久久久久久久| 国产一区二区三区免费视频| 国产精品九九九| 久久成人精品电影| 欧美午夜女人视频在线| 国产成人在线一区二区| 中日韩美女免费视频网址在线观看| 国内精品久久久久久久| 68精品久久久久久欧美| 久久久国产精品视频| 国产精品偷伦免费视频观看的| 亚洲国产精品资源| 国产精品亚洲第一区| 美女999久久久精品视频| 日韩一级裸体免费视频| 日韩精品亚洲元码| 久久精品国产久精国产一老狼| 日韩av手机在线观看| 久久久999精品免费| 日韩国产一区三区| 亚洲大尺度美女在线|