命名
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 {
// ...
}