敏捷開(kāi)發(fā)中高質(zhì)量 Java 代碼開(kāi)發(fā)實(shí)踐

本文將介紹在敏捷開(kāi)發(fā)過(guò)程中如何通過(guò)采取一系列的步驟來(lái)保證和提高整個(gè)項(xiàng)目的代碼質(zhì)量,闡述了每一步可以利用的工具和最佳實(shí)踐拴袭,從而使開(kāi)發(fā)過(guò)程更加規(guī)范化读第,成就高質(zhì)量的代碼。

概述

Java 項(xiàng)目開(kāi)發(fā)過(guò)程中拥刻,由于開(kāi)發(fā)人員的經(jīng)驗(yàn)怜瞒、代碼風(fēng)格各不相同,以及缺乏統(tǒng)一的標(biāo)準(zhǔn)和管理流程般哼,往往導(dǎo)致整個(gè)項(xiàng)目的代碼質(zhì)量較差吴汪,難于維護(hù),需要較大的測(cè)試投入和周期等問(wèn)題蒸眠。這些問(wèn)題在一個(gè)項(xiàng)目組初建漾橙、需求和設(shè)計(jì)均具有不完全可預(yù)期性和完備性的全新項(xiàng)目中將尤為突出。本文將結(jié)合敏捷開(kāi)發(fā)周期短楞卡,變化快等特點(diǎn)霜运,介紹如何通過(guò)在開(kāi)發(fā)過(guò)程中采取一系列步驟來(lái)保證和提高整個(gè)開(kāi)發(fā)團(tuán)隊(duì)的代碼質(zhì)量,并闡述了每一步可以利用的工具和最佳實(shí)踐蒋腮,從而使開(kāi)發(fā)過(guò)程更加規(guī)范化淘捡,成就高質(zhì)量的代碼,減少測(cè)試的投入徽惋,并促進(jìn)整個(gè)團(tuán)隊(duì)的技能提高案淋,最終提高開(kāi)發(fā)效率和質(zhì)量。

如圖 1 所示险绘,敏捷開(kāi)發(fā)過(guò)程經(jīng)歷需求調(diào)研踢京,用例分析和用例分解,進(jìn)入開(kāi)發(fā)迭代階段宦棺。在每個(gè)迭代過(guò)程中瓣距,可以采用以下五個(gè)步驟來(lái)保證和提高整個(gè)項(xiàng)目的代碼質(zhì)量:統(tǒng)一編碼規(guī)范代碼樣式代咸;靜態(tài)代碼分析(static code review)蹈丸;單元測(cè)試持續(xù)集成代碼評(píng)審重構(gòu)(Review & Refactor)逻杖。下文將針對(duì)每個(gè)步驟和其所使用的工具奋岁、方法進(jìn)行詳細(xì)描述。

圖 1. 敏捷開(kāi)發(fā)中的 Java 代碼質(zhì)量保證步驟

步驟一:統(tǒng)一編碼規(guī)范荸百、代碼樣式

規(guī)范統(tǒng)一的編碼會(huì)增加項(xiàng)目代碼的可讀性和可維護(hù)性闻伶,但實(shí)際情況往往是項(xiàng)目組內(nèi)的 Java 代碼開(kāi)發(fā)人員的編碼風(fēng)格常常各不相同,這可能是由于不同的經(jīng)驗(yàn)習(xí)慣或者缺乏編碼規(guī)范方面的學(xué)習(xí)造成的够话。這樣一來(lái)蓝翰,其他項(xiàng)目成員或者維護(hù)人員在閱讀項(xiàng)目代碼時(shí)就需要花費(fèi)更多的時(shí)間來(lái)理解代碼作者的意圖,所以制定并采取統(tǒng)一的編碼規(guī)范就顯得很重要女嘲。編碼規(guī)范主要應(yīng)包含以下幾個(gè)方面

  1. 一般規(guī)則和格式規(guī)范畜份。例如代碼縮進(jìn)、程序塊規(guī)范欣尼、每行最大代碼長(zhǎng)度等爆雹。
  2. 命名規(guī)則。例如包名愕鼓、類名顶别、變量、方法拒啰、接口、參數(shù)等命名規(guī)范
  3. 文檔規(guī)范完慧。例如類文件頭聲明谋旦、類注釋、成員變量和方法注釋等規(guī)范屈尼。
  4. 編程規(guī)范册着。例如異常、并發(fā)脾歧、多線程等方面的處理方式甲捏。
  5. 其他規(guī)范。例如日志格式鞭执、屬性文件格式司顿,返回值和消息格式。

