ionc1開發(fā)——年中總結(jié)之淺談代碼整潔

盡管糟糕的代碼也能運行,但如果代碼不整潔,會是整個開發(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;
  }
}

改造建議:

  1. 看方法名稱,應(yīng)該只是一個做某個特定事情的方法,不需要bool值作為返回
  2. if語句塊里有return,如果滿足條件,它將直接不執(zhí)行return以后的語句了,所以else看著就比較多余了
  3. 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;
}

改造建議:

  1. 盡量解耦,可以不在方法中直接操作scope上的數(shù)據(jù)就不要直接操作了
  2. 看方法名稱,這是一個需要有一個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)的意識。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容