熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

JBuilder 2005代碼審查功能體驗(2)

2013-11-23 19:23:41  來源: Java核心技術 

  命名風格
  取消不良命名習慣
  
  良好的命名風格在遵守Java命名語法之上對命名提出了更高的要求良好的命名風格必須遵守以下的命名規則
  
  ) 類或接口必須以大寫字母打頭
  
  ) 方法屬性成員變量局部變量以小寫字母打頭且不以_$打頭
  
  ) 常量的所有字母都大寫
  
  ) 異常類以Exception結尾
  
  良好命名對應Naming Style下的Naming Conventions設置項
  
  建立和國際接軌的包名
  
  包名應該用頂級域名打頭如comorgedu等或者用國家代碼如cnru等
  
  一般公司和組織都對包名前兩級都有嚴格的規則如IBM公司的類以comibm打頭apache以orgapache打頭第三級才是具體的項目或產品名稱這樣的包命名就象三維網的URL命名一樣已經成為了一種國際通用的准則對此沒有作出嚴格規定的公司開發負責人應該推動建立起符合這一命名規則的規范
  
  該審查項默認情況下沒有激活可以通過Naming Style下的Package Name的設置項激活
  
  避免用過於簡單的變量名
  
  除了循環體中的臨時變量及一些沒有特殊意義的常見數據類型應該盡量避免使用一個字符作為變量那些無特殊意義且常見的數據類型所選取的單字符變量名必須按表進行命名
  
  表 變量本身無意義的常見數據類型允許的單字符變量
  
  此外為了減少潛在的沖突避免不必要的混淆不允許以大寫域名或國家代碼作變量名
  
  代碼清單 取有意義的變量名
  
   void method(double d)
   {
    int i;
    Exception e;
    char s;//應該改為c
    Object f;//應該改為o
    String k;//應該改為s
    Object UK;//和英國國家代碼相同應改為其他的名字如ukObj
    Object COM;//和域名相同應改為其他的名字如obj_
   }
  
  該審查項在默認情況下沒有激活可以通過Naming Style下的Use Conventional Variable Names的設置項激活
  
  潛在錯誤審查
  聚焦switch
  
  由於switch流程控制語句語法的特殊性編寫程序時需要特別注意否則將會埋下禍根JBuilder從以下個方面對switch進行審查
  
  ) 有無對前面沒有break語句的case從句作標識根據Sun編碼慣例程序入口點從一個case進入直接到達下一個case代碼段即前一個case沒有對應的break語句時在跨過的地方必須給出一個顯示的注釋表示是特定流程控制的要求而非無意遺漏來看下面的代碼
  
  代碼清單 沒有break的case從句
  
   switch (c) {
    case +:
     
     break;
    case :
     
    case n:
     
    case : case \t:
    
    break;
   }
  
  假設在代碼清單的第行之前是因為疏忽而遺漏了一個break語句行之前是邏輯需要而故意不加break語句則將代碼更改為
  
  代碼清單 更正的switch代碼
  
   switch (c) {
    case +:
     
     break;
    case :
    
     break;
    case n:
     
    //繼續運行到下面
    case : case \t:
     
     break;
   }
  
  該審查內容對應於Possible Errors下的Break Statement is Missing before Case clause設置項
  
  ) 在switch中出現非case的標簽在Java語句中有兩個標簽即case分支標簽另一個則是語句標簽如果case分支標簽語句誤刪或遺漏了case關鍵字則case分支標簽將變成語句標簽而編譯器無法識別這個錯誤
  
  代碼清單 case分支中缺少case而使標簽發生質變
  
   public class CaseLabel
   {
    /**點*/
    public static final int POINT = ;
    /**線*/
    public static final int LINE = ;
    /**多邊形*/
    public static final int POLYGON = ;
  
   public String getFigureType (int kind)
    {
     String tempName = null;
     switch (kind)
     {
      case POINT:
       LINE://該語句缺少case編譯器將其作為語句標簽處理並不會發生語法錯誤
       //但該方法傳入常量LINE時將轉到default分支中而非到達這晨
       //應該將該行語句更改為case LINE:
       tempName = POINT and LINE;
       break;
      case POLYGON:
       tempName = POLYGON;
       break;
      default:
       tempName = UNDEFINE;
     }
     return tempName;
    }
   }
  
  該審查內容對應於Possible Errors下的NonCase Label in Switch statement設置項
  
  ) 有錯誤嫌疑的break和continuebreak和continue用於switch和循環中的跳轉控制break用於提前結束循環以及從switch中退出break的這種多態性使得在循環體中內嵌switch語句時常會帶來一些隱患即開發者本希望退出外層循環結果卻只退出內層的switch語句而已JBuilder 對這項內容的審查包括以下方面
  
  switch內嵌於循環體中且case從句中包含了不位於分支塊最後位置的break語句
  switch內嵌於循環體中且case從句既使用了break又使用了continue但兩者的效果卻是一樣的
  break或continue語句中使用了不必要的語句標簽
  
  請看下面的代碼
  
  代碼清單 有錯誤嫌疑的break和continue
  
   void scan(char[] arr)
   {
    loop:
    for (int i = ; i < arrlength; i++)
    {
     switch (arr[i])
     {
      case :case :case :case :case :
      //~的數字
     case :case :case :case :case :
     {
      if (processDigit(arr[i]))
      {
       continue loop; //loop語句標簽沒有必要
      }
      else
      {
       break; // 該break不會結束for循環應該使用break loop才可結束循環
      }
     }
     case :case \t:
     {
      processWhitespace(arr[i]);
      continue; // 應該使用break而非continue
     }
     default:
      processLetter(arr[i]);
      break;
    }
   }
  
  該審查內容對應於Possible Errors下的Suspicious Break/Continue設置項
  
  避免對浮點值進行等值邏輯判斷
  
  浮點數都是一定精度的數據由於內部表示的誤差往往字面上相同的兩個浮點數其內部表示也不完全相同故此應避免對浮點值數進行等值邏輯判斷而應采用邏輯比較判斷
  
  代碼清單 語句中包含浮點等值判斷
  
   void calc(double limit)
   {
    if (limit == )//應改為通過和較小值比較來判斷如if(Mathabs(limit) < )
    {
     Systemoutprintln( the floatpoint number is exactly );
    }
   }
  
  該審查內容默認未激活可以通過Possible Errors下的Suspicious Break/Continue設置項來激活審查
  
  添加()清晰化復雜的表達式
  
  寫復雜的表達式時不應過度依賴運算操作符的計算優先順序而應養成使用()的好習慣當一個邏輯表達式由多個邏輯運算組成時應該用()劃分不同的部分
  
  代碼清單 用括號清晰化表達式
  
   boolean a b c;
  
   if (a || b && c) //應該替換成if ((a || b) && c)
   {
  
   }
  
  該審查內容默認未激活可以通過Possible Errors下的Mixing Logical Operators Without Parentheses設置項來激活審查
  
  字符串比較
  
  Java初學者一個常犯的錯誤是使用==!=對字符串進行等值邏輯判斷使用==將判斷兩者否是指向相同的對象引用而非判斷兩者是否具有值應該使用equals()替代
  
  代碼清單 用equals()替換==
  
   public boolean equals(String s String s)
   {
    return s == s; //應改為return sequals(s);
   }
  
  該審查內容對應於Possible Errors下的Use equals Instead of = =設置項
  
  規避各種畫蛇添足
  將布爾變量和布爾值比較
  
  沒有必要將布
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26776.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.