項(xiàng)目的編碼規(guī)范可以參考已有的一些 Java 編程規(guī)范書(shū)籍和其他相關(guān)資料并結(jié)合項(xiàng)目的本身來(lái)制定兄纺,可供參考的書(shū)籍有《 Java 編程風(fēng)格》(英文書(shū)名為:The Elements of Java Style)大溜。編碼規(guī)范要形成文檔,而且要簡(jiǎn)潔明了估脆,并組織項(xiàng)目成員一起學(xué)習(xí)钦奋,確保所有成員正確理解所有條目。

一旦編碼規(guī)范確定,就可以利用 Eclipse 自身提供的功能來(lái)控制代碼樣式和格式付材。具體做法是朦拖,點(diǎn)擊 Eclipse 的 Windows -> Preference 菜單項(xiàng),在打開(kāi)的 Preferences 對(duì)話框的左側(cè)欄中找到 Java 節(jié)點(diǎn)下的子項(xiàng) Code Style(如圖 2)厌衔,該項(xiàng)和它的子項(xiàng)允許您對(duì) Java 代碼的樣式進(jìn)行控制璧帝。

圖 2. Eclipse 代碼樣式設(shè)置窗口

例如,為了使用自動(dòng)格式化工具葵诈,可以在 Eclipse 提供的默認(rèn)代碼格式配置的基礎(chǔ)上建立自定義的格式裸弦。在 Formatter 面板中,點(diǎn)擊 New作喘,輸入新的名字并選擇一個(gè)默認(rèn)的配置作為初始化格式理疙,如圖 3 所示。

圖 3. 創(chuàng)建新的代碼格式配置

單擊 OK 后就可以在新打開(kāi)的窗口中進(jìn)行修改定制自己需要的格式泞坦。如圖 4 所示窖贤。

圖 4. 創(chuàng)建新的代碼格式配置

修改完成后點(diǎn)擊 Apply 保存所作修改。同時(shí)可以點(diǎn)擊 Export 將當(dāng)前的格式定義導(dǎo)出成一個(gè) XML 文件贰锁,這樣項(xiàng)目組的其他成員就可以很方便通過(guò)點(diǎn)擊圖 3 中的 Import 按鈕來(lái)導(dǎo)入該 XML 文件來(lái)使用同一個(gè)代碼格式定義赃梧。

這樣每次在提交代碼到版本控制服務(wù)器前就可以通過(guò) Eclipse 界面里的 Source->Format 菜單來(lái)對(duì)代碼進(jìn)行格式化,從而使整個(gè)項(xiàng)目的代碼具有相同的格式豌熄。同樣可以通過(guò)對(duì) Code Style 下的其他項(xiàng)目進(jìn)行設(shè)置來(lái)幫助對(duì) Java 代碼的樣式進(jìn)行控制授嘀。將所有這些樣式文件導(dǎo)出成 XML 文件后,同編碼規(guī)范一起歸檔锣险,供所有項(xiàng)目成員使用蹄皱。

步驟二:靜態(tài)代碼分析

在完成源代碼的開(kāi)發(fā)以后,下面要進(jìn)行的工作就是審視和測(cè)試代碼芯肤。除了通過(guò)運(yùn)行測(cè)試代碼來(lái)檢查功能之外巷折,還能利用一些靜態(tài)分析工具來(lái)快速、直接地提高代碼質(zhì)量崖咨。靜態(tài)代碼分析工具并不需要運(yùn)行代碼锻拘,可以直接對(duì) Java 文件和 Class 文件進(jìn)行分析,通過(guò)一些檢查條件的設(shè)置击蹲,快速找到代碼中的錯(cuò)誤和潛在缺陷∈鹉猓現(xiàn)在的靜態(tài)分析工具很多,有 FindBugs际邻、PMD芯丧、IBM Rational Tool,等等世曾。在這里缨恒,選擇 FindBugs 作為靜態(tài)代碼分析工具谴咸。FindBugs 可以和日常開(kāi)發(fā)工具 Eclipse 進(jìn)行集成,在開(kāi)發(fā)過(guò)程中骗露,就可以方便的開(kāi)始靜態(tài)代碼的檢查岭佳。通過(guò)檢查 Class 文件或者 JAR 文件,將字節(jié)碼和一組缺陷模式進(jìn)行對(duì)比萧锉,來(lái)發(fā)現(xiàn)可能存在的代碼問(wèn)題珊随。在 Eclipse 的開(kāi)發(fā)環(huán)境中,用插件安裝的方式安裝了 Findbugs 后柿隙,在 Eclipse 的配置選項(xiàng)中就會(huì)多出來(lái) FindBugs 的配置選項(xiàng)叶洞。可以對(duì)自己的項(xiàng)目進(jìn)行配置禀崖,選擇需要的 Detector 檢查代碼衩辟。

