Java開發規範之代碼格式篇(下)

在程序員的世界裏有兩件最討厭的事情,第一件事情是討厭寫代碼註釋,第二件事情是討厭看別人的代碼不寫註釋。雖然這只是個段子,但也反映了當下很多程序員的心聲。下面簡單介紹下代碼規範的重要性,第一,規範的代碼可以促進團隊合作,第二,規範的代碼可以減少bug處理,第三,規範的代碼可以降低維護成本,第四,規範的代碼有助於代碼審查,第五,養成代碼規範的習慣,有助於程序員自身的成長。

本系列文章將整合 阿里巴巴《Java開發手冊》 和  谷歌《Java編程規範》 ,總結Java開發過程的編碼規範,並通過具體編碼案例給出編碼規範的原因,如果總結內容存在問題還望指出。


目錄

6.單行字符數限制和自動行號準則

7.方法參數與逗號空格

8.編碼格式

9.單個方法代碼行數

10.不推薦使用空格使得代碼對齊


上一篇 《Java開發規範之代碼格式篇(上)》 介紹了括號換行和空格等注意事項,本文將繼續介紹字符限制和方法格式等內容。IDEA中可以配置格式化模板,使用快捷鍵ctrl+alt+L即可一鍵格式化代碼,具體路徑請參考 File - Settings - Editor - Code Style - Java - Scheme,點擊齒輪圖標導入配置文件即可,點擊下載idea的Java格式化模板 。

6.單行字符數限制和自動行號準則

Alibaba規約(強制

單行字符數限制不超過120個,超出需要換行,換行時遵循如下原則:

  • 第二行相對第一行縮進4個空格,從第三行開始,不再繼續縮進,參考示例。
  • 運算符與下文一起換行。
  • 方法調用的點符號與下文一起換行。
  • 方法調用中的多個參數需要換行時,在逗號後進行。
  • 在括號前不要換行。

Google規約

一個項目可以選擇一行80個字符或100個字符的列限制,除了下述例外,任何一行如果超過這個字符數限制,必須自動換行。

  • 不可能滿足列限制的行(例如,Javadoc中的一個長URL,或是一個長的JSNI方法參考)。
  • package 和 import 語句。
  • 註釋中那些可能被剪切並粘貼到shell中的命令行。

換行的基本準則是:更傾向於在更高的語法級別處斷開。

  • 如果在 非賦值運算符 處斷開,那麼在該符號前斷開(比如+,它將位於下一行)。注意:這一點與Google其它語言的編程風格不同(如C++和JavaScript)。 這條規則也適用於以下“類運算符”符號:點分隔符(.),類型界限中的&( <T extends Foo & Bar> ),catch塊中的管道符號( catch (FooException | BarException e )。
  • 如果在 賦值運算符 處斷開,通常的做法是在該符號後斷開(比如=,它與前面的內容留在同一行)。這條規則也適用於 foreach 語句中的分號。
  • 方法名或構造函數名與左括號留在同一行。
  • 逗號(,)與其前面的內容留在同一行。

說明:一行代碼的長度很大程度決定了代碼的可讀性,如果長連接代碼又沒有註釋簡直就是噩夢,長代碼需要根據語法進行自動換行。

區別:兩個大廠的行代碼長度有很大不同,Google規約條例更加清晰,明確規定了例外,同時指出自動換行的具體使用場景,但自動換行的標準基本一致。

正例:

StringBuilder sb = new StringBuilder();
// 超過120個字符的情況下,換行縮進4個空格,點號和方法名稱一起換行
sb.append("Jack").append("Ma")...省略部分代碼
.append("123456")...省略部分代碼
.append("123456")...省略部分代碼
.append("123456");

// 運算符和下文一起換行
int result = function1(flag) + function2(flag) + ...省略部分代碼
      + function10(flag);    
            

反例:

StringBuilder sb = new StringBuilder();
// 超過120個字符的情況下,不要在括號前換行
sb.append("Jack").append("Ma")...省略部分代碼...append
("alibaba");
// 參數很多的方法調用可能超過120個字符,不要在逗號前換行
method(args1, args2, args3, ...省略部分代碼
, argsX);

7.方法參數與逗號空格

Alibaba規約(強制

方法參數在定義和傳入時,多個參數逗號後邊必須加空格。

Google規約

在 , : ; 及右括號( ) )後需要使用空格。

說明:方法中參數相隔太緊密看着非常臃腫,一旦參數過於複雜無法區分各參數。

正例:

void method(int args1, String args2, Long args3, Double args4){
    // 省略部分代碼
}

反例:

// 參數之間沒有空格,參數和方法混雜一起無法區分
int result = method(method(args1),method(args2,args3),args4);

8.編碼格式

Alibaba規約(強制

IDE的text file encoding設置爲UTF-8; IDE中文件的換行符使用Unix格式,不要使用Windows格式。

Google規約

源文件編碼格式爲UTF-8。

說明:如果文件格式無法統一,協同工作效率將大大降低。

區別:Alibaba規約特別指出換行符使用Unix格式

正例:

9.單個方法代碼行數

Alibaba規約(推薦

單個方法的總行數不超過80行。

Google規約

未定義類似規範

說明:方法內的代碼行數過多很容易引用代碼可讀性,可以將部分代碼重寫整合爲另外一個方法再調用。

10.不推薦使用空格使得代碼對齊

Alibaba規約(推薦

  • 沒有必要增加若干空格來使變量的賦值等號與上一行對應位置的等號對齊。
  • 不同邏輯、不同語義、不同業務的代碼之間插入一個空行分隔開來以提升可讀性。任何情形,沒有必要插入多個空行進行隔開。

Google規約

對於通過增加可變數量的空格來使某一行的字符與上一行的相應字符對齊的方式不做要求,這是允許的(而且在不少地方可以看到這樣的代碼),但Google編程風格對此不做要求。即使對於已經使用水平對齊的代碼,我們也不需要去保持這種風格。

說明:對齊可增加代碼可讀性,但它爲日後的維護帶來問題。考慮未來某個時候,我們需要修改一堆對齊的代碼中的一行。 這可能導致原本很漂亮的對齊代碼變得錯位。很可能它會提示你調整週圍代碼的空白來使這一堆代碼重新水平對齊(比如程序員想保持這種水平對齊的風格), 這就會讓你做許多的無用功,增加了reviewer的工作並且可能導致更多的合併衝突。

示例:

//註釋未對齊,變量定義未對齊
private int flag; // this is fine
private Color color; // this too
int one = 1;
long two = 2L;
float three = 3F;
StringBuilder sb = new StringBuilder();

//註釋對齊,增加額外工作量
private int x;       // permitted, but future edits
private Color color; // may leave it unaligned

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章