本身整理的java編程規範

前言

推薦Google的Java編碼規範英文版:html

http://google-styleguide.googlecode.com/svn/trunk/javaguide.htmljava

雖然這篇文章的英文很簡單,可是最近發現有人翻譯了這篇文章,因此專門推薦一下:算法

http://hawstein.com/posts/google-java-style.html數據庫

正文

1、命名規範微信

已經被使用的常量,不要從新定義數據結構

約定俗成的常量含義,不要從新定義。app

努力避免硬編碼。ide

每一個模塊,建議有獨立的常量類。svn

方法名都以lowerCamelCase風格編寫函數

類名都以UpperCamelCase風格編寫

參數名以lowerCamelCase風格編寫

局部變量名以lowerCamelCase風格編寫,比起其它類型的名稱,局部變量名能夠有更爲寬鬆的縮寫。

雖然縮寫更寬鬆,但仍是要避免用單字符進行命名,除了臨時變量和循環變量。

即便局部變量是final和不可改變的,也不該該把它示爲常量,天然也不能用常量的規則去命名它。

2、函數/方法

public 函數(方法),對象參數 必需要處理參數爲null的狀況,

private 函數,對象參數 能夠不用處理參數爲null的狀況(依狀況而定)

方法名都以lowerCamelCase 開頭單詞小寫後面駝峯風格編寫

方法長度不超過50行

3、嵌套層級不要超過3層。

for,while,if ,switch 等。

方法中條件不成立直接return,再也不向下執行

如:

    public int xxx (String userId, String password, String email){

       if(StringUtils.isEmpty(userId) || StringUtils.isEmpty(email)

                ||StringUtils.isEmpty(password)){

            return null;

        }

        UserEntity ue = EntityProxy.OBJ.get(userId, UserEntity.class);

        if(ue == null){

            return null;

        }

     ……...

  }

避免前套層次過深,建議不超過三層

4、代碼結構

1垂直

如下狀況須要使用一個空行:

類內連續的成員之間:字段,構造函數,方法,嵌套類,靜態初始化塊,實例初始化塊。
例外:兩個連續字段之間的空行是可選的,用於字段的空行主要用來對字段進行邏輯分組。
在函數體內,語句的邏輯分組間使用空行。
類內的第一個成員前或最後一個成員後的空行是可選的(既不鼓勵也不反對這樣作,視我的喜愛而定)。
要知足本文檔中其餘節的空行要求。
多個連續的空行是容許的,但沒有必要這樣作(咱們也不鼓勵這樣作)。
一個類的整體行數儘可能控制在400行左右(不超過一千行)。

5、資源處理

EntityTransaction tranx = null;

    try {

      // 獲取數據庫事務

      tranx = em.getTransaction();

      // 開始事務過程

      if(!tranx.isActive()){

        tranx.begin();

      }

      // 保存實體

      Query query = em.createNamedQuery(jpqlName);

      if(params!=null && !params.isEmpty()){

        params.forEach((k,v)->{

          query.setParameter(k, v);

        });

      }

      query.executeUpdate();

      // 提交事務

      tranx.commit();

    } catch (Exception ex) {

      // 記錄錯誤日誌

      DaoLog.LOG.error("刪除對象異常");

      DaoLog.LOG.error(ex.getMessage(), ex);

      if(tranx != null){

        tranx.rollback();

      }

      return false;

    }finally{

      if(tranx !=null && tranx.isActive()){

        tranx.commit();

      }
      em.close();//注意 用完必定要釋放

    }

6、異常處理

比較底層的處理單元,建議拋出異常。

業務處理模塊,處理異常的同時,異常必需要加日誌!最好有finally處理。

方法返回結果,不要使用異常方式。

7、相同的代碼快,不要處處出現或者重複出現!

相同代碼提取處理,讓代碼可重用。

8、註釋

一、源文件註釋

源文件註釋採用 /* …… /,在每一個源文件的頭部要有必要的註釋信息,包括:文件名;文件編號;版本號;做者;建立時間;文件描述包括本文件歷史修改記錄等。中文註釋模版:

/**

  • 文 件 名 :

    • CopyRright (c) 2015-xxxx:

  • 文件編號:

  • 創 建 人:

  • 日 期:

  • 修 改 人:

  • 日 期:

  • 描 述:

  • 版 本 號:

*/