圖 5. FindBugs 的配置選項(xiàng)

設(shè)置好自己的規(guī)則后,在需要檢查的代碼文件夾上點(diǎn)擊右鍵波附,就可以啟動(dòng) FindBugs 檢查艺晴。代碼可以是一個(gè)項(xiàng)目,也可以只是幾個(gè)文件掸屡。

圖 6. 運(yùn)行 FindBugs

檢查完畢后封寞,會(huì)出現(xiàn) FindBugs 視圖,把所有檢查的結(jié)果根據(jù)錯(cuò)誤分組展示仅财。點(diǎn)擊結(jié)果里面的每一個(gè)錯(cuò)誤狈究,會(huì)自動(dòng)打開(kāi)對(duì)應(yīng)的代碼。當(dāng)根據(jù)規(guī)則改正了所有的錯(cuò)誤盏求,或者說(shuō)潛在錯(cuò)誤谦炒,這些代碼也就通過(guò)了靜態(tài)代碼檢查。FindBugs 的檢查結(jié)果可以是 XML 文件风喇,也可以是文本文件,便于項(xiàng)目的集成管理和檢查保存缕探。

圖 7. FindBugs 檢查結(jié)果

步驟三:?jiǎn)卧獪y(cè)試

單元測(cè)試用例設(shè)計(jì)和評(píng)審

單元測(cè)試是軟件開(kāi)發(fā)過(guò)程中重要的質(zhì)量保證環(huán)節(jié)魂莫,在此環(huán)節(jié)中,設(shè)計(jì)和評(píng)審對(duì)于保證整個(gè)單元測(cè)試過(guò)程的完整性和有效性來(lái)說(shuō)十分重要爹耗。設(shè)計(jì)階段需要具體考慮要對(duì)哪些代碼單元進(jìn)行測(cè)試耙考,被測(cè)單元之間的關(guān)系,測(cè)試策略潭兽,以及單元測(cè)試用例設(shè)計(jì)等倦始,并最終輸出《單元測(cè)試用例設(shè)計(jì)》文檔,用來(lái)指導(dǎo)具體的單元測(cè)試執(zhí)行山卦。在用例設(shè)計(jì)中鞋邑,通過(guò)對(duì)代碼單元輸入和期待輸出的定義來(lái)保證該單元的功能正確性,邊界值的測(cè)試和異常測(cè)試非常重要。同時(shí)也配合測(cè)試用例和功能塊的匹配方法來(lái)衡量用例設(shè)計(jì)的完整性枚碗。

在用例設(shè)計(jì)完成之后逾一,下一步的工作就是進(jìn)行測(cè)試用例的評(píng)審。個(gè)人的理解和經(jīng)驗(yàn)始終是有限的肮雨,用例評(píng)審可以借集體之力遵堵,對(duì)用例設(shè)計(jì)進(jìn)入查漏補(bǔ)缺,進(jìn)一步保證測(cè)試用例的有效性怨规。由于單元測(cè)試屬于白盒測(cè)試范疇陌宿,它主要通過(guò)對(duì)代碼的邏輯結(jié)構(gòu)進(jìn)行分析來(lái)設(shè)計(jì)測(cè)試用例,因此波丰,評(píng)審員的選擇最好以理解代碼邏輯結(jié)構(gòu)為前提壳坪,如果評(píng)審員來(lái)自相關(guān)模塊,還能夠有效的發(fā)現(xiàn)模塊相關(guān)性和依賴性所帶來(lái)的問(wèn)題呀舔。

