【程式設計素質】Java編碼約定

兔兔西發表於2018-09-29

優秀的程式碼勝過冗長的文件。

1,命名規範

駝峰風格:不用下劃線,各個單詞拼一起,首字母大寫以區別。變數名和方法名首字母小寫,類名首字母大寫。
統一、達意、簡潔、英文。

1.1 類名命名

首字母大寫、駝峰風格。
字尾:類名往往用不同的字尾表達額外的意思,如下表。

字尾名 意義
Service 表明這個類是個服務類,裡面包含了給其他類提同業務服務的方法
Impl 這個類是一個實現類,而不是介面
Inter 這個類是一個介面
Dao 這個類封裝了資料訪問方法
Action 直接處理頁面請求,管理頁面邏輯了類
Listener 響應某種事件的類
Event 這個類代表了某種事件
Servlet 一個Servlet
Factory 生成某種物件工廠的類
Adapter 用來連線某種以前不被支援的物件的類
Job 某種按時間執行的任務
Wrapper 這是一個包裝類,為了給某個類提供沒有的能力
Bean 這是一個POJO

POJO(Plain Ordinary Java Object):簡單的Java物件,實際就是普通JavaBeans,是為了避免和EJB混淆所創造的簡稱。實現了一種規範的Java物件。
EJB(Enterprise JavaBean):是一組"功能"JavaBean的集合。這一組JavaBean組合起來實現了某個企業組的業務邏輯。這裡的一組JavaBean不是亂組合的,它們要滿足能實現某項業務功能的搭配。

1.2 方法名

首字母小寫,駝峰命名。
動詞在前,如 addOrder()。
字首:動詞字首往往表達特定的含義,如下表。

字首名 意義
create 建立
delete 刪除
add 建立,暗示新建立的物件屬於某個集合
remove 刪除
init或則initialize 初始化,暗示會做些諸如獲取資源等特殊動作
destroy 銷燬,暗示會做些諸如釋放資源的特殊動作
open 開啟
close 關閉
read 讀取
write 寫入
get 獲得
set 設定
prepare 準備
copy 複製
modity 修改
calculate 數值計算
do 執行某個過程或流程
dispatch 判斷程式流程轉向
start 開始
stop 結束
send 傳送某個訊息或事件
receive 接受訊息或時間
respond 響應使用者動作
find 查詢物件
update 更新物件

1.3 域(field)名

1.3.1 靜態常量

全大寫用下劃線分割,如:

public static find String ORDER_PAID_EVENT = "ORDER_PAID_EVENT";

1.3.2 列舉

全大寫,用下劃線分割,如

public enum Events {
    ORDER_PAID,
    ORDER_CREATED
}

1.3.3 其他、區域性變數名

首字母小寫,駱駝法則,如:

public String orderName;

2,程式設計風格

用空格字元縮排原始碼,不要用tab,每個縮排4個空格。

2.1 原始檔編碼

原始檔使用utf-8編碼,結尾用\n 分格。
如果原始檔不是以“回車換行”結束,則目標檔案將會多出2位元組。

\r 回車 告訴打字機把列印頭定位在左邊界;
\n 換行 告訴打字機把紙向下移一行.
剛開始儲存器很貴,一些科學家認為在每行結尾加兩個字元太浪費了,加一個就可以。於是,就出現了分歧。
作業系統的不同,換行符操也不同:
/r Mac
/n Unix/Linux
/r/n Windows
一個直接後果是,Unix/Mac系統下的檔案在Windows裡打 開的話,所有文字會變成一行;而Windows裡的檔案在Unix/Mac下開啟的話,在每行的結尾可能會多出一個^M符號。

2.1.1 原始檔結構

一個原始檔包含(按順序地):

許可證或版權資訊(如有需要)
package語句
import語句
一個頂級類(只有一個)

以上每個部分之間用一個空行隔開。

2.2 行寬

行寬度不要超過130。

2.3 包的匯入

刪除不用的匯入,儘量不要使用整個包的匯入。在eclipse下經常使用快捷鍵 ctrl+shift+o 修正匯入。mac:control+option+o

2.3.1 順序和間距

import語句可分為以下幾組,按照這個順序,每組由一個空行分隔:

所有的靜態匯入獨立成組
com.google imports(僅當這個原始檔是在com.google包下)
第三方的包。每個頂級包為一組,字典序。例如:android, com, junit, org, sun
java imports
javax imports

組內不空行,按字典序排列。

2.4 類格式

2.5 域格式

每行只能宣告一個域。
域的宣告用空行隔開。

2.5 方法格式

2.6 程式碼塊格式

2.6.1 縮排風格

大括號的開始在程式碼塊開始的行尾,閉合在和程式碼塊同一縮排的行首.

2.6.2 表示分割時用一個空格

if ( a > b ) {
    //do something here
};

a + b = c;
b - d = e;
return a == b ? 1 : 0;

call(a, b, c);

2.6.3 空行的使用

空行可以表達程式碼在語義上的分割,註釋的作用範圍,等等。將類似操作,或一組操作放在一起不用空行隔開,而用空行隔開不同組的程式碼。

3,註釋規範

少而精。
註釋要和程式碼同步,過多的註釋會成為開發的負擔註釋不是用來管理程式碼版本的,如果有程式碼不要了,直接刪除,svn會有記錄的,不要註釋掉,否則以後沒人知道那段註釋掉的程式碼該不該刪除。

