J2EE 最佳作法程式碼複查

J2EE 最佳作法程式碼複查僅包含一個種類;亦稱為「J2EE 最佳作法」。

目的

J2EE 最佳作法程式碼複查會套用規則來偵測程式碼中的違反型樣,這些違反型樣難以利用傳統方法來偵測。違反型樣 (antipattern) 是發生在程式碼中的已知問題而且未遵循最佳作法。設計型樣是要遵循的良好模型,違反型樣則是應該避免的不良模型。這些違反型態會導致嚴重的效能退化或系統停用。此程式碼複查只會對 Servlet 執行。Servlet 必須是在以下列其中一種 Stub 為目標的動態 Web 專案之中:
  • WebSphere® Application Server 5.0
  • WebSphere Application Server 5.1
  • WebSphere Application Server 6.0
不支援 JSP、Struts 和 EJB。

程式碼複查中的部分規則需要資料流程分析來偵測一些發現項目。資料流程分析 (Data flow analysis)追蹤往發現項目的路徑。因此當套用這些規則時,會花費較長時間才能完成程式碼複查。

規則種類

下表列出 J2EE 最佳作法程式碼複查中的所有種類和子種類,以及其內含規則的說明。在左欄中,種類是以粗體文字表示,子種類則為純文字。

種類或子種類 說明
J2EE 最佳作法 包含以最佳 J2EE 開發作法為基準規則,並且支援以 WebSphere 伺服器為目標的 Web 專案
正確性 包含偵測不正確方法呼叫的規則
資料競爭 (data race) 其中包含的規則是用來偵測 J2EE 應用程式中會造成資料競爭狀況的方法呼叫
記憶體回收 其中包含的規則可偵測會延遲記憶體回收的方法呼叫
可維護性 其中包含的規則可用來偵測 J2EE 應用程式中難以維護的程式碼
效能及可調整性 其中包含的規則可用來偵測會妨礙 J2EE 應用程式的效能和限制其可調整性的方法呼叫
資源管理 包含 J2EE 應用程式中使用資源的 J2EE 最佳作法規則

規則類型

J2EE 最佳作法程式碼複查套用兩種規則類型:快速規則與深度規則。區別規則類型的性質是套用規則花費時間的長短,以及在發現項目中規則呈現資訊的類型。

快速 J2EE 規則

在 J2EE 最佳作法程式碼複查中套用快速 J2EE 規則比深度規則的所需時間少。快速規則呈現與其他程式碼複查相同的發現項目資訊。

深度 J2EE 規則 (deep J2EE rules)

深度 J2EE 規則需要資料流程分析,所以需要比快速規則更長的時間來產生發現項目。深度 J2EE 規則不只會產生發現項目,還會顯示引導至發現項目的路徑。這些規則需要資料流程分析,也就是追蹤發現項目路徑的方法,所以需要比快速規則更長的時間來產生發現項目。深度規則提供下列的其他資訊︰

深度 J2EE 規則的清單

共有 36 個深度 J2EE 規則。下表的左欄列出包含這些規則的子種類。右欄列出或說明子種類中的哪些規則是深度 J2EE 規則。

種類或子種類 深度 J2EE 規則
正確性
避免將未實作 java.io.Serializable 的物件儲存在 javax.servlet.http.HttpSession 中
資料競爭 (data race)
避免未使用共用鎖定而指派 javax.servlet.Service.service() 中的任何 static 欄位
避免未使用共用鎖定而指派 javax.servlet.Service.service() 中的 Servlet 實例欄位
效能及可調整性
在 javax.servlet.http.HttpServletRequest.getSession() 之後,一定要呼叫 javax.servlet.http.HttpSession.invalidate()
資源管理 這個子類別中的所有 32 個規則都是深度 J2EE 規則。

規則範例

本節包含 J2EE 最佳作法程式碼複查中所套用的每一種規則類型的範例。

快速規則範例