模擬對(duì)象技術(shù)

在實(shí)際項(xiàng)目中弥虐,開(kāi)發(fā)人員自己的代碼往往需要和其他的代碼模塊或系統(tǒng)進(jìn)行交互媚赖,但在測(cè)試的過(guò)程中霜瘪,這些需要被調(diào)用的真實(shí)對(duì)象常常很難被實(shí)例化惧磺,或者這些對(duì)象在某些情況下無(wú)法被用來(lái)測(cè)試颖对,例如,真實(shí)對(duì)象的行為無(wú)法預(yù)測(cè)磨隘,真實(shí)對(duì)象的行為難以觸發(fā)缤底,或者真實(shí)對(duì)象的運(yùn)行速度很慢。這時(shí)候番捂,就需要使用模擬對(duì)象技術(shù)(Mock)个唧,利用一個(gè)模擬對(duì)象來(lái)模擬我們的代碼所依賴的真實(shí)對(duì)象,來(lái)幫助完成測(cè)試设预,提高測(cè)試覆蓋率徙歼,從而提高代碼質(zhì)量。模擬對(duì)象技術(shù)利用了在面向接口的編程中鳖枕,由于代碼直接對(duì)接口進(jìn)行調(diào)用魄梯,所以代碼并不知道引用的是真實(shí)對(duì)象還是模擬對(duì)象,這樣就可以順利的完成對(duì)代碼的測(cè)試宾符。

模擬技術(shù)有很多種酿秸,如 jMock,EasyMock魏烫,Mockito辣苏,PowerMock 等等肝箱。其中 Mockito 消除了對(duì)期望行為的需求,避免了這些代碼的大量初始化考润。

圖 8. Mockito 示例

在模擬對(duì)象過(guò)程中狭园,先模擬一個(gè)需要調(diào)用的 List 對(duì)象 LinkedList,再設(shè)定這個(gè)對(duì)象的行為糊治,當(dāng)調(diào)用 get(0) 的時(shí)候唱矛,返回”first”。這樣井辜,測(cè)試代碼就可以利用這個(gè)對(duì)象來(lái)測(cè)試我們的功能代碼绎谦,需要調(diào)用和返回值的時(shí)候,可以順利的得到模擬對(duì)象的返回值粥脚。也需要對(duì)模擬對(duì)象進(jìn)行錯(cuò)誤情況的模擬窃肠,保證代碼對(duì)錯(cuò)誤的處理的正確性肢藐。

測(cè)試覆蓋率分析

為了衡量單元測(cè)試的質(zhì)量和覆蓋的范圍喊废,需要對(duì)單元測(cè)試的代碼進(jìn)行測(cè)試覆蓋分析仪糖。常用的衡量測(cè)試覆蓋率的指標(biāo)主要有語(yǔ)句覆蓋率楷力、分支覆蓋率、路徑覆蓋率督笆、條件覆蓋率和方法覆蓋率等嘹黔。具體采用哪些指標(biāo)可以根據(jù)項(xiàng)目的實(shí)際情況來(lái)定峭状,以避免因過(guò)高的指標(biāo)增加了代碼開(kāi)發(fā)人員的工作量而影響了項(xiàng)目整體的進(jìn)度天通。

EMMA 是一款比較流行的開(kāi)源 Java 測(cè)試覆蓋率分析工具泊窘,支持類、方法像寒、代碼行烘豹、基本代碼塊等多種類型的測(cè)試覆蓋率分析,支持將覆蓋率分析結(jié)果導(dǎo)出為多種格式的報(bào)告诺祸,并采用多種顏色來(lái)高亮顯示不同的覆蓋率狀態(tài)携悯。EclEmma 是一款基于 EMMA 的 Eclipse 插件,方便在 Eclipse IDE 中進(jìn)行測(cè)試覆蓋率分析筷笨。如圖 9蚌卤,在測(cè)試用例寫(xiě)好后,可以在右鍵點(diǎn)擊測(cè)試類奥秆,選擇 Coverage As -> JUnit Test.

圖 9. 運(yùn)行測(cè)試覆蓋分析

