盡管糟糕的代碼也能運行,但如果代碼不整潔,會是整個開發(fā)團隊泥足深陷,寫得不好的代碼每年都要耗費無數(shù)的時間無精力。——《代碼整潔之道》
說到代碼整潔,代碼之美,代碼質(zhì)量,代碼規(guī)范,真正的是老生常談。
為什么說真正的是老生常談,因為這是一個作為一只老鳥必須要關(guān)注的問題,也會是老鳥之間交談的大部分內(nèi)容。
而作為一只新手菜鳥,他們往往在功能的實現(xiàn)上就耗費了開發(fā)的大部分時間,只剩下了小部分的時間可以去關(guān)注代碼寫得好不好的本身,甚至直接實現(xiàn)功能就萬事大吉了。
當然這里并不是要去責怪什么,畢竟每只老鳥都是從菜鳥進化而來的。
突然想起一句話:世界上本無大神,只是填的坑多了就成了大神。(大伙兒盡可會心一笑 -:)
好了,書歸正傳。
本文主要以ionic1的代碼作為演示,但是整個的思路也可適用于其他開發(fā)語言。
慎用scope作為參數(shù)
一般來說,其實并不建議直接將scope作為參數(shù)傳入方法之中。
scope是view和controller交互的管道,上面承載了太多的信息,包含視圖層的模板信息以及模板要加載的數(shù)據(jù)信息以及其他的一些內(nèi)容。
在封裝方法的時候,如果參數(shù)直接傳入的是scope,我們在一開始的時候并不能知道究竟是使用或者操作scope上的什么東西。
我們在做封裝的時候,要符合一個原則:單一職責原則。
如果這個方法需要的是一個數(shù)組[],請傳入一個數(shù)組作為參數(shù);如果需要的是一個對象{},請傳入一個對象。
當然,我們也有參數(shù)需要傳入scope的時候,比如使用modal的時候。
當我們對使用modal的邏輯代碼進行再封裝時,就需要傳入scope。但是modal也不建議直接對scope上的數(shù)據(jù)進行使用操作,最好還是用一個新的形參給到modal。
隔離directive的scope
封裝directive的時候,也是有scope參數(shù)的。
如果不給directive的scope賦值,那么它將直接使用父級的scope作為自己的scope,它可以直接使用父級scope上的所有變量和方法。
如果對directive的scope賦值之后,它將只能使用自己的scope。
要使用的父級scope的數(shù)據(jù)也用一個新的形參傳給directive,這樣就能達到隔離數(shù)據(jù)的效果,防止父級scope的數(shù)據(jù)在directive中被污染。
慎用angular.foreach()
我們都知道,foreach是無法被break出去的。
如果我們是對被遍歷的對象或者數(shù)組里面的每一個元素都要進行操作,那么用foreach無疑效率是最高的。
但是,如果我們是要在滿足某個特定條件時break條出循環(huán),那么這個時候最好的做法就是用fori或者forin。
我們來看兩段代碼,第一段用foreach來實現(xiàn)。
我們可以看出,就算滿足了第二個if的條件,也就是第一個if判斷里的代碼不再執(zhí)行而已,但是整個循環(huán)還是依然會執(zhí)行下去,直到遍歷完整個數(shù)組。
var someFunc = function(arr) {
var allSelected = true;
angular.foreach(arr, function(data) {
if (allSelected) {
if (!data.selected) {
allSelected = false
}
}
});
return allSelected;
};
第二段代碼我們用fori來實現(xiàn),當滿足條件的時候,我們直接break跳出循環(huán)。
var someFunc = function(arr) {
var allSelected = true;
for(var i = 0; i < arr.length; i++) {
var data = arr[i];
if (!data.selected) {
allSelected = false;
break;
}
}
return allSelected;
};
擅用return
第一種,在做ifelse判斷的時候使用。
改造前的代碼:
var doSometing = function(status) {
if (status === 1){
// 狀態(tài)正確,do something
xxx bala bala...
return true;
} else if(status === 0) {
alert("狀態(tài)錯誤!");
return false;
}
}
改造建議:
- 看方法名稱,應(yīng)該只是一個做某個特定事情的方法,不需要bool值作為返回
- if語句塊里有return,如果滿足條件,它將直接不執(zhí)行return以后的語句了,所以else看著就比較多余了
- if(status===0)里面的代碼更加簡單,應(yīng)該提到前面去,由易到難,這樣才是比較符合人類做事情的順序。
改造后的代碼:
var doSometing = function(status) {
if(status === 0) {
alert("狀態(tài)錯誤!");
return ;
}
if (status === 1){
// 狀態(tài)正確,do something
xxx bala bala...
return;
}
}
第二種,作為方法的返回值
我們先看一段代碼:
$scope.allProductSelected = false;
var isAllProductSelcted = function(products) {
var allSelected = true;
angular.foreach(products, function(product) {
if (allSelected) {
if (!product.selected) {
allSelected = false
}
}
});
$scope.allProductSelected = allSelected;
}
改造建議:
- 盡量解耦,可以不在方法中直接操作scope上的數(shù)據(jù)就不要直接操作了
- 看方法名稱,這是一個需要有一個bool值作為返回的方法
改造后:
$scope.allProductSelected = false;
var isAllProductSelcted = function(products) {
var allSelected = true;
for(var i = 0; i < products.length; i++) {
var product = products[i];
if (!data.selected) {
allSelected = false;
break;
}
}
return allSelected;
}
$scope.allProductSelected = isAllProductSelcted(productList);
暫且就寫到這兒了。
說到底,代碼整潔,代碼規(guī)范都是為了把代碼寫好,方便自己閱讀,方便他人閱讀,方便后期維護。
這是一種意識,一種每個程序員都該有的,都可以培養(yǎng)的意識。