二、類(模塊)註釋:

類(模塊)註釋採用 /* …… /,在每一個類(模塊)的頭部要有必要的註釋信息,包括:工程名;類(模塊)編號;命名空間;類能夠運行的JDK版本;版本號;

做者;建立時間;類(模塊)功能描述(如功能、主要算法、內部各部分之間的關係、該類與其類的關係等,必要時還要有一些如特別的軟硬件要求等說明);

主要函數或過程清單及本類(模塊)歷史修改記錄等。

三、接口註釋:

接口註釋採用 /* …… /,在知足類註釋的基礎之上,接口註釋應該包含描述接口的目的、它應如何被使用以及如何不被使用,塊標記部分必須註明做者和版本。

在接口註釋清楚的前提下對應的實現類能夠不加註釋。

四、構造函數註釋:

構造函數註釋採用 /* …… /,描述部分註明構造函數的做用,不必定有塊標記部分。

五、函數註釋:

函數註釋採用 /* ……/,在每一個函數或者過程的前面要有必要的註釋信息,包括:函數或過程名稱;功能描述;

輸入、輸出及返回值說明;調用關係及被調用關係說明等。函數註釋裏面能夠不出現版本號(@version)。

六、方法註釋:

方法註釋採用 /* …… /,普通成員方法要求說明完成什麼功能,參數含義是什麼且返回值什麼;另外方法的建立時間必須註釋清楚,爲未來的維護和閱讀提供寶貴線索。

七、方法內部註釋:

控制結構,代碼作了些什麼以及爲何這樣作,處理順序等,特別是複雜的邏輯處理部分,要儘量的給出詳細的註釋。

八、全局變量註釋:

要有較詳細的註釋,包括對其功能、取值範圍、哪些函數或者過程存取以及存取時注意事項等的說明。

九、局部(中間)變量註釋:

主要變量必須有註釋,無特別意義的狀況下能夠不加註釋。

十、實參/參數註釋:

參數含義、及其它任何約束或前提條件。

10、if else 條件含義要明確

如:

if (isOk) { //isOK 如何

  return Response.status(200).entity(resp.getData()).build();

} else {

  return Response.status(200).entity(resp.getErrorInfo()).build();

}

11、邏輯控制,不要瀑布流!

儘可能把條件不知足的狀況寫在某個邏輯塊的前面(好比方法的最前面),讓不知足條件的狀況快速失敗,讓代碼整理結構清晰,可讀。

12、巧用構造函數構造者builder模式:

構造方法:UserDetailInfo userinfo = new UserDetailInfo(user);

builder方式:
Map<String, Object> oparams = ImmutableMap.<String, Object> builder()
            .put("appid", ConfigUtil.APPID)// 服務號的應用號
            .put("body", WeixinConstant.PRODUCT_BODY)// 商品描述
            .put("mch_id", ConfigUtil.MCH_ID)// 商戶號 ?
            .put("nonce_str", PayCommonUtil.CreateNoncestr())// 16隨機字符串(大小寫字母加數字)
            .put("out_trade_no", orderId)// 商品訂單號
            .put("total_fee", "1")// 銀行幣種
            .put("spbill_create_ip", ip)// IP地址
            .put("notify_url", ConfigUtil.NOTIFY_URL) // 微信回調地址
            .put("trade_type", "APP")// 支付類型 app
            .build();

十3、數據結構與業務處理(算法)分開

如: MVC MVVM 均可以參考

十4、關鍵業務添加日誌記錄

LoggerUtils.loginLogger.info(String.format("xx用戶[%s] at %s 登錄xxx app", sb.toString(),DateUtils.getDateTime()));

最後囉嗦一句 :寫代碼一個類寫完了 去掉無效的引用,也就是import的時候。

補充:養成好習慣,祝你們寫好代碼,迎娶白富美,走上人生巔峯!

thx

相關文章
相關標籤/搜索