單元測(cè)試跑完后,Coverage視圖中會(huì)顯示所選擇的測(cè)試的覆蓋率咸灿。雙擊打開(kāi)某一具體的類后构订,可以看到高亮顯示的覆蓋分析結(jié)果,如圖 10 所示避矢。紅色代表測(cè)試沒(méi)有覆蓋到該行悼瘾,黃色表示部分覆蓋囊榜,綠色的行表示該行在本次測(cè)試中被覆蓋到。

圖 10. 查看測(cè)試覆蓋分析結(jié)果

在 Coverage 視圖中可以通過(guò)點(diǎn)擊鼠標(biāo)右鍵將測(cè)試覆蓋分析的結(jié)果導(dǎo)出成需要的格式亥宿,例如 HTML卸勺。

圖 11. 導(dǎo)出測(cè)試覆蓋分析結(jié)果

圖 12 顯示了導(dǎo)出的 report。

圖 12. 測(cè)試覆蓋分析報(bào)告

為了保證單元測(cè)試的有效性和質(zhì)量烫扼,可以規(guī)定一個(gè)測(cè)試覆蓋率的下限曙求,例如所有的包和類的覆蓋率必須達(dá)到 80% 以上。不過(guò)值得注意的是映企,不要單純追求高覆蓋率悟狱,要同時(shí)注意測(cè)試用例的質(zhì)量,如果測(cè)試用例本身就寫(xiě)的有錯(cuò)誤堰氓,那么即使測(cè)試覆蓋率很高也沒(méi)有意義挤渐。

步驟四:持續(xù)集成

持續(xù)集成(Continuous Integration)是利用一系列的工具,方法和規(guī)則双絮,做到快速的構(gòu)建開(kāi)發(fā)代碼浴麻,自動(dòng)的測(cè)試化,來(lái)提高開(kāi)發(fā)代碼的效率和質(zhì)量囤攀。利用自動(dòng)構(gòu)建工具软免,隨時(shí)都能把提交的代碼構(gòu)建出來(lái),提供一個(gè)可以測(cè)試使用的版本抚岗,讓用戶和開(kāi)發(fā)人員同時(shí)看到相同的功能或杠,盡早的發(fā)現(xiàn)問(wèn)題和錯(cuò)誤,也可以盡快的得到測(cè)試人員和用戶的反饋宣蔚。

要做到持續(xù)集成向抢,就要利用一系列工具,把開(kāi)發(fā)過(guò)程中的重復(fù)工作自動(dòng)化胚委。搭建自動(dòng)的構(gòu)建服務(wù)器挟鸠,自動(dòng)的進(jìn)行單元測(cè)試和發(fā)布新版本,一個(gè)集成的服務(wù)器可以提供構(gòu)建過(guò)程的結(jié)果報(bào)告亩冬,自動(dòng)通知開(kāi)發(fā)人員構(gòu)建結(jié)果艘希,并且保存歷史數(shù)據(jù)。IBM Rational Team Concert (RTC) 可以提供工作任務(wù)的管理硅急,項(xiàng)目計(jì)劃的安排覆享,代碼版本管理控制,自動(dòng)構(gòu)建可用版本营袜,生成構(gòu)建結(jié)果報(bào)告撒顿。這些過(guò)程構(gòu)成了項(xiàng)目的持續(xù)集成過(guò)程,其中荚板,版本的自動(dòng)構(gòu)建和代碼的自動(dòng)單元測(cè)試是持續(xù)集成的關(guān)鍵過(guò)程凤壁,RTC 在這些過(guò)程上提供了有力的支持吩屹。

自動(dòng)構(gòu)建

RTC 提供了 build engine 來(lái)負(fù)責(zé)構(gòu)建 build,首選拧抖,啟動(dòng) build engine煤搜,并和 RTC 服務(wù)器建立了連接。再創(chuàng)建項(xiàng)目的 build 定義唧席。在這個(gè)定義中擦盾,需要設(shè)定編譯哪些模塊的代碼,需要跳動(dòng)哪個(gè) ANT 文件來(lái)啟動(dòng)編譯袱吆,和一些編譯過(guò)程中的參數(shù)的設(shè)定厌衙。當(dāng)這些都準(zhǔn)備好了,編譯對(duì)于項(xiàng)目而言绞绒,就變成一個(gè)簡(jiǎn)單的事情婶希。

