編輯:關於Android編程
如果能在構建代碼前發現代碼中潛在的問題會怎麼樣呢?很有趣的是,Eclipse 插件中就有這樣的工具,比如 JDepend 和 CheckStyle,它們能幫您在軟件問題暴露前發現這些問題。在讓開發自動化的本期文章中,自動化專家 Paul Duvall 將帶來一些關於 Eclipse 插件的例子,您可以安裝、配置和使用這些靜態分析插件,以便在開發生命周期的早期預防問題。
關於本系列開發軟件時,我的主要目標之一是:要麼防止將缺陷引入代碼庫,要麼限制缺陷的生存期;換言之,要盡早找到缺陷。很顯然,越是了解如何編寫更好的代碼以及如何有效測試軟件,就越能及早地捕捉到缺陷。我也很想要一張能發現潛在缺陷的安全之網。
在本系列八月份的那期文章中,我得出了這樣的結論:將檢驗工具集成到構建過程(例如,使用 Ant 或 Maven)中,能夠建立起一種尋找潛在缺陷的方法。盡管這種方法使一致性成為可能並超越了 IDE,但它也有一點反作用。必須在本地構建軟件或等待 Continuous Integration 構建的運行。如果使用 Eclipse 插件,就可以在通過 Continuous Integration 構建或集成前發現一些這樣的沖突。這就促成了我稱為漸進編程的編程方式,在這種方式下,允許在編碼過程中進行一定程度的質量檢驗 —— 再也不能比這個更早了!
本文涵蓋了我所認為的 “五大” 代碼分析領域:
可以用接下來的幾個靈活的 Eclipse 插件來揭示這些分析領域:
安裝 Eclipse 插件
安裝 Eclipse 插件再簡單不過了,只需要幾個步驟。在開始之前,最好把該插件下載站點的 URL 准備好。表 1 是本文用到的插件的列表:
表 1. 代碼改進插件和相應的下載站點 URL
知道了這些有用插件的下載地址後,安裝插件就是一個極簡單的過程。啟動 Eclipse,然後遵循下列步驟:
選擇Help | Software Updates | Find and Install,如圖 1 所示:請遵循上述這些步驟來安裝其他的 Eclipse 插件;只需改變插件名和相應的下載位置即可。
用 CheckStyle 校正標准
代碼庫的可維護性直接影響著軟件的整個成本。另外,不佳的可維護性還會讓開發人員十分頭痛(進而導致開發人員的缺乏)—— 代碼越容易修改,就越容易添加新的產品特性。像 CheckStyle 這樣的工具可以協助尋找那些可影響到可維護性、與編碼標准相沖突的地方,比方說,過大的類、太長的方法和未使用的變量等等。
有關 PMD使用 Eclipse 的 CheckStyle 插件的好處是能夠在編碼過程中了解到源代碼上下文的各種編碼沖突,讓開發人員更可能在簽入該代碼前真正處理好這些沖突。您也幾乎可以把 CheckStyle 插件視作一個連續的代碼復查工具!
安裝 CheckStyle 插件並做如下配置(參見圖 4):
Eclipse 重新構建工作空間,並在 Eclipse 控制台中列示已發現的編碼沖突,如圖 5 所示:
圖 5. Eclipse 中 CheckStyle 的代碼沖突列表
使用 CheckStyle 插件在 Eclipse 內嵌入編碼標准檢驗是一種很棒的方法,用這種方法可以在編碼時積極地改進代碼,從而在開發周期的早期發現源代碼中潛在的缺陷。這麼做還有更多的好處,如節省時間、減少失敗,也因此會減少項目的成本。沒錯,這就是一種積極主動的方式!
用 Coverlipse 確認覆蓋率
Coverlipse 是一個用於 Cobertura 的 Eclipse 插件,Cobertura 是一個代碼覆蓋率工具,可以用它來評估具有相應測試的源代碼的比率。Cobertura 也提供一個 Ant 任務和 Maven 插件,但用 Cobertura,您可以在編寫代碼時評估代碼覆蓋率。您見過這樣的模式嗎?
通過選擇 Eclipse 菜單項Run安裝 Coverlipse 插件並將其和 JUnit 關聯起來,該操作會顯示一系列運行配置選項,例如 JUnit、SWT 應用程序和 Java? 應用程序。右鍵單擊它並選擇JUnit w/Coverlipse節點中的New。在這裡,需要確定 JUnit 測試的位置,如圖 6 所示:
圖 6. 配置 Coverlipse 以獲取代碼覆蓋率
一旦單擊了Run,Eclipse 會運行 Coverlipse 並在源代碼(如圖 7 所示)中嵌入標記,該標記顯示了具有相關 JUnit 測試的代碼部分:
圖 7. Coverlipse 生成的具有嵌入類標記的報告
正如您所見,使用 Coverlipse Eclipse 插件可以更快地確定代碼覆蓋率。例如,這種實時數據功能有助於在將代碼簽入 CM 系統前更好地進行測試。這對漸進編程來說意味著什麼呢?
用 CPD 捕捉代碼重復
Eclipse 的 PMD 插件提供了一項叫做 CPD(或復制粘貼探測器)的功能,用於尋找重復的代碼。為在 Eclipse 中使用這項便利的工具,需要安裝具有 PMD 的 Eclipse 插件,該插件具有 CPD 功能。
為尋找重復的代碼,請用右鍵單擊一個 Eclipse 項目並選擇PMD | Find Suspect Cut and Paste,如圖 8 所示:
圖 8. 使用 CPD 插件運行復制粘貼檢驗
一旦運行了 CPD,您的 Eclipse 根目錄下就會創建出一個report文件夾,其中包含一個叫做 cpd.txt 的文件,文件中列示了所有重復的代碼。圖 9 中是一個 cpd.txt 文件的例子:
圖 9. Eclipse 插件生成的 CPD 文本文件
靠人工來尋找重復的代碼是一項挑戰,但使用像 CPD 這樣的插件卻能在編碼時輕松地發現重復的代碼。
使用 JDepend 進行依賴項檢查
JDepend 是個可免費獲取的開源工具,它為包依賴項提供面向對象的度量值,以此指明代碼庫的彈性。換句話說,JDepend 可有效測量一個架構的健壯性(反之,脆弱性)。
除了 Eclipse 插件,JDepend 還提供一個 Ant 任務、Maven 插件和一個 Java 應用程序,用以獲取這些度量值。對於相同的信息,它們有著不同的傳遞機制;但 Eclipse 插件的特別之處和相應優點是:它能以更接近源代碼(即,編碼時)的方式傳遞這條信息。
圖 10 演示了使用 Eclipse JDepend 插件的方法:通過右鍵單擊源文件夾並選擇Run JDepend Analysis。一定要選擇一個含源代碼的源文件夾;否則看不到此菜單項。
圖 10. 使用 JDepend Analysis 分析代碼
圖 11 顯示了運行 JDepend Analysis 時生成的報告。左邊顯示包,右邊顯示針對每個包的依賴項度量值。
圖 11. Eclipse 項目中的包依賴項
正如您所見,JDepend 插件提供了有助於不斷觀察架構可維護性變化的大量信息 —— 這其中最大的好處是您可以在編碼時看到這些數據。
回頁首
用 Metrics 測量復雜度
“五大”代碼分析最後的一項是測量復雜度。Eclipse 提供一種叫做 Metrics 的插件,使用該插件可以進行許多有用的代碼度量,包括圈復雜度度量,它用於測量方法中惟一路徑的數目。
安裝 Metrics 插件並重啟 Eclipse;然後遵循下列步驟:
右鍵單擊您的項目並選擇Properties菜單。在結果窗口中,選擇Enable Metrics plugin復選框並單擊OK,如圖 12 所示:
圖 12. 為項目配置 Metrics
從 Eclipse 中選擇Window菜單打開 Metrics 視圖,然後選擇Show View | Other...。
選擇Metrics | Metrics View打開如圖 13 中顯示的窗口。您需要使用 Java 透視圖並重新構建項目,從而顯示這些度量值。
圖 13. 打開 Eclipse 中的 Metrics View
單擊OK來顯示如圖 14 中的窗口。
在此例中,我正在查看一個單獨方法的圈復雜度。真正妙的是您可以雙擊 Metrics 列表中的方法,該插件會在 Eclipse 編輯器中為此方法打開源代碼。這就讓修正變得超級簡單(如果需要的話)!
圖 14. 查看方法的圈復雜度
正如我之前提到過的,Eclipse Metrics 插件還提供了許多功能強大的度量值,有助於您在開發軟件的過程中改進代碼 —— 可見,它是一個漸進編程意義上的插件!
合適的才是最好的
正如您從本文中看到的那樣,將“五大”測量方法,即編碼標准、代碼重復、代碼覆蓋率、依賴項分析和復雜度監控,用於改進代碼質量十分重要。但適合您 的才是好的。請記住還有其他許多可用的 Eclipse 插件(比如 PMD 和 FindBugs)能夠幫助您在開發周期的早期改進代碼質量。不管您想要的工具或偏愛的方法是什麼,重要的是:行動起來去積極改進代碼質量並讓手工代碼檢 驗的過程變得更加有效。我估計您使用這些插件一段時間後,就再也離不開它們了。
在今天的文章開始之前,有個忙想請大家幫一下,希望在京東、淘寶、當當、亞馬遜購買了我的書《Android群英傳:神兵利器》的朋友們,幫忙去網店上給個簡短的評價,舉手之勞,還
1 背景去年有很多人私信告訴我讓說說自定義控件,其實通觀網絡上的很多博客都在講各種自定義控件,但是大多數都是授之以魚,卻很少有較為系統性授之於漁的文章,同時由於自己也遲遲
1. 新建project MyJNI,使用默認設置即可。2. 新建Test類:右鍵com.example.myjni新建java類3. 在Test類中編寫如下代碼,loa
最近用淘寶客戶端的時候,編輯地址的時候有個地區選擇的功能。看上面的效果覺得挺酷,滾動的時候,是最後一個從下面飛上來挨著前一個。就自己鼓搗一個出來玩玩。說了效果可能不太直觀