命名
1.命名的準則是準確的表達意義。對于不同作用域的命名,可以選擇不同的長度。一般來說,作用域小的變量(比如臨時變量),可以選擇短一些的命名方式。
2.可以借助類的信息來簡化屬性、函數的命名,利用函數信息來簡化函數參數的命名。
class User{
String name; // not userName
String address; // not userAddress
}
3.命名要可讀、可搜索,不要使用生僻單詞來命名。
4.接口有兩種命名方式:一種是接口帶前綴“I”;另一種是在實現(xiàn)類中帶后綴“Impl”。抽象類也有兩種方式,一種是帶前綴“Abstract”,一種是不帶。重點是項目中要統(tǒng)一。
注釋
1.注釋要包含三個方面:做什么、為什么、怎么做。對于復雜類和接口,還需要寫明如何用。
2.注釋并非越多越好。類和函數一定要寫注釋,函數內部注釋相對少一些,一般都靠好的命名、提煉函數、解釋性變量、總結性注釋來提高代碼可讀性。
類中成員排列順序
在Google Java規(guī)范中,依賴類按照字母序從小到大排列。類中先寫成員變量后寫函數。成員變量之間或函數之間,先寫靜態(tài)成員變量或函數,后寫普通變量或函數,按照作用域大小依次排列。
把代碼分割為單元塊
當代碼邏輯比較復雜時,建議將其提煉為類或者函數,但是如果提煉出的函數只有兩三行,則不建議。
避免函數參數過多
函數包含3、4個參數是可接受的,大于5個時,會影響到代碼可讀性。解決方法有兩種:
- 考慮函數是否職責單一,是否需要將一個函數拆分為多個函數;
- 將函數參數封裝為對象;
不用函數參數控制邏輯
不要在函數中用boolean類型的標識參數來控制內部邏輯,這違背了單一職責原則和接口隔離原則,建議將其拆分為兩個函數。
public void buyCourse(long userId, long courseId, boolean isVip);
// 將其拆分成兩個函數
public void buyCourse(long userId, long courseId);
public void buyCourseForVip(long userId, long courseId);
移除過深嵌套層次
代碼嵌套過深往往因為if-else、switch-case、for循環(huán)過度嵌套導致。建議嵌套不要超過兩層,難以理解。解決方法:
- 去掉(合并)多余if或else;
- 使用continue、break、return,提前退出嵌套;
- 調整執(zhí)行順序以減少嵌套;
- 將部分嵌套邏輯封裝成函數調用;
學會使用解釋性變量
1.用常量取代魔法數字。
public double CalculateCircularArea(double radius) {
return (3.1415) * radius * radius;
}
// 常量替代魔法數字
public static final Double PI = 3.1415;
public double CalculateCircularArea(double radius) {
return PI * radius * radius;
}
2.使用解釋性變量解釋復雜表達式。
if (date.after(SUMMER_START) && date.before(SUMMER_END)) {
// ...
} else {
// ...
}
// 引入解釋性變量后邏輯更加清晰
boolean isSummer = date.after(SUMMER_START)&&date.before(SUMMER_END);
if (isSummer) {
// ...
} else {
// ...
}