登入  |  English
感謝您對「自由軟體鑄造場」的支持與愛護,十多年來「自由軟體鑄造場」受中央研究院支持,並在資訊科學研究所以及資訊科技創新研究中心執行,現已完成階段性的任務。 原網站預計持續維運至 2021年底,網站內容基本上不會再更動。本網站由 Denny Huang 備份封存。
也紀念我們永遠的朋友 李士傑先生(Shih-Chieh Ilya Li)。

PMD

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 將會是所有工程師將程式碼交測的最後一道防線,減少不必要的問題與錯誤發生,也可以增加系統的效能與安全等考量。



自由軟體鑄造場電子報 : 第 83 期 自由軟體教育研習

分類: 技術專欄