Java/Android 編碼規範,從第一行程式碼開始

LeBron_Six發表於2016-08-16

轉載請註明出處:http://blog.csdn.net/yyh352091626/article/details/52219812

談到編碼規範,對於團隊專案開發來說,是很有必要的。如果說程式碼是一種社會行為,那麼程式碼規範可以說是法律,通過法律來約束行為。養成一個良好編碼規範的習慣,一是可以統一程式碼風格;二是便於團隊成員協作開發;三是在review程式碼的時候,更加容易精確地判斷需要修改的地方;四是提高程式碼的可讀性和可維護性,提高編碼效率及程式碼質量。

寫程式碼就像寫文章一樣,邏輯調理清晰,在合適的地方分段,這樣對方看起來也比較舒服。當然,以下一些規範是個人整理出來的一些建議,也並非絕對正確,歡迎提議,不喜勿噴~~

檔案編碼

為了使外掛開發應用能有更好的國際化支援,能夠最大程度的支援中文輸出,則最好使 Java檔案使用UTF-8編碼。換行符統一為windows格式。不管是Eclipse還是AS,把IDE的環境配好是首當其衝的。

排版規範

  • 縮排:也可以理解為程式碼對齊,正常情況下程式碼儲存提交時,應該先讓程式碼按統一樣式對齊,預設對齊樣式在Eclipse中快捷鍵是Ctrl(Command)+Shift+F,AS是Ctrl(Command)+Alt+L;
  • 分界符:如”{“與”}”,一般遵循“{”前面不換行,後面換行,”}”前後都換行;
  • 語句分割:單行程式碼太長的話應考慮分割,例如在 “if” 判斷條件中,如果邏輯判斷的條件太長,分割的原則儘可能是每部分邏輯判斷單獨一行,有利於程式碼可讀性;屬性或者方法之間有較強相關性的,可以放在一起,儘量不要交叉放置。
  • 換行:不要為了怕程式碼太長而不換行,把一堆程式碼混在一起。
    • 一行只寫一條語句,不要多條語句寫在同一行;
    • if、for、do、while、case、switch、default等語句,最好獨自佔一行;
    • 在同一個方法裡面,邏輯或屬性相對獨立的程式碼塊之間應加個換行;
  • 空格:

    • ”,”後面要加個空格;
    • 比較操作符(“>”,”<”,”==”)、賦值操作符(“=”,”+=”),算術操作符(“+”,”%”),邏輯操作符(“&&”,”&”,”||”),位操作符(“<<”,”^”)等雙目操作符的前後面加空格;

      if (value >= MAX_VALUE) {
          a = b + c;
          a *= 2;
          a = b ^ 2; 
      }
      
    • “!”、”~”、”++”、”–”等單目操作符前後不加空格

    • if、for、while、switch等與後面的括號之間應加空格,使if等關鍵字更為突出、明顯。
      if (a >= b && c > d) {
      }