3.1 Java Doc

表明類、域和方法等的意義和用法等的註釋,要以javadoc的方式來寫。Java Doc是個類的使用者來看的,主要介紹 是什麼,怎麼用等資訊。凡是類的使用者需要知道,都要用Java Doc 來寫。非Java Doc的註釋,往往是個程式碼的維護者看的,著重告述讀者為什麼這樣寫,如何修改,注意什麼問題等。 如下:

/**
* This is a class comment
*/
public class TestClass {
    /**
    * This is a field comment
    */
    public String name;

    /**
    * This is a method comment
    */
    public void call() {

    }
}

3.2 塊級別註釋

3.3.1 塊級別註釋,單行時用 //, 多行時用 /* … */。

3.3.2 較短的程式碼塊用空行表示註釋作用域

3.3.3 較長的程式碼塊要用

/*------ start: ------*/
和
/*-------- end: -------*/
包圍

舉例:

/*----------start: 訂單處理 ------- */
//取得dao
OrderDao dao = Factory.getDao("OrderDao");

/* 查詢訂單 */
Order order = dao.findById(456);

//更新訂單
order.setUserName("uu");

orderDao.save(order);
/*----------end: 訂單處理 ------- */

3.3.4 可以考慮使用大括號來表示註釋範圍

使用大括號表示註釋作用範圍的例子:

/*----------訂單處理 ------- */
{
    //取得dao
    OrderDao dao = Factory.getDao("OrderDao");
    /* 查詢訂單 */
    Order order = dao.findById(456);
    //更新訂單
    order.setUserName("uu");
    orderDao.save(order);
}

3.4 行內註釋

行內註釋用 // 寫在行尾

4,其他程式設計注意

4.1 使用log而不是System.out.println()

log可以設定級別,可以控制輸出到哪裡,容易區分是在程式碼的什麼地方列印的,而System.out.print則不行。而且,System.out.print的速度很慢。所以,除非是有意的,否則,都要用log。至少在提交到svn之前把System.out.print換成log。

4.2 每個if while for等語句,都不要省略大括號{}

4.3 善用TODO:

在程式碼中加入 //TODO: ,大部分的ide都會幫你提示,讓你知道你還有什麼事沒有做。

4.4 在需要留空的地方放一個空語句或註釋,告訴讀者,你是故意的

比如:

if (!exists(order)) {
;
}

或:

if (!exists(order)) {
    //nothing to do
}

4.5 減少程式碼巢狀層次

程式碼巢狀層次達3層以上時,一般人理解起來都會困難。
減少措施:

  1. 合併條件
  2. 利用 return 以省略後面的else
  3. 利用子方法

4.6 程式職責單一

讓程式單元的職責單一,可以使你在編寫這段程式時關注更少的東西,從而降低難度,減少出錯。

4.7 變數的宣告,初始化和被使用盡量放到一起

比方說如下程式碼:

int orderNum= getOrderNum();
//do something withou orderNum here
call(orderNum);

上例中的註釋處代表了一段和orderNum不相關的程式碼。orderNum的宣告和初始化離被使用的地方相隔了很多行的程式碼,這樣做不好,不如這樣:

//do something withou orderNum here
int orderNum= getOrderNum();
call(orderNum);

4.8 縮小變數的作用域

能用區域性變數的,不要使用例項變數,能用例項變數的,不要使用類變數。變數的生存期越短,意味著它被誤用的機會越小,同一時刻程式設計師要關注的變數的狀態越少。
例項變數和類變數預設都不是執行緒安全的,區域性變數是執行緒安全的。

4.9 儘量不要用引數來帶回方法運算結果

引數作用是儲存數值。職責單一原則,引數儘量不做返回值。

  1. 包名使用小寫字母
  2. import不要使用萬用字元
    即,不要出現類似這樣的import語句:import java.util.*;
  3. 列長限制
    一個專案可以選擇一行120個字元的列限制,超出列長限制時換行,換行時縮排至少4個空格,縮排不要用tab。
  4. 註釋
    註釋應少而精,程式碼的關鍵處應該有註釋, 註釋不能誤導讀者。
  5. 變數宣告
    每次只宣告一個變數,不要使用組合宣告,比如int a, b;
    需要變數時才宣告,並儘快進行初始化。
  6. 命名約定
    命名應該:見名知意、簡潔,避免拼音與英文混用。
    命名風格:
    類名以UpperCamelCase風格編寫
    非常量欄位名、方法名、引數名、區域性變數名以lowerCamelCase風格編寫
    常量名以CONSTANT_CASE風格編寫
  7. 類成員順序
    每個類應該以某種邏輯去排序它的成員,維護者應該要能解釋這種排序邏輯。比如,新的方法不能總是習慣性地新增到類的結尾。
  8. 慎用System.out.println()
    使用log而不是System.out.println()
  9. 使用大括號(即使是可選的)
    大括號與if, else, for, do, while語句一起使用,即使只有一條語句(或是空),也應該把大括號寫上。
  10. 減少程式碼巢狀
    程式碼巢狀層次達3層以上時,一般人理解起來都會困難。
    減少巢狀的方法有很多:(1)合併條件;(2)利用return以省略後面的else;(3)使用子方法
  11. 異常處理
    捕獲的異常不能忽視,典型的響應方式是列印日誌

本文來自 蘇州-微塵 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/wangnan537/article/details/49965703?utm_source=copy

相關文章