如何提高代碼的可閱讀行
好的代碼書寫規(guī)范會(huì)讓你在閱讀的時(shí)候很清晰明了的知道業(yè)務(wù)的邏輯和處理流程蜕青。當(dāng)你閱讀高質(zhì)量的代碼時(shí)候,可以讓你心曠神怡狮荔。哇還可以這么寫憾朴,這樣寫簡(jiǎn)潔又大方,命名規(guī)范又容易理解.....
軟件系統(tǒng)生命周期80%的時(shí)間都是閱讀和維護(hù)代碼热幔,可讀性好的代碼會(huì)讓我們?cè)诰S護(hù)的時(shí)候事半功倍乐设,提高工作效率,更快的梳理出需要改動(dòng)的地方绎巨〗校可能當(dāng)開始做的時(shí)候不習(xí)慣,覺得麻煩场勤,但是當(dāng)我們堅(jiān)持一段時(shí)間戈锻,效果就會(huì)顯而易見。
下面我總結(jié)幾方面的在提高代碼可讀性方面我們能做到或者加以改進(jìn)的地方和媳。
1.變量格遭,方法類的命名要表達(dá)清晰明了
在方便變量命名的時(shí)候我們使用的單詞不要過于簡(jiǎn)單,用一些有表達(dá)力的單詞留瞳。示例如下
單詞 | 可替代單詞 |
---|---|
send | dispatch deliver distribute |
find | search locate extract |
start | launch create begin |
make | add new generate create build set up |
在做循環(huán)迭代器的時(shí)候拒迅,避免使用i,j,k等過于簡(jiǎn)單的變量命名,userIndex撼港、memberIndex這種名字會(huì)更有表達(dá)力坪它。因?yàn)檠h(huán)層次越多,代碼越難理解帝牡,有表達(dá)力的迭代器名字可讀性會(huì)更高往毡。
為名字添加形容詞等信息能讓名字更具有表達(dá)力,但是名字也會(huì)變長(zhǎng)靶溜。名字長(zhǎng)短的準(zhǔn)則是:作用域越大开瞭,名字越長(zhǎng)。因此只有在短作用域才能使用一些簡(jiǎn)單名字罩息。
2.重視代碼規(guī)范
在定義類的成員變量的時(shí)候嗤详,通過加前綴來區(qū)分不同作用域的代碼。
例如
- 加s表示靜態(tài)成員變量
- 加m表示私有成員變量
- 靜態(tài)常量大寫瓷炮,單詞之間用_區(qū)分
- 命名遵循大小駝峰原則
private static MyClass sSingleton;
int mPackagePrivate;
private int mPrivate;
3.名字不能有歧義
起完名字要思考一下別人會(huì)對(duì)這個(gè)名字有何解讀葱色,會(huì)不會(huì)誤解了原本想表達(dá)的含義。
布爾相關(guān)的命名加上 is娘香、can苍狰、should办龄、has 等前綴,可以方便的看到判斷結(jié)果淋昭。
4.代碼格式規(guī)范
代碼縮進(jìn)可以增強(qiáng)代碼的可閱讀性俐填,代碼縮進(jìn)一般為4個(gè)空格。
-
如果句子過長(zhǎng)需要換行翔忽,或者我們?cè)谑褂肦xJava等框架的鏈?zhǔn)秸{(diào)用的時(shí)候英融,建議使用 以下規(guī)范。
第二行相對(duì)第一行縮進(jìn) 4 個(gè)空格歇式,從第三行開始驶悟,不再繼續(xù)縮進(jìn),參考示例贬丛。
運(yùn)算符與下文一起換行撩银。
方法調(diào)用的點(diǎn)符號(hào)與下文一起換行给涕。
方法調(diào)用時(shí)豺憔,多個(gè)參數(shù),需要換行時(shí)够庙,在逗號(hào)后進(jìn)行恭应。
client.newCall(new Request.Builder()
.url(address)
.build())
.enqueue(new Callback() {
@Override
ublic void onFailure(Call call, IOException e) {
}
5.注釋
注釋本應(yīng)作為代碼不可分割一部分,因?yàn)樗菍?duì)代碼最直觀最詳細(xì)的說明耘眨,你可以把設(shè)計(jì)思路昼榛、用法和注意事項(xiàng)都寫在注釋里面,這樣無論是對(duì)你自己還是對(duì)別人都是有好處的剔难,它讓你能在很久沒有接觸代碼的時(shí)候快速回憶起當(dāng)初的想法胆屿,能讓閱讀源碼的人更快理解你的思路,讓使用的人更清楚用法偶宫。
復(fù)雜邏輯寫清楚實(shí)現(xiàn)的步驟
方法注釋清楚方法的作用
6. 使用 Builder 代替構(gòu)造方法
當(dāng)某個(gè)類的構(gòu)造方法有很多個(gè)參數(shù)或者有很多個(gè)重載版本時(shí)非迹,我們應(yīng)該考慮為這個(gè)類寫一個(gè) Builder,通過這個(gè) Builder 創(chuàng)建配置并創(chuàng)建該類的實(shí)例纯趋。
假設(shè)我們有個(gè)類用來代表一個(gè)矩形憎兽,它的名字叫做 Rectangle,它的代碼如下所示:
public class Rectangle {
private int mId;
private int mWidth;
private int mHeight;
private int mStroke;// 邊框?qū)挾?
public Rectangle(int id) { ... }
public Rectangle(int id, int width, int height) { ... }
public Rectangle(int id, int width, int height, int stroke) { ... }
}
于是我們就可能看見這樣的代碼 new Rectangle(1, 1, 1, 1)吵冒,這樣的代碼可讀性是很差的纯命,因?yàn)槲覀儫o法一眼就看出這個(gè)矩形設(shè)置了哪些信息,還需要去查閱下相關(guān)的 API 文檔痹栖。此外亿汞,當(dāng)我們需要?jiǎng)?chuàng)建一個(gè)只需指定 id 和 stroke 的矩形的時(shí)候,我們就必須再寫一個(gè)新的構(gòu)造方法揪阿,當(dāng)一個(gè)對(duì)象的屬性較多的時(shí)候疗我,構(gòu)造方法的重載版本就可能變得非常的多匙铡,維護(hù)成本也隨之提高。如果我們?yōu)?Rectangle 創(chuàng)建一個(gè) Builder碍粥,通過 Builder 創(chuàng)建矩形實(shí)例的過程就會(huì)變得靈活而清晰很多:
public class Rectangle {
private int mId;
private int mWidth;
private int mHeight;
private int mStroke;// 邊框?qū)挾?
private Rectangle(Builder builder) {
mId = builder.id;
mWidth = builder.width;
mHeight = builder.height;
mStroke = builder.stroke;
}
public static class Builder {
private int id;
private int width;
private int height;
private int stroke;// 邊框?qū)挾?
public Builder(int id) {
this.id = id;
}
public Rectangle build() {
return new Rectangle(this);
}
public Builder width(int width) {
this.width = width;
return this;
}
public Builder height(int height) {
this.height = height;
return this;
}
public Builder stroke(int stroke) {
this.stroke = stroke;
return this;
}
}
}
現(xiàn)在鳖眼,我們創(chuàng)建 Rectangle 實(shí)例的過程就會(huì)變成下面的樣子,它不僅讓我們一眼就看出矩形設(shè)置了哪些屬性嚼摩,而且我們還可以自由組合這些屬性钦讳,達(dá)到重載構(gòu)造方法想要的結(jié)果:
Rectangle.Builder builder1 = new Rectangle.Builder(1);
Rectangle rect1 = builder1.width(1).height(1).stroke(1).build();
Rectangle.Builder builder2 = new Rectangle.Builder(2);
Rectangle rect2 = builder2.width(1).height(1).build();
Rectangle.Builder builder3 = new Rectangle.Builder(3);
Rectangle rect3 = builder3.stroke(1).build();
這個(gè)涉及到設(shè)計(jì)模式里面的建造者模式,后續(xù)可以了解一下枕面。
7.函數(shù)設(shè)計(jì)盡量功能單一
自己以前為了方便愿卒,在開發(fā)的時(shí)候經(jīng)常將函數(shù)寫成一大片,在后期的維護(hù)和二次優(yōu)化上面需要花很多時(shí)間潮秘。當(dāng)然很多不是一蹴而就的琼开,我們需要不斷的花時(shí)間去思考,這樣自己才能不斷進(jìn)步枕荞。