可以看到,通過(guò)在 build 定義上蓬衡,點(diǎn)擊請(qǐng)求構(gòu)建喻杈,就可以觸發(fā)一次構(gòu)建過(guò)程。選擇需要的構(gòu)建參數(shù)狰晚,這個(gè)過(guò)程就會(huì)在后臺(tái)運(yùn)行筒饰。每一個(gè)開(kāi)發(fā)人員,做了稍許的代碼改變和提交壁晒,都可以觸發(fā)新的構(gòu)建過(guò)程瓷们,來(lái)保證我們代碼的有效性。申請(qǐng)一個(gè)新的構(gòu)建的過(guò)程如圖 13秒咐、圖 14 所示谬晕。

圖 13. 申請(qǐng)一個(gè)新的構(gòu)建
圖 14. 構(gòu)建申請(qǐng)界面

當(dāng)構(gòu)建結(jié)束后。RTC 服務(wù)器會(huì)提供構(gòu)建結(jié)果報(bào)告携取。開(kāi)發(fā)人員可以查詢到這次構(gòu)建的詳細(xì)信息攒钳。

圖 15. 構(gòu)建結(jié)果

整個(gè)開(kāi)發(fā)過(guò)程中,構(gòu)建版本的過(guò)程應(yīng)該是無(wú)數(shù)次的雷滋,通過(guò)每次構(gòu)建不撑,都可以得到當(dāng)時(shí)代碼的編譯情況,并且可以得到一個(gè)可運(yùn)行的軟件版本晤斩。在構(gòu)建定義上焕檬,RTC 支持設(shè)置構(gòu)建計(jì)劃。定時(shí)自動(dòng)的觸發(fā)一次構(gòu)建澳泵。

圖 16. 構(gòu)建定義

自動(dòng)單元測(cè)試

構(gòu)建可以自動(dòng)了实愚,重點(diǎn)提高代碼質(zhì)量的單元測(cè)試呢?如果每一天的代碼,每一個(gè)版本的代碼爆侣,都已經(jīng)通過(guò)了我們的單元測(cè)試,這樣我們就能對(duì)代碼的質(zhì)量有了基本的保證幢妄。在構(gòu)建腳本的自動(dòng)調(diào)用過(guò)程中兔仰,通過(guò) ANT 的腳本,可以加上 JUnit蕉鸳,EMMA乎赴,F(xiàn)indBugs 的 ANT 腳本調(diào)用,每一次的構(gòu)建潮尝,都可以把這些檢查工作自動(dòng)的進(jìn)行一遍測(cè)試榕吼。這些測(cè)試都要生成測(cè)試結(jié)果報(bào)告, RTC 不能提供這些報(bào)告的展示勉失,就可以利用 Hudson 這個(gè)開(kāi)源工具羹蚣,集成測(cè)試報(bào)告來(lái)方便查閱。

圖 17. 自動(dòng)測(cè)試報(bào)告

步驟五:代碼評(píng)審和重構(gòu)

代碼評(píng)審(Code Review)是 Java 項(xiàng)目開(kāi)發(fā)過(guò)程中的一個(gè)重要步驟乱凿,代碼評(píng)審可以幫助發(fā)現(xiàn)靜態(tài)代碼分析過(guò)程中無(wú)法發(fā)現(xiàn)的一些問(wèn)題顽素,例如代碼的編寫(xiě)是否符合編碼規(guī)范,代碼在邏輯上或者功能上是否存在錯(cuò)誤徒蟆,代碼在執(zhí)行效率和性能上是否有需要改進(jìn)的地方胁出,代碼的注釋是否完整正確,代碼是否存在冗余和重復(fù)段审。代碼評(píng)審還可以幫助新進(jìn)入項(xiàng)目組的成員快速學(xué)習(xí)和了解項(xiàng)目全蝶,促進(jìn)經(jīng)驗(yàn)分享,同時(shí)也能保證項(xiàng)目成員的良好溝通寺枉。代碼評(píng)審主要包括兩種形式抑淫,同級(jí)評(píng)審(Peer Review)和小組評(píng)審(Group Review)。同級(jí)評(píng)審主要指項(xiàng)目成員間的互相評(píng)審型凳,小組評(píng)審是指通過(guò)召開(kāi)評(píng)審會(huì)議丈冬,項(xiàng)目成員一起對(duì)項(xiàng)目代碼進(jìn)行評(píng)審。

