利用模板代碼、開發(fā)手冊、自動化代碼檢查等最佳實(shí)踐改善項(xiàng)目執(zhí)行 概要 軟件開發(fā)是復(fù)雜困難的。針對軟件開發(fā),我們可能會在設(shè)計(jì)觀點(diǎn),相關(guān)解決方案,軟件模式等方面討論很多很多,但是軟件開發(fā)的執(zhí)行過程本身卻是一個(gè)需要許多模式和最佳實(shí)踐以節(jié)約寶貴時(shí)間的領(lǐng)域。本文展示3項(xiàng)軟件執(zhí)行領(lǐng)域的最佳實(shí)踐以解決日常軟件項(xiàng)目執(zhí)行中的問題。 版權(quán)聲明:任何獲得Matrix授權(quán)的網(wǎng)站,轉(zhuǎn)載時(shí)請務(wù)必保留以下作者信息和鏈接 作者:ShriKant Vashishthav_gyc(作者的Blog:http://blog./page/v_gyc) 原文:http://www./javaworld/jw-11-2005/jw-1114-j2ee.html 譯文:http://www./resource/article/44/44148_J2EE+Best+Practices.html 關(guān)鍵字:J2EE;Best;Practices 雖然在幾乎所有的項(xiàng)目中一些相同的問題不斷重復(fù)出現(xiàn),但是我們?nèi)匀蝗鄙倜鞔_的方法來解決它們。 在軟件開發(fā)的職業(yè)生涯中, 我使用了一些方法來解決這些重復(fù)出現(xiàn)的困擾我的大部分開發(fā)項(xiàng)目的問題,這些方法真正有助于項(xiàng)目執(zhí)行效率的提升。本文中,我將與各位分享3項(xiàng)項(xiàng)目執(zhí)行的最佳實(shí)踐,其中的某幾個(gè)方法有充分的資格可以被認(rèn)定為模式(pattern)。 · 使用模板代碼 · 編寫高效的開發(fā)手冊 · 執(zhí)行自動化代碼檢查 使用模板代碼 開發(fā)者可以從參考簡單的業(yè)務(wù)用例和復(fù)雜的業(yè)務(wù)用例的示例代碼實(shí)現(xiàn)中獲得幫助,編寫出有效、高效率的代碼。考慮下面的一些經(jīng)常困擾軟件開發(fā)項(xiàng)目的因素: · 技術(shù)始終在變化,要找到對于新技術(shù)具有使用經(jīng)驗(yàn)的有競爭力的技術(shù)人員是很困難的事情(譯注: 去做獵頭吧!)。另一方面,開發(fā)新手可能不具備編寫有效正確代碼的經(jīng)驗(yàn)。模板代碼為開發(fā)者的工作提供了良好的參考,使得學(xué)習(xí)新技術(shù)變的相對簡單。 · 學(xué)習(xí)利用新技術(shù)需要時(shí)間,而且如果使用不當(dāng)可能導(dǎo)致一團(tuán)混亂,因此強(qiáng)迫開發(fā)者自己學(xué)習(xí)新技術(shù)不是很好的途徑。 作為替代方法,提供模板代碼作為開發(fā)者編碼的參考使得開發(fā)者在開發(fā)過程中獲得了學(xué)習(xí)新技術(shù)的良好起點(diǎn)。 · 許多項(xiàng)目必須由有限的人員在緊迫的期限內(nèi)完成。項(xiàng)目團(tuán)隊(duì)中的每個(gè)人都不應(yīng)該重新造輪子。高級技術(shù)人員可能在設(shè)計(jì)階段提供幫助,不過項(xiàng)目進(jìn)行到實(shí)現(xiàn)階段可能就要求程序員自助了。一不留意的小問題,到了發(fā)現(xiàn)的時(shí)候可能已經(jīng)造成了混亂。問問自己,使用Javadoc工具的時(shí)候,有幾次遵循了標(biāo)準(zhǔn)的格式和文檔生成指導(dǎo)方針呢?代碼是否遵循了定義良好的習(xí)慣用法和最佳實(shí)踐呢?那么如何貫徹這些良好實(shí)踐呢?此處,可視的模板代碼能夠提供比技術(shù)書籍或者參考手冊更有效的幫助,因此,應(yīng)該使用模板代碼。 · 許多軟件項(xiàng)目不僅體積龐大,而且分布式地進(jìn)行開發(fā)。有時(shí),項(xiàng)目的執(zhí)行是同時(shí)在世界上的不同地點(diǎn)展開的。作為開發(fā)人員你不想看到——當(dāng)你的項(xiàng)目部分接近完成時(shí),你的代碼的客戶驚奇的發(fā)現(xiàn)你的代碼沒有滿足他們的需求。應(yīng)該在開始編寫代碼實(shí)現(xiàn)功能前,將示例代碼送給你的客戶評審,并記錄反饋。這些示例代碼不應(yīng)該僅僅是類似”世界,你好”的程序,應(yīng)該具有代表性,與實(shí)際編寫的代碼很接近。 · 通常開發(fā)者都有一堆參考手冊、標(biāo)準(zhǔn)、程序框架等資料,可以在項(xiàng)目中通過它們來獲得幫助。但是,即使已經(jīng)完成了設(shè)計(jì)工作,編碼的風(fēng)格也不是顯而易見的,難以遵守??梢暤哪0宕a可以提供這方面的幫助。除非開發(fā)者可以看到真實(shí)的代碼例程,否則他們對當(dāng)前項(xiàng)目的解釋彼此間可能有些許的出入。 一個(gè)簡單功能由多個(gè)開發(fā)者來實(shí)現(xiàn),其實(shí)現(xiàn)方式可能是不同的,甚至可能沒有一個(gè)與推薦的模擬最佳實(shí)現(xiàn)的方式相同。 模板代碼的實(shí)現(xiàn) 首先,召集一組專家(技術(shù)上的和業(yè)務(wù)上的)從目標(biāo)項(xiàng)目的問題域中甄別出簡單用例和復(fù)雜用例各一個(gè),并在現(xiàn)有設(shè)計(jì)的基礎(chǔ)上分別實(shí)現(xiàn)這兩個(gè)用例。這樣,項(xiàng)目組就擁有了自己的模板代碼。下面列出了一些編寫模板代碼的小技巧 · 模板代碼中應(yīng)該包含立即可用的編譯和部署腳本。否則,在開發(fā)的構(gòu)建階段解決這些問題又要浪費(fèi)不少時(shí)間。 · 項(xiàng)目的基本目錄結(jié)構(gòu)應(yīng)該準(zhǔn)備完畢,并且包含了欲在項(xiàng)目中使用的各種庫。 · 模板代碼應(yīng)該遵循項(xiàng)目中使用的命名規(guī)范、代碼風(fēng)格、其它標(biāo)準(zhǔn)以及應(yīng)用框架的要求。 · 模板代碼中應(yīng)該使用定義良好的Javadoc模板(比如、基于Eclipse的Javadoc模板),以幫助開發(fā)人員編寫javadoc注釋。編寫良好的javadoc注釋是很重要的,通常這些注釋可能是代碼維護(hù)和再開發(fā)團(tuán)隊(duì)的唯一可用的文檔。 · 程序語言中明確的編碼慣用法應(yīng)該在模板代碼中使用,這有助于開發(fā)者編寫有效的代碼。 · 模板代碼應(yīng)該明確定義使用開發(fā)框架的標(biāo)準(zhǔn)方法。對于新的開發(fā)者來說,在項(xiàng)目的初始構(gòu)建階段編寫基于特定框架的實(shí)現(xiàn)類是很困難的任務(wù)。示例代碼有助于新的開發(fā)者理解框架等概念。即使框架有許多文檔,利用框架進(jìn)行有效率的開發(fā)也并不都是很容易。 · 模板代碼應(yīng)該展示如何利用JUnit或其他測試框架編寫測試用例(test cases)。 · 客戶的技術(shù)團(tuán)隊(duì)?wèi)?yīng)該評審這些模板代碼,這樣他們對于在項(xiàng)目構(gòu)建階段結(jié)束時(shí)的代碼質(zhì)量具有更明確的認(rèn)識,而不會在最后時(shí)刻感到意外。 · 模板代碼應(yīng)該從頭到尾的涵蓋用例,比如從表示層到數(shù)據(jù)層。 · 對于模板代碼的各種細(xì)枝末節(jié)應(yīng)該進(jìn)行一次詳盡的介紹,使得開發(fā)者熟悉它們。開發(fā)者應(yīng)該理解在架構(gòu)的每個(gè)層次需要做那些工作、使用了(或者可能使用)那些編碼慣用法和最佳實(shí)踐,以及為什么使用它們。 使用模板代碼的好處 · 開發(fā)者獲得開始編寫代碼的參考 · 客戶與開發(fā)者就項(xiàng)目預(yù)期質(zhì)量達(dá)成一致,因而避免了通常由于理解差異產(chǎn)生的各種問題。 · 開發(fā)者擁有了開始編碼工作的骨架。 · 開發(fā)者更容易掌握并應(yīng)用項(xiàng)目中使用的開發(fā)框架和各種外部API,這有助于提高開發(fā)效率。 · 開發(fā)者沒有重新造輪子。大部分的最佳開發(fā)實(shí)踐和編碼慣用法都擺在了他們面前,這也可以提高開發(fā)效率。 有效的開發(fā)手冊 假設(shè)我們必須完成一個(gè)日常開發(fā)人員為30到50人的大項(xiàng)目。不是所有的開發(fā)人員都掌握了需要使用的技術(shù)以及遵循的標(biāo)準(zhǔn)。一個(gè)項(xiàng)目可能需要使用很多技術(shù)以及私有的開發(fā)框架。這些框架可能在以后的Java企業(yè)項(xiàng)目中使用。有效的在項(xiàng)目間,開發(fā)者之間進(jìn)行大量知識的轉(zhuǎn)移是一個(gè)大挑戰(zhàn)。知識轉(zhuǎn)移也涉及到如下的一些問題: · 很多大型項(xiàng)目的開發(fā)持續(xù)很長時(shí)間(1到2年)。我們必須正視這樣的事實(shí):軟件行業(yè)具有相當(dāng)高的離職率,這是基本的現(xiàn)實(shí)也是一個(gè)挑戰(zhàn)。雇用新人可能很容易,但是教授新人項(xiàng)目知識卻又是一項(xiàng)艱巨任務(wù),特別的,考慮到項(xiàng)目的進(jìn)展不能停滯不前。 · 一些開發(fā)者可能不具有期望的技術(shù)水平?,F(xiàn)在,適時(shí)的找到掌握技術(shù)的開發(fā)者是很困難的。當(dāng)項(xiàng)目期限很急時(shí),新的開發(fā)者沒有時(shí)間去學(xué)習(xí)厚厚的技術(shù)書籍或者參考手冊。一部分人可能工作敏銳、高效,這樣可以騰出額外時(shí)間來學(xué)習(xí)并應(yīng)用新的技術(shù),但是不能假定所有人都會如此。 · 維護(hù)一個(gè)構(gòu)建完畢的軟件項(xiàng)目同樣也是大的挑戰(zhàn)。在開發(fā)周期后的代碼維護(hù)工作可能是由客戶的IT團(tuán)隊(duì)執(zhí)行的。對他們來說,熟悉項(xiàng)目的技術(shù)架構(gòu)并且改動代碼以做出改變很困難。如果沒有定義明確的方式來傳遞這些知識,那么在維護(hù)階段的初期,客戶IT團(tuán)隊(duì)研讀項(xiàng)目代碼和設(shè)計(jì)文檔的工作可能會是很沮喪的經(jīng)歷。 開發(fā)手冊應(yīng)該能夠解決上面提到的問題,但是如何編寫一個(gè)有效的開發(fā)手冊呢? 編寫開發(fā)手冊 下面是一些如何編寫開發(fā)手冊的提示: · 開發(fā)手冊應(yīng)該包含全部與搭建開發(fā)環(huán)境相關(guān)的必要信息 · 開發(fā)手冊的語句應(yīng)該簡明易讀。如果閱讀的人發(fā)現(xiàn)手冊很難閱讀,這不是閱讀者、而是手冊編寫者的失敗。 · 開發(fā)手冊應(yīng)該包含大量的示例。示例可以有效地表明手冊的內(nèi)容。 · 請求一位不熟悉項(xiàng)目中所使用的技術(shù)的開發(fā)者檢查開發(fā)手冊。這樣,如果手冊內(nèi)包含會造成迷惑或者不明確的內(nèi)容,可以在其它人使用本手冊前修改這些地方,以使手冊更清晰明確。 · 開發(fā)手冊應(yīng)該在底層設(shè)計(jì)階段,作為階段任務(wù)的一部分完成。當(dāng)構(gòu)建階段開始時(shí),開發(fā)者可以有效利用本手冊。 · 開發(fā)手冊需要包括多少信息呢?如何在信息的多寡中平衡呢?開發(fā)者不喜歡厚重的手冊。但是,開發(fā)手冊中不能遺漏可以為許多不明確之處提供語境的信息。需要考慮開發(fā)者的真正需求,而不是僅僅考慮可以提供的全部信息是什么。使用簡單的、直截了當(dāng)?shù)?、漸進(jìn)的方式來編寫開發(fā)手冊。 · 開發(fā)手冊的信息提供方式應(yīng)該與閱讀者的閱讀直覺相符,而不該是在各處零落地散布著這樣那樣的信息。手冊內(nèi)容的組織方式應(yīng)該與現(xiàn)實(shí)中開發(fā)項(xiàng)目時(shí)需要閱讀信息的先后步驟一致。 比如,對于Java企業(yè)項(xiàng)目,首先需要搭建開發(fā)環(huán)境,然后開始表現(xiàn)層和應(yīng)用數(shù)據(jù)層的編碼工作。手冊信息也應(yīng)該以同樣的順序組織。 · 需要明確的是:手冊不能迷惑開發(fā)者。比如,開發(fā)者在編寫Struts框架下的Action類時(shí)需要使用特定的Xdoclet標(biāo)簽,那么開發(fā)者應(yīng)該很清楚項(xiàng)目中使用的各種XDoclet標(biāo)簽的意義和使用方式。為了查找更詳盡的信息,開發(fā)者總是可以參考開發(fā)手冊。 下面我們考慮一個(gè)在Java企業(yè)項(xiàng)目中的使用的真實(shí)地開發(fā)手冊應(yīng)該是什么樣的,它應(yīng)該包含的信息細(xì)節(jié)如下: · 開發(fā)環(huán)境搭建的細(xì)節(jié):當(dāng)新的開發(fā)者加入項(xiàng)目時(shí),必須搭建開發(fā)環(huán)境,然后才能開始工作。不要認(rèn)為開發(fā)者清楚項(xiàng)目的大小細(xì)節(jié)。如果項(xiàng)目一起使用了Eclipse和Weblogic開發(fā)Web應(yīng)用,新的開發(fā)者可能都不清楚Eclipse或者Weblogic是什么東東。因此,搭建開發(fā)環(huán)境的細(xì)節(jié)信息應(yīng)該是開發(fā)手冊的第一部分。具有基本Java知識的新開發(fā)者應(yīng)該很容易的按照手冊中的這些信息搭建開發(fā)環(huán)境。 · 表現(xiàn)層的細(xì)節(jié):通常,開發(fā)者對某個(gè)用例的實(shí)現(xiàn)從表現(xiàn)層開始。開發(fā)手冊中應(yīng)該包含如何創(chuàng)建表現(xiàn)層組件元素的詳細(xì)步驟。比如,項(xiàng)目的表現(xiàn)層使用Struts框架,手冊中應(yīng)該包含如何編寫Action類和Form類的確定步驟。如果項(xiàng)目使用XDoclet來構(gòu)建Struts配置文件struts-config.xml和其他配置文件,相應(yīng)的這些步驟也應(yīng)該包含在內(nèi)。JSP的相關(guān)技術(shù)信息也應(yīng)該如此。應(yīng)用MVC模式,無論如何不應(yīng)該在JSP頁面中包含任何Java代碼來實(shí)現(xiàn)業(yè)務(wù)邏輯。但是在實(shí)際開發(fā)中如何使用JSTL(JSP標(biāo)準(zhǔn)標(biāo)簽庫)標(biāo)簽來實(shí)現(xiàn)那樣的要求對于初學(xué)者或者是中級開發(fā)者可能都是很大的難題。開發(fā)手冊中包含一些展示如何在JSP頁面中使用JSTL標(biāo)簽的真實(shí)示例可能對這些開發(fā)者有些幫助。 · 業(yè)務(wù)層的細(xì)節(jié):業(yè)務(wù)邏輯可以應(yīng)用無狀態(tài)EJB組件、基于Spring的組件、或者簡單的原始java對象(plain-old java object)來實(shí)現(xiàn)。開發(fā)手冊中應(yīng)包含項(xiàng)目中使用的業(yè)務(wù)組件代碼的骨架以及業(yè)務(wù)邏輯實(shí)現(xiàn)的實(shí)際例程 · 數(shù)據(jù)層的細(xì)節(jié):依賴于項(xiàng)目使用的持久化機(jī)制,開發(fā)手冊中應(yīng)該包含JDBC、Hibernate或者任何基于其它框架的DAO(數(shù)據(jù)訪問對象)的信息,包含項(xiàng)目中如何使用此持久化機(jī)制的步驟以及最佳實(shí)踐。 · 其它信息:手冊需提供J2EE項(xiàng)目架構(gòu)各層中使用的各種內(nèi)部或者外部組件的信息。例如,應(yīng)該包括日志、郵件、代碼檢查和安全等組件的信息。同樣的,在項(xiàng)目后期,手冊中應(yīng)該包含一些如何擴(kuò)展業(yè)務(wù)需求的章節(jié)。比如,項(xiàng)目中使用了批處理框架,那么如何為新的批處理需求擴(kuò)展它呢? 自動化代碼檢查 代碼檢查是另外一項(xiàng)需處理的事項(xiàng)。當(dāng)代碼大量生成時(shí),持續(xù)的代碼檢查是必須的工作。即使已經(jīng)定義了一套代碼檢查的規(guī)則,還是有許多問題沒有辦法在這些規(guī)則中描述并加以限制。基于個(gè)人能力和經(jīng)驗(yàn),每個(gè)人都有自己的代碼檢查方式。同時(shí),有些問題很微小,無法進(jìn)行逐行檢查。 如果需要檢查的代碼數(shù)量很大,這些微小的問題可能會在一些地方被忽略掉。如果IDE自身產(chǎn)生了錯(cuò)誤又怎么辦?還好,有些工具可以替代人工代碼檢查來發(fā)現(xiàn)這些問題。 Eclipse IDE的設(shè)置 有時(shí), 設(shè)置IDE的選項(xiàng)可以提供些幫助。比如,你可以配置Eclipse IDE的選項(xiàng),當(dāng)代碼中出現(xiàn)問題時(shí)顯示警告。下圖是如何在Eclipse中設(shè)置Javadoc配置選項(xiàng)的示例。 ![]() 圖 1. Eclipse Javadoc 設(shè)置 選項(xiàng)設(shè)置好后,Eclipse會在出現(xiàn)錯(cuò)誤時(shí)顯示警告信息,然后開發(fā)者可以修改。如果項(xiàng)目標(biāo)準(zhǔn)很嚴(yán)格,IDE的警告將升級為錯(cuò)誤,開發(fā)者必須處理這些問題。 Jlint 代碼檢查工具 類似的,可以在Eclipse中使用Jlint工具以發(fā)現(xiàn)代碼中的微小問題。下面是在Eclipse中如何使用JLint的方法和步驟: · 下載jlint的2進(jìn)制版本以及相應(yīng)的Eclipse插件,解壓縮2進(jìn)制版本到C:\lint目錄,解壓縮插件到Eclipse插件目錄。 · 運(yùn)行Eclipse, 選擇菜單項(xiàng)Window(窗口)->Preferences(設(shè)置)->Java->Jlint,設(shè)定jlint.exe的目標(biāo)位置為C:\jlint\jlint.exe · 在Eclipse的資源(Resource)視圖中右鍵點(diǎn)擊你的項(xiàng)目,然后選擇jlint選項(xiàng)即可。當(dāng)一次完整地工作區(qū)編譯后,Jlint會在工作區(qū)內(nèi)可能出現(xiàn)問題的地方顯示黃色警告標(biāo)記。 下圖 顯示了如何在Eclipse中配置Jlint ![]() 圖2 Eclipse中Jlint插件的配置 Lint4j 如果不使用IDE,那么可以結(jié)合ant使用lint4j發(fā)現(xiàn)代碼中的問題。Ant腳本中需要聲明的參數(shù)如下: · lint4j.dist.dir: lint4j的分發(fā)包的安裝目錄 · packages:需要由lint4j檢查的java包名稱 · ignorePackages: 不需要由lint4j檢查的java包名稱 下面是使用jlint的ant腳本示例: lint4j的Ant Build腳本 <?xml version="1.0"?> Checkstyle工具 代碼檢查的另一個(gè)工具是CheckStyle,它會依照java開發(fā)專家廣泛使用的Java編碼規(guī)范來檢查代碼質(zhì)量??梢越Y(jié)合Ant使用(也有Eclipse插件)。CheckStyle的檢查選項(xiàng)是高度可配置的,可以配置成支持任何代碼規(guī)范的檢查。它的下載版本中包含了一個(gè)支持Sun編碼規(guī)范(Sun’s Coding Conventions)檢查的規(guī)則配置文件。 編寫Ant腳本使得代碼檢查同編譯過程一起完成,這樣開發(fā)者可以注意到代碼包含的錯(cuò)誤并改正它們。 結(jié)論 在軟件開發(fā)項(xiàng)目中的需要面對的大部分的普通問題是重復(fù)出現(xiàn)的。在如今充滿競爭的世界里——縮減開發(fā)期限、降低項(xiàng)目成本的壓力很大,想在每個(gè)項(xiàng)目中重新造輪子根本就沒有時(shí)間。 本文并未對軟件開發(fā)執(zhí)行過程中會出現(xiàn)的問題都提供了解決方案,只是踏出了前行的一步,其目的是展示最佳軟件開發(fā)實(shí)踐和高效工具的使用。了解了這些以及未來會學(xué)習(xí)到的最佳實(shí)踐和模式,你就對軟件生命周期中容易出現(xiàn)的任何障礙做好了準(zhǔn)備。這些也可以使得項(xiàng)目管理者、架構(gòu)人員和開發(fā)者能夠集中精力進(jìn)行“真正”的開發(fā),而不是疲于應(yīng)付開發(fā)中出現(xiàn)的各種問題。 希望在未來的軟件開發(fā)中,更多的專家會貢獻(xiàn)并記錄更多的最佳實(shí)踐和模式,軟件開發(fā)實(shí)踐作為一門藝術(shù)的同時(shí)也成為具有更多確定性的一門科學(xué)。 關(guān)于作者 ShriKant Vashishtha是一名技術(shù)架構(gòu)人員,現(xiàn)供職于印度Tata咨詢服務(wù)有限公司。作者具有超過7年的軟件開發(fā)經(jīng)驗(yàn),曾參與了多個(gè)基于J2EE技術(shù)的大型項(xiàng)目的技術(shù)架構(gòu)設(shè)計(jì)。他具有印度Motilal Nehru National Institute of Technology大學(xué)的電機(jī)工程學(xué)科的工學(xué)學(xué)士學(xué)位。 資源 · SourceForge上的XDoclet項(xiàng)目,代碼生成器 · Eclipse主頁 開源的集成開發(fā)環(huán)境平臺 · SourceForge上的Jlint代碼檢查工具項(xiàng)目主頁 · Lint4j代碼檢查工具的主頁 · CheckStyle代碼檢查工具的主頁 · Sun文檔:如何編寫javadoc注釋 · 更多關(guān)于Java Enterprise Edition的文章,請瀏覽javaworld’s J2EE主題部分 · 譯注:補(bǔ)充翻譯者日常使用的幾個(gè)代碼質(zhì)量檢查工具 pmd設(shè)計(jì)/代碼檢查工具 metrics代碼質(zhì)量檢查工具 |
|