PMD
建立日期 2007-06-25 07:20
作者是 李日貴(松凌科技技術總監)
Java Opensources for Web Development Part I:
Chapter 5 檢測程式碼
Lession 19 : PMD
往往我們在撰寫程式碼的時候,會忽略一些小細節,可能是當初貪圖方便,未來將造成系統的負擔。例如,使用 System.print 方式來進行除錯的作業,雖然小小的一行輸出的動作,卻容易造成系統頻繁的 IO ,而且輸出一些沒有等級的 logging 資訊,更會造成除錯上的負擔。
PMD 就是專門協助工程師來判斷程式之中是否有一些小錯誤出現,提供了許多 IDE 工具的整合,在 ant、QALab、XRadar與 maven 等都有支援 PMD,當然你也可以利用命令列的模式來進行 PMD 的驗證。在 Eclipse 僅需要利用 HELP 之中的 Software Update,將下載網址指到 https://pmd.sourceforge.net/eclipse 就會自動進行安裝作業。
要了解 PMD 首先需要了解 Rule Sets,因為撰寫程式的規範很多,每家公司或多或少都會有一些自己所要求的規定,如果利用 Eclipse 在 Window -> Preferences 中 PMD 的 Rules Configuration 進行各種 Rule Sets 等級的設定,甚至移除一些你認為不用檢測或是新增自己所撰寫的
RuleSet 。
{mosimage}
例如我把 AvoidInstantiatingObjectsInLoops 的等級改為 priority.error,相關的程式碼在進行 PMD check code 時(對範例 AvoidInstantiatingObjectsInLoops .java 檔案按右鍵)就會進行驗證。在 FOR 迴圈之中,實在不需要不斷 new 出新物件,應該在 FOR 迴圈之外宣告 UserModel user,這樣資源上就不會過於浪費。
package com.softleader.pmd;
import java.util.ArrayList;
import java.util.Collection;
public class AvoidInstantiatingObjectsInLoops {
public static void main(String[] args) {
Collection c = new ArrayList();
for(int i=0; i<10; i++) {
UserModel user = new UserModel();
user.setId(i);
user.setName("user"+i);
c.add(user);
}
}
}
當我們利用 IDE 檢測,下方會出現紅色的錯誤訊息,來告知程式之內,有錯誤的規則,在 PMD 編輯畫面中,如果不除錯則無法繼續作業,而其他則是有警告訊息提示在程式碼之前,如果有需要修改,再進行修正,並不會影響程式的編譯。
{mosimage}
如果不知道該 RuleSet 進行什麼類型的檢查,除了參考文件之外,也可以在 Eclipse 設定 PMD 的畫面之中,選擇 Edit Rule ,就會出現該規則的範例,例如 EmptyTryBlock 的範例:
public class Foo {
public void bar() {
try {
} catch (Exception e) {
e.printStackTrace();
}
}
}
就是說,如果 try catch 之中沒有任何內容,應該避免之。
PMD 除了針對 Java 原始碼進行檢核之外,也可以進行 JSP 的檢核,簡單來說,是進行是否符合 XHTML 的檢查,例如 <br> <hr> 雖然都是正確的 HTML codes,但是在 XHTML 的規則應該要用 <br/> 與 <hr/> 來表示,另外 PMD 會檢查 tag 屬性值,是否有被單引號或是雙引號所包住。
如果你確認部分程式或是程式碼是正確的,不需要 PMD 進行確認,或是 PMD 會造成ㄧ些小問題,則使用 //NOPMD 這樣的註解即可,或是在 JDK 1.5 以上使用@SuppressWarnings("PMD") 來宣告此 class 不需要 PMD 進行檢核。
未來 PMD 除了擴充一些 RuleSet 之外,更會增加 Data Flow 的分析以及清除不必要的程式碼,相信未來 PMD 將會是所有工程師將程式碼交測的最後一道防線,減少不必要的問題與錯誤發生,也可以增加系統的效能與安全等考量。