為了提高代碼評(píng)審的有效性和效率甘畅,可以借助一些外部工具埂蕊,比較常用的代碼評(píng)審工具有 Jupiter 和 Code Striker。Jupiter 是一款開(kāi)源的 Eclipse 插件疏唾,允許成員將評(píng)審意見(jiàn)定位到真實(shí)代碼的具體行蓄氧,由于代碼評(píng)審的結(jié)果以 XML 文件的形式保存,所以可以把結(jié)果提交到版本管理服務(wù)器進(jìn)行共享槐脏。圖 18 顯示了使用 Jupiter 進(jìn)行代碼評(píng)審的界面喉童。

圖 18. Jupiter 代碼評(píng)審界面

在代碼評(píng)審任務(wù)創(chuàng)建后,Jupiter 將代碼評(píng)審分成三個(gè)階段顿天,個(gè)人評(píng)審階段 (Individual Phase)堂氯、團(tuán)隊(duì)評(píng)審階段(Team Phase)和問(wèn)題修復(fù)階段(Rework Phase)蔑担。在個(gè)人評(píng)審階段,評(píng)審成員將發(fā)現(xiàn)的代碼問(wèn)題或者缺陷記錄下來(lái)咽白,每個(gè)問(wèn)題都會(huì)作為一個(gè)記錄保存在評(píng)審表格中啤握。在團(tuán)隊(duì)評(píng)審階段,團(tuán)隊(duì)的全部或者部分成員會(huì)一起對(duì)個(gè)人評(píng)審階段發(fā)現(xiàn)的問(wèn)題進(jìn)行定性晶框,如果問(wèn)題確實(shí)存在排抬,就將該問(wèn)題分配給某個(gè)成員去解決,并在 Jupiter 中將該問(wèn)題設(shè)置成相應(yīng)的狀態(tài)授段。在問(wèn)題修復(fù)階段蹲蒲,團(tuán)隊(duì)成員會(huì)修復(fù)屬于自己的問(wèn)題,并將相應(yīng)的記錄設(shè)置成已解決等正確的狀態(tài)侵贵。

Codestriker 是一款基于 Web 的常用代碼評(píng)審工具届搁,對(duì)代碼的評(píng)審可以針對(duì)某一具體行,也可以針對(duì)整個(gè)代碼文件模燥,評(píng)審意見(jiàn)會(huì)被保存在數(shù)據(jù)庫(kù)中咖祭。評(píng)審人員可以同時(shí)看到其他人的評(píng)論,代碼作者也可以針對(duì)某一具體的評(píng)論回復(fù)蔫骂。Codestriker 支持郵件通知么翰,還可以同版本控制服務(wù)器進(jìn)行集成,以跟蹤和顯示文件內(nèi)容的改變辽旋。圖 19 顯示了 Codestriker 的界面浩嫌。

圖 19. Codestriker 報(bào)告界面

在實(shí)踐中對(duì)所有代碼進(jìn)行小組評(píng)審會(huì)比較費(fèi)時(shí),所以可以根據(jù)實(shí)際情況來(lái)挑選一些核心代碼進(jìn)行小組評(píng)審补胚,或者在項(xiàng)目的前期安排較多的小組評(píng)審码耐,等項(xiàng)目組的成員對(duì)代碼評(píng)審的標(biāo)準(zhǔn)和要求有較好的理解,進(jìn)行代碼評(píng)審的經(jīng)驗(yàn)提高后溶其,就可以逐漸減少小組評(píng)審的次數(shù)骚腥,從而達(dá)到大部分代碼即使只進(jìn)行同級(jí)評(píng)審也能保證很好的質(zhì)量。

通過(guò)代碼評(píng)審發(fā)現(xiàn)的問(wèn)題要通過(guò)代碼重構(gòu)及時(shí)解決掉瓶逃,較小的不涉及多人代碼的重構(gòu)可以由項(xiàng)目成員自己借助 Eclipse 的重構(gòu)功能完成束铭,不同項(xiàng)目成員寫(xiě)的實(shí)現(xiàn)相同功能的不同代碼要通過(guò)討論整合成公共的類或者方法。比較復(fù)雜的或者比較高層次的重構(gòu)工作厢绝,例如整個(gè)項(xiàng)目層面的代碼組織形式的改變需要由整個(gè)項(xiàng)目組共同討論完成契沫。