註釋規範

  • 一般情況下,源程式有效註釋亮須在20%以上,註釋不宜過多,也不能太少,註釋須精準易懂,言簡意賅。
  • 檔案註釋:從Java檔案第一行開始,為避免被JavaDoc收集,以 /* 開始,以 */ 結束(JavaDoc收集的註釋內容以 /** 開始),中間每一行前面加一個“*”。一般是一些版權資訊、描述資訊及License。

    /*
     * Copyright (c) 2016, smuyyh@gmail.com All Rights Reserved.
     */
    
  • 類註釋:以 /** 開頭, 在Class、Interface、Enum之前。一般是用一句話描述類用途,也可有作者及時間等資訊,這類資訊不宜過多。
  • 屬性註釋:以 /** 開頭。有時也可以直接寫在一行

    /**
     * 註釋資訊
     */
    private static final int TEXT_COLOR = Color.RED;
    /** 註釋資訊 */
    private static final int BG_COLOR = Color.RED;
    
  • 方法註釋:@since表明從那個版本開始就有這個方法;@exception或throws可能的異常;@deprecated表示不建議使用該方法。異常註釋用@exception或@throws表示,在JavaDoc中二者等價,但推薦用@exception標註Runtime異常,@throws標註非Runtime異常。異常的註釋必須說明該異常的含義及什麼條件下丟擲該異常。

    /**
    * 方法描述
    * @param   [引數1]   [引數1說明]
    * @param   [引數2]   [引數2說明]
    * @return  [返回型別說明]
    * @exception/throws    [違例型別]   [違例說明]
    * @see     [類、類#方法、類#成員]
    * @deprecated   [說明及原因]
    */
    public int method(String arg1, String agr2) throws Exception{
    }
    
  • 對變數的定義和分支語句(條件分支、迴圈語句等),稍微複雜一點的最好編寫註釋,因為這些語句往往是程式實現某一特定功能的關鍵,對於維護人員來說,良好的註釋幫助更好的理解程式,有時甚至優於看設計文件。
  • 對於switch語句下的case語句,如果因為特殊情況需要處理完一個case後需進入下一個case處理,最好在該case語句處理完、下一個case語句前加上明確的註釋,這樣比較清楚程式編寫者的意圖,有效防止無辜遺漏break語句
  • 邊寫程式碼邊註釋,修改程式碼同時修改相應註釋,以保證註釋與程式碼的一致性。更新程式碼須和更新註釋保持同步。
  • 註釋的內容要清晰、明瞭,含義明確,防止註釋二義性,錯誤的註釋不但無益反而有害。
  • 儘量避免在註釋中使用縮寫,特別是不常用縮寫。

命名規範

  • 包名:包名全部小寫,連續的單詞只是簡單地連線起來,不使用下劃線
  • 類名和介面:使用類意義完整的英文描述(如單詞太長,可以考慮簡寫,但儘可能是通俗的簡寫),每個英文單詞的首字母使用大寫、其餘字母使用小寫的大小寫混合法
  • 方法名:第一個單詞的字母使用小寫、剩餘單詞首字母大寫其餘字母小寫
  • 屬性名:規則與方法名類似,但值不能相同。
  • 常量名:使用全大寫的英文描述,英文單詞之間用下劃線分隔開,並且使用final static修飾
  • 準確的確定成員函式的存取控制符號,不是必須使用public屬性的,就使用protected,不是必須使用protected的,就使用private

編碼準則

  • 明確方法功能,精確(而不是近似)地實現方法設計。一個函式僅完成一件功能,即使簡單功能也應該編寫方法實現。雖然為僅用一兩行就可完成的功能去編方法好像沒有必要,但用方法可使功能明確化,增加程式可讀性,亦可方便維護、測試。
  • 明確規定對介面方法引數的合法性檢查應由方法的呼叫者負責還是由介面方法本身負責,預設是由方法呼叫者負責。
  • 明確類的功能,精確(而非近似)地實現類的設計。一個類僅實現一組相近的功能。可以認為是迪米特法則。

    public MessageBean{
        private String message;
    
        public String toString(){
            return"message:" + message;
        }
    }
    
  • DB、IO操作等需要使用結束close()的物件必須在try-catch-finally的finally中close()

    try{
        //... ...
    } catch(IOException e){
        //... ...
    } finally{
        try{
            out.close();
        } catch (IOException e){
            //... ...
        }
    }
    
  • 異常捕獲後,如果不對該異常進行處理,則應該記錄日誌或者ex.printStackTrace()
  • 自己丟擲的異常必須要填寫詳細的描述資訊

    
    throw new IOException("Writing data error!Data:" + data.toString());
  • 注意運算子的優先順序,並用括號明確表示式的操作順序,避免使用預設優先順序

    
    if ((a | b) && (a & c))
         word = (high << 8) | low;
  • 避免使用不易理解的數字,用有意義的標識來代替。涉及物理狀態或者含有物理意義的常量,不應直接使用數字,必須用有意義的靜態變數來代替。

    
    private final static int OPEN = 0;
    private final static int CLOSE = 1;
    private final static int UNKNOW = -1;
    
    if (state = CLOSE){
        state = OPEN;
        //...
    }
    
  • 陣列宣告的時候使用int[] index,有利於提高可讀性,而不要使用int index[]。

其他

  • 在switch 中每個case語句都應該包含break或者return,否則需要進行註釋,避免遺漏。為switch語句提供一個default選項。
  • 不要使用空的for、if、while語句
  • 在運算中儘可能不要減小資料的精度。例如由double轉為float,可能會遺失一部分,降低精度。
  • 避免在if語句中使用等號=進行賦值操作
  • 方法過載的時候,一定要注意方法名相同,避免類中使用兩個非常相似的方法名。
  • 不要覆蓋父類的靜態方法和私有方法,也不要覆蓋父類的屬性。
  • 不要使用兩層巢狀以上的內部類
  • 去掉介面中多餘的定義(不使用public,abstract,static,final等,這是介面中預設的)
  • 儘可能不要定義不會被用到的區域性變數、類私有屬性、類私有方法和方法引數
  • 進行字元轉換的時候應該儘可能的減少臨時變數。
  • 儘可能不要對浮點數進行比較運算,尤其是不要進行==,!=,容易出錯。

歡迎補充~

相關文章