今天我們不聊性能優(yōu)化,只是從后期維護(hù)代碼的角度談?wù)勅绾蝺?yōu)雅的書寫代碼
· 為什么需要些可維護(hù)性高的代碼 ?
在開發(fā)的過程中,迭代和維護(hù)是再正常不過的操作了,那么就必然要閱讀別人的代碼
你有沒有遇到過一些尷尬的事情:
1、看不懂別人的代碼,不知從何下手
2、修改一個(gè)功能,得讀兩天代碼,改完發(fā)現(xiàn) bug 最少的時(shí)候是修改以前
3、只是修改了一行代碼,發(fā)現(xiàn)控制臺(tái)報(bào)錯(cuò)好幾十個(gè)...
如果代碼的可維護(hù)性高了,那么可以避免很多這些問題
編寫可維護(hù)性高的代碼, 從我做起 ^_^
· 什么是可維護(hù)性高的代碼 ?
容易理解: 不需要求助源代碼書寫人員,就能看得懂
符合常識(shí): 代碼書寫的自然通透
容易適配: 當(dāng)數(shù)據(jù)發(fā)生變化的時(shí)候,不至于完全重寫
容易擴(kuò)展: 對(duì)于核心功能有可擴(kuò)展性(適當(dāng)利用策略模式)
容易調(diào)試: 當(dāng)出現(xiàn)問題的時(shí)候,能給出明確且詳細(xì)的錯(cuò)誤提示,可以直接定位問題源
從下面幾點(diǎn)做起:
一、代碼可讀性
· 想要好維護(hù), 那么第一任務(wù)就是你寫的代碼要讓別人看得懂
· 因?yàn)槲覀兊拇a,當(dāng)他不運(yùn)行的時(shí)候,就是一個(gè)純文本
· 想要讓別人看得懂你寫的一堆文本,那么就要從一切自定義的內(nèi)容開始做起
二、代碼縮進(jìn)
· 能區(qū)分是論文還是代碼的第一因素,也是最直觀的因素就是代碼縮進(jìn)
· 代碼沒有縮進(jìn),或者隨機(jī)縮進(jìn),那么和給你看一篇火星文論文沒有區(qū)別
for (var i = 0; i < 100; i++) {
if (true) {
function fn() {
for (var j = 0; j < 100; j++) {
}
}
for (var j = 0; j < 100; j++) {
}
}
}
· 我們嚴(yán)格保持了代碼縮進(jìn)以后, 雖然代碼意義不一定看得懂, 但是代碼結(jié)構(gòu)我能看得懂了
for (var i = 0; i < 100; i++) {
if (true) {
function fn() {
for (var j = 0; j < 100; j++) {
}
}
for (var j = 0; j < 100; j++) {
}
}
}
· 這個(gè)時(shí)候就可以嘗試下改一改了
三、注釋
在任何一個(gè)語言里面,都是有注釋的
語言規(guī)范里定義注釋,不是為了讓你學(xué)了玩的,就是為了讓你對(duì)代碼進(jìn)行一些標(biāo)注的
大型代碼塊,和大量變量堆積的地方,都要有清楚的注釋,用來表明這個(gè)代碼塊或者說這一堆變量是干什么用的,尤其是函數(shù),盡量做到每一個(gè)函數(shù)的前面都有一個(gè)說明注釋。
/*
* fn 獲取范圍之間隨機(jī)整數(shù)的函數(shù)
* @param {Number} a 范圍開始的數(shù)字
* @param {Number} b 范圍結(jié)束的數(shù)字
* @return {Number} 范圍內(nèi)的隨機(jī)整數(shù)
*/
function fn(a, b) { ... }
o 每一個(gè)函數(shù)都應(yīng)該有參數(shù)說明,是否有返回值,返回值是什么
o 因?yàn)檫@些內(nèi)容在函數(shù)定義中是不能直觀看到了,需要閱讀代碼才可以
o 當(dāng)你寫明了這些以后,閱讀性就大大提高了
o 假設(shè),你的函數(shù)塊里面涉及到很復(fù)雜的算法,最好也是在說明注釋里面標(biāo)注出來
當(dāng)你對(duì)于一些瀏覽器問題做出的修復(fù),你使用了一些黑科技
o 那么你一定要把這些黑科技標(biāo)注出來,避免別人修改你的代碼的時(shí)候
o 覺得這些黑科技沒有用,給你刪掉了,導(dǎo)致你修改好的問題又重新出現(xiàn)了
四、變量和函數(shù)命名
變量的命名和函數(shù)的命名,是最能體現(xiàn)我們自定義的地方
對(duì)于每一個(gè)變量和函數(shù)的命名,我們都盡量準(zhǔn)確的給到一個(gè)語義,不管你是使用 大駝峰 還是 小駝峰,都要保證看到名字就能知道這個(gè)變量或者函數(shù)的意義
從變量來說
1、盡量使用名詞,而不是動(dòng)詞
比如:car / person / show / ...
2、常量來說,要使用大寫字母來表示
比如:TEST / BROWSER / ...
3、區(qū)分全局和私有變量,函數(shù)內(nèi)的私有變量我會(huì)以 _ 開頭
比如: _this / ...
從函數(shù)來說
1、當(dāng)函數(shù)返回布爾值的時(shí)候, 一般會(huì)以 is 開頭
比如:isEnabled() / isSelected() / ...
2、獲取類的函數(shù)一般以 get 開頭
比如:getUserList() / getUserInfo() / ...
3、設(shè)置類的一般使用 set 開頭
比如:setName() / setUserInfo() / ...
4、修改類的一般使用 update 開頭
比如:updateName() / updatePrice() / ...
4、程序處理類函數(shù)使用 handler 結(jié)尾
比如:showEditHandler() / submitHandler() / ...
5、盡可能的通過名字描述清楚函數(shù)的作用,不用擔(dān)心太長(zhǎng),因?yàn)楹笃诖虬ぞ邥?huì)幫我們處理掉的
比如: getUserInfoById() / delGoodsParamsById() / ...