下列規則是「效能及可調整性」子種類中的快速規則範例。

避免從任何 Servlet 中呼叫 java.lang.Runtime

深度規則範例

下列規則是「資源管理」子種類中的深度規則範例。
在 new java.io.FileInputStream(java.io.File) 之後,一定要呼叫 java.io.FileInputStream.close()

已知問題

本節說明 J2EE 最佳作法程式碼複查的已知問題。

誤判的警報 (false positive)︰輸入串流未關閉

摘要︰J2EE 最佳作法程式碼複查產生輸入串流未關閉的發現項目。實際上,並無任何輸入串流可關閉。

說明︰程式碼複查在下列狀況時不能辨別所有的輸入串流均已關閉︰
  • 如果 bis 是空值,則沒有輸入串流可關閉
  • 某個輸入串流 FileInputStream 是用來建立第二個輸入串流 BufferedInputStream。當第二個輸入串流關閉時,第一個輸入串流也會關閉。
圖例︰下列程式碼範例中強調顯示的字行說明這兩種狀況︰
public static int readFirstByte(String fileName) {
 int firstByte = -1;
 FileInputStream fis=null;
 BufferedInputStream bis = null;
 try {
  fis = new FileInputStream(fileName);
  bis = new BufferedInputStream(fis);  firstByte = bis.read();
 } catch (FileNotFoundException fnfe) {
  LogUtility.log(fnfe);
 } catch (IOException ioe) {
  LogUtility.log(ioe);
 } finally {
  if (bis!=null){   try {
    bis.close();   } catch (IOException ioe){
    LogUtility.log(ioe);
   }
  }
 }
 return firstByte;
} 

暫行解決方法︰用滑鼠右鍵按一下誤判 (false-positive) 的發現項目,再按一下忽略

不足資訊︰報告 .classpath 檔案的發現項目

摘要︰J2EE 最佳作法程式碼複查產生有關 .classpath 檔案而不是工作台中之資源的發現項目。

說明︰程式碼複查找到二進位類型的問題,而該類型在工作台中沒有對應資源,因為它是包含在外部 JAR 中。

參照︰RFE RATLC00038795

暫行解決方法︰

  1. 程式碼複查詳細資料視圖中,按一下路徑標籤以查看哪種類型在工作台中沒有對應的資源。
  2. 展開路徑資訊,查看發現項目所牽涉的類型名稱,以及可能會有的方法和欄位。

資源過濾器︰不能用於深度規則

摘要︰您在「資源過濾器」頁面中指定程式碼複查期間不要套用選取的深度規則。但是過濾器沒有發生作用,該規則仍然會套用到您指定的檔案。

說明︰在程式碼複查期間,當深度 J2EE 規則遇到不要套用規則的指定檔案時,其運作方式不同。深度規則不能辨識「資源過濾器」頁面中所指定的檔案,但是可以辨識「已排除」頁面中的檔案,在「已排除」頁面中預設會列出 JAR 檔。這些規則可辨識並排除兩種檔案類型(完整的 Servlet 或 JAR 檔)以及忽略所有的其他檔案類型。

暫行解決方法︰
  1. 按一下視窗 > 喜好設定,開啟「喜好設定」視窗。
  2. 在左窗格中,展開 Java™程式碼複查,然後選取已排除
  3. 在「已排除」頁面中,檢視「資源」頁面中列示的檔案並執行下列其中一項步驟︰
    • 如果已經列出要排除的檔案不進行深度 J2EE 規則複查,請按一下確定。您不需要進一步的動作。
    • 如果要排除 Servlet 不進行深度 J2EE 規則複查,請選取 Servlet 的 .java 或 .class 檔,再按一下確定
    • 如果要排除 JAR 檔不進行深度 J2EE 規則複查,請選取 JAR 檔,再按一下確定
如果有列出您不要排除程式碼複查的檔案,請選取該檔案並按一下移除
使用條款 | 意見
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.