結(jié)論

軟件開(kāi)發(fā)沒(méi)有一成不變、萬(wàn)能通用的流程和方法昔汉,希望大家能從本文得到啟發(fā)和收益懈万,結(jié)合您的實(shí)際項(xiàng)目特點(diǎn),實(shí)踐以上步驟和方法,并加以完善和改進(jìn)会通,共同打造高效高質(zhì)量的 Java 代碼口予,為您的項(xiàng)目成功奠定堅(jiān)實(shí)的基礎(chǔ)。

Java_蘇先生:專注于Java開(kāi)發(fā)技術(shù)的研究與知識(shí)分享涕侈!

————END————

  • 點(diǎn)贊(感謝)
  • ...
  • 轉(zhuǎn)發(fā)(感謝)
  • ...
  • 關(guān)注(感謝)
  • ...
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末苹威,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子驾凶,更是在濱河造成了極大的恐慌,老刑警劉巖掷酗,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件调违,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡泻轰,警方通過(guò)查閱死者的電腦和手機(jī)技肩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)浮声,“玉大人虚婿,你說(shuō)我怎么就攤上這事∮净樱” “怎么了然痊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)屉符。 經(jīng)常有香客問(wèn)我剧浸,道長(zhǎng),這世上最難降的妖魔是什么矗钟? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任唆香,我火速辦了婚禮,結(jié)果婚禮上吨艇,老公的妹妹穿的比我還像新娘躬它。我一直安慰自己,他們只是感情好东涡,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布冯吓。 她就那樣靜靜地躺著,像睡著了一般软啼。 火紅的嫁衣襯著肌膚如雪桑谍。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天祸挪,我揣著相機(jī)與錄音锣披,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛雹仿,可吹牛的內(nèi)容都是我干的增热。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼胧辽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼峻仇!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起邑商,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤摄咆,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后人断,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體吭从,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年恶迈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涩金。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡暇仲,死狀恐怖步做,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奈附,我是刑警寧澤全度,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站斥滤,受9級(jí)特大地震影響讼载,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜中跌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一咨堤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧漩符,春花似錦一喘、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至闷沥,卻和暖如春萎战,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舆逃。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工蚂维, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留戳粒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓虫啥,卻偏偏與公主長(zhǎng)得像蔚约,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子涂籽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • <<互聯(lián)網(wǎng)敏捷DevOps和自動(dòng)化之5.持續(xù)集成>>持續(xù)集成的價(jià)值是什么苹祟?對(duì)于開(kāi)發(fā)和測(cè)試人員又意味著什么呢?1.1...
    燕京博士閱讀 2,776評(píng)論 0 5
  • 1评雌、你的測(cè)試職業(yè)發(fā)展是什么树枫? 測(cè)試經(jīng)驗(yàn)越多,測(cè)試能力越高景东。所以我的職業(yè)發(fā)展是需要時(shí)間積累的团赏,一步步向著高級(jí)測(cè)試工程...
    歐爾麥特fffff閱讀 4,616評(píng)論 1 41
  • 1 背景 一個(gè)項(xiàng)目開(kāi)發(fā)必然會(huì)涉及團(tuán)隊(duì)協(xié)作,而工程質(zhì)量就需要團(tuán)隊(duì)去保證耐薯。一般我們期望的代碼:無(wú)潛在風(fēng)險(xiǎn)、無(wú)重復(fù)邏輯丝里、...
    zyl06閱讀 3,212評(píng)論 5 16
  • 1.問(wèn):你在測(cè)試中發(fā)現(xiàn)了一個(gè) bug 曲初,但是開(kāi)發(fā)經(jīng)理認(rèn)為這不是一個(gè) bug ,你應(yīng)該怎樣解決杯聚。 首先臼婆,將問(wèn)題提...
    qianyewhy閱讀 9,232評(píng)論 4 123
  • 蟬鳴雀兒嬉鬧 花在叢中微笑 玉中美景幾多嬌 城里風(fēng)光無(wú)限好
    爵爺?shù)念~娘閱讀 475評(píng)論 0 50