成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

[JS進(jìn)階] 編寫可維護(hù)性代碼 (1)

Youngdze / 500人閱讀

摘要:如果值是基本類型,則用操作符檢查其類型??偨Y(jié)所有編程語(yǔ)言都需要可維護(hù)性良好的代碼,這個(gè)很重要,因?yàn)榇蟛糠珠_(kāi)發(fā)人員都花費(fèi)大量時(shí)間維護(hù)他人的代碼。

  

o(╯□╰)o 這并不是什么史詩(shī)巨作,沒(méi)有非常深入去挖掘這類問(wèn)題,只是從平常的JS代碼習(xí)慣,參考書籍總結(jié)而來(lái),希望對(duì)你有幫助的!

今天的web應(yīng)用大至成千上萬(wàn)行的javascript代碼,執(zhí)行各種復(fù)雜的過(guò)程,這種演化讓我們開(kāi)發(fā)者必須得對(duì)可維護(hù)性有一定的認(rèn)識(shí)!編寫可維護(hù)性代碼很重要,很多情況下我們是以他人的工作成果為基礎(chǔ),確保代碼的可維護(hù)性,以便其他開(kāi)發(fā)人員更好地工作!

1 可維護(hù)性代碼的特點(diǎn)

可理解性:其他人可以接手代碼并理解它的意圖,無(wú)需原開(kāi)發(fā)人員花太多時(shí)間解釋!

直觀性:代碼中的東西一看就能明白,盡管其操作過(guò)程復(fù)雜。

可適應(yīng)性:代碼以一種數(shù)據(jù)上的變化不要求完全重寫方法。

可擴(kuò)展性:在代碼架構(gòu)上可對(duì)核心功能的擴(kuò)展。

可調(diào)式性:出錯(cuò)時(shí),代碼可以給你足夠的信息來(lái)直接確定問(wèn)題所在。

2 代碼約定

由于javascript語(yǔ)言的特點(diǎn),我們可編寫各種編程風(fēng)格的代碼,從傳統(tǒng)的面向?qū)ο笫降铰暶魇降胶瘮?shù)式。形成一套良好的javascript代碼書寫約定可大大提高可維護(hù)性,這點(diǎn)對(duì)初學(xué)者來(lái)說(shuō)絕對(duì)是沒(méi)有很注重的地方。

2.1 可讀性

縮進(jìn):在項(xiàng)目中統(tǒng)一代碼縮進(jìn),更易于閱讀,一種不錯(cuò)也很常見(jiàn)的縮進(jìn)大小為四個(gè)空格,當(dāng)然可以是其他數(shù)量。

注釋:其實(shí)我們?cè)诰帉懸恍┖笈_(tái)代碼會(huì)經(jīng)常把一個(gè)功能,一個(gè)業(yè)務(wù)邏輯,一個(gè)函數(shù)的代碼注釋起來(lái),但我們卻在編寫javascript卻經(jīng)常忽略這些習(xí)慣。一般而言,在js中有以下這些地方需要注釋:

函數(shù)和方法 :描述其目的和參數(shù)代表,返回值等。

大段的代碼 :大段代碼通常是一個(gè)任務(wù)的代碼,應(yīng)注釋描述任務(wù)。

復(fù)雜的算法 :不是所有人都會(huì)你的算法,你需要把你的算法思路簡(jiǎn)單描述下。

Hack :因各瀏覽器的差異,javascripthack用于解決什么問(wèn)題應(yīng)該描述清楚。

2.2 變量和函數(shù)的命名

變量名應(yīng)該名詞:如car,person

函數(shù)名應(yīng)以動(dòng)詞開(kāi)始:如getName(),返回布爾類型值的函數(shù)一般以is開(kāi)頭,如:isEnable();

只要合乎邏輯,不用擔(dān)心變量或者函數(shù)名的長(zhǎng)度,長(zhǎng)度問(wèn)題可以通過(guò)在你發(fā)布代碼壓縮的時(shí)候得以解決。

2.3 變量類型透明
var car,person; //聲明兩個(gè)變量

如上代碼,由于javascript中變量是松散類型的,我們并不知道其中的car和person是什么類型的數(shù)據(jù),不夠透明,我們可以通過(guò)一下兩種方式緩解這種問(wèn)題:

初始化變量:通過(guò)初始化指定變量類型,但通過(guò)這種方式命名的對(duì)象無(wú)法用于函數(shù)聲明中的參數(shù)。

var car = null; //car是對(duì)象
var person = ""; //person是字符串
var count = -1; //count是整數(shù)
var found = false; //found是布爾型

匈牙利標(biāo)記法:在變量名之前加上一個(gè)或多個(gè)字符表示數(shù)據(jù)類型。o - 對(duì)象,s - 字符串,i - 整數(shù),f - 浮點(diǎn)數(shù),b - 布爾型

var oCar; //car是對(duì)象
var sPerson; //person是字符串
var iCount; //count是整數(shù)
var bFound; //found是布爾型

3 松散耦合

記得以前剛?cè)腴TC#的時(shí)候,師兄經(jīng)常跟我說(shuō)‘高內(nèi)聚低耦合’這詞,我也就含糊地點(diǎn)點(diǎn)頭,很多人可能也像我之前一樣,這詞耳熟能詳,但未真正實(shí)踐。

只要應(yīng)用的某個(gè)部分過(guò)分依賴另一部分,代碼就是耦合過(guò)緊,難于維護(hù)! 典型的問(wèn)題:對(duì)象直接應(yīng)用另一個(gè)對(duì)象,并且修改其中一個(gè)的同時(shí)需要修改另一個(gè)。 在我們web應(yīng)用中,我們可以通過(guò)一下方式解耦我們的代碼:

3.1 解耦HTML/JavaScript

在web應(yīng)用中,我們希望html專注于展示數(shù)據(jù),css專注于樣式,javascript專注于行為交互。但是有一些代碼會(huì)將html、javascript過(guò)于緊密地耦合在一起。

直接寫在HTMLjavascript,使用包含內(nèi)聯(lián)代碼的

雖然這樣寫完全正確,但出現(xiàn)javascript錯(cuò)誤是,我們需要判斷錯(cuò)誤出現(xiàn)在HTML還是在Javascript中,并且這還存在一個(gè)時(shí)間差問(wèn)題,當(dāng)我按下上面代碼的按鈕時(shí),若此時(shí)javascript代碼并未加載完,此時(shí)變回引發(fā)錯(cuò)誤。在實(shí)踐中,理想的狀況應(yīng)該是HTMLJavascript應(yīng)完全分離,使用引入外部文件來(lái)加載javascript。

相反地,在javascript中也不能包含過(guò)多的HTMl

function insertMsg(msg){
    var container = document.getElementById("container");
    container.innerHtml = "

" + msg + "

" }

當(dāng)你在寫這樣的代碼的時(shí)候,我想你應(yīng)該去找個(gè)js模板引擎來(lái)了。

對(duì)動(dòng)態(tài)生成的HTML,對(duì)書寫CSS布局,定位錯(cuò)誤都比較難把控。

3.2 解耦CSS/Javascript

上面說(shuō)了,CSSJS都應(yīng)該各司其職,不能有太大的親密動(dòng)作,秀恩愛(ài),死得快 囧~~~。
這個(gè)問(wèn)題并不能說(shuō)完全解耦cssjs,因?yàn)樵诂F(xiàn)代web應(yīng)用中常常需要javascript來(lái)更改樣式,但是我們還是盡量使他們分離。

// CSS對(duì)JS的緊密耦合
element.style.color = "red";
element.style.backgroundColor= "blue";

這樣的代碼在以后修改樣式的時(shí)候需要同時(shí)修改CSS和JS,可麻煩了。

//這樣就ok了
element.className = "color"; //color是樣式類

還有一個(gè)就是不能在CSS中寫CSS表達(dá)式,這應(yīng)該是都知道的了。

3.3 解耦應(yīng)用邏輯和事件處理程序

每個(gè)web應(yīng)用程序都有相當(dāng)多的事件處理程序,監(jiān)聽(tīng)著大量不同的事件,然而,很少能有仔細(xì)將應(yīng)用邏輯從事件處理程序中分離的,如下:

function checkValue(e){
   e = e || window.event;
   var target = e.target || e.srcElement;
   if(target.value.length < 5){
      //省略一堆邏輯處理代碼...
   }
}

將上面的代碼重寫為:

   function checkValue(value){
       if(value.length < 5){
         //省略一堆邏輯處理代碼...
       }
   }
   function handleBlur(e){
       e = e || window.event;
       var target = e.target || e.srcElement;
       checkValue(target.value); //調(diào)用應(yīng)用邏輯處理函數(shù)
    }

這樣寫有什么好處呢?

當(dāng)有不同的方式觸發(fā)相同的相同過(guò)程事件的時(shí)候,這時(shí)只需調(diào)用應(yīng)用邏輯處理函數(shù)即可。

應(yīng)用邏輯處理函數(shù)可以在不添加到事件的情況下多帶帶測(cè)試。

4 編程實(shí)踐

在企業(yè)環(huán)境中創(chuàng)建的web應(yīng)用往往同時(shí)由大量人員一同創(chuàng)作。在這種情況下的目標(biāo)是確保每個(gè)人所使用的瀏覽器環(huán)境都有一致和不變的規(guī)則,因此,我們需要堅(jiān)持一下的一些編程實(shí)踐:

4.1 避免全局變量

在一個(gè)js文件中,最多允許有一個(gè)全局變量,讓其他對(duì)象和函數(shù)包含在其中,因?yàn)檫^(guò)多的全局變量會(huì)消耗大量?jī)?nèi)存。

//兩個(gè)全局變量
var name = "jozo";
function sayName(){
  alert("jozo");
}

上面的代碼有兩個(gè)全局變量,變量name和函數(shù)sayName(),其實(shí)可以創(chuàng)建一個(gè)變量包含它們:

//一個(gè)全局變量 --推薦
var person = {
    name:"jozo",
    sayName : function(){
        alert(this.name);
    }
}

這樣一個(gè)全局變量延伸開(kāi)來(lái)就是‘空間的概念’了,不會(huì)與其他功能產(chǎn)生沖突,有助于消除功能作用域之間的混淆。

4.2 避免與null進(jìn)行比較
function sortArray(values){
    if(values != null){
        values.sort(比較函數(shù));
    }
}

上面代碼中的if語(yǔ)句應(yīng)該檢測(cè)values是否是數(shù)組,但如果與null作比較的話,字符串,數(shù)字等都會(huì)通過(guò),導(dǎo)致函數(shù)拋出錯(cuò)誤。這里是數(shù)組,那么我們就應(yīng)該檢測(cè)其是否為數(shù)組:

function sortArray(values){
    if(values instanceof Array){
        values.sort(比較函數(shù));
    }
}

所于當(dāng)我們遇到與null作比較的代碼的時(shí)候,我們應(yīng)該用下面的技術(shù)替換:

如果值為引用類型,則用instanceof 操作符檢查其構(gòu)造函數(shù)。

如果值是基本類型,則用typeof操作符檢查其類型。

4.3 使用常量
function validate(value){
    if(!value){
        alert("不存在");
        location.href = "/errors/invalid.php";
    }
}

現(xiàn)在,我想把‘不存在’改為‘該數(shù)據(jù)不存在!’,把跳轉(zhuǎn)路徑也改了,我得回到函數(shù)中找到對(duì)應(yīng)的代碼去修改,而每次修改邏輯代碼,都有可能引入錯(cuò)誤的風(fēng)險(xiǎn)。所以我們可以把數(shù)據(jù)多帶帶定義為常量,與應(yīng)用邏輯分離:

var Constans = {
    ERRORMSG: "不存在",
    ERRORPAGE:"/errors/invalid.php"
};
function validate(value){
    if(!value){
        alert(Constans.ERRORMSG );
        location.href = Constans.ERRORPAGE ;
    }
}

這樣我們修改靜態(tài)文本內(nèi)容的時(shí)候就無(wú)需去動(dòng)邏輯函數(shù)了,甚至可以把Constans多帶帶一個(gè)文件。那么什么樣的數(shù)據(jù)需要抽出來(lái)做常量呢?

重復(fù)值:任何在多處用到的值。

用戶界面字符串:任何用于顯示給用戶提示信息的字符串。

URLs:在WEB項(xiàng)目中,資源路徑可能經(jīng)常變更。在一個(gè)公共的地方存起來(lái),修改起來(lái)更容易!

任何可能在以后會(huì)改變的值。

5 總結(jié)

所有編程語(yǔ)言都需要可維護(hù)性良好的代碼,這個(gè)很重要,因?yàn)榇蟛糠珠_(kāi)發(fā)人員都花費(fèi)大量時(shí)間維護(hù)他人的代碼。為了減輕相互的負(fù)擔(dān),從今天起我要做個(gè)好人,寫好代碼! o(╯□╰)o

ok,寫了一遍,我印象又加深了!以上內(nèi)容整理自《JavaScript高級(jí)程序設(shè)計(jì)》,覺(jué)得不錯(cuò)點(diǎn)個(gè)贊唄。下一篇將整理如何書寫提高性能的JS代碼。謝謝閱讀……

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/85564.html

相關(guān)文章

  • 前端進(jìn)階之路: 前端架構(gòu)設(shè)計(jì)(1)-代碼核心

    摘要:可能很多人和我一樣首次聽(tīng)到前端架構(gòu)這個(gè)詞第一反應(yīng)是前端還有架構(gòu)這一說(shuō)呢在后端開(kāi)發(fā)領(lǐng)域系統(tǒng)規(guī)劃和可擴(kuò)展性非常關(guān)鍵因此架構(gòu)師備受重視早在開(kāi)發(fā)工作啟動(dòng)之前他們就被邀請(qǐng)加入到項(xiàng)目中而且他們會(huì)跟客戶討論即將建成的平臺(tái)的架構(gòu)要求使用還什么技術(shù)棧內(nèi)容類型 可能很多人和我一樣, 首次聽(tīng)到前端架構(gòu)這個(gè)詞, 第一反應(yīng)是: 前端還有架構(gòu)這一說(shuō)呢? 在后端開(kāi)發(fā)領(lǐng)域, 系統(tǒng)規(guī)劃和可擴(kuò)展性非常關(guān)鍵, 因此架構(gòu)師備...

    DevYK 評(píng)論0 收藏0
  • 前端進(jìn)階之路: 前端架構(gòu)設(shè)計(jì)(1)-代碼核心

    摘要:可能很多人和我一樣首次聽(tīng)到前端架構(gòu)這個(gè)詞第一反應(yīng)是前端還有架構(gòu)這一說(shuō)呢在后端開(kāi)發(fā)領(lǐng)域系統(tǒng)規(guī)劃和可擴(kuò)展性非常關(guān)鍵因此架構(gòu)師備受重視早在開(kāi)發(fā)工作啟動(dòng)之前他們就被邀請(qǐng)加入到項(xiàng)目中而且他們會(huì)跟客戶討論即將建成的平臺(tái)的架構(gòu)要求使用還什么技術(shù)棧內(nèi)容類型 可能很多人和我一樣, 首次聽(tīng)到前端架構(gòu)這個(gè)詞, 第一反應(yīng)是: 前端還有架構(gòu)這一說(shuō)呢? 在后端開(kāi)發(fā)領(lǐng)域, 系統(tǒng)規(guī)劃和可擴(kuò)展性非常關(guān)鍵, 因此架構(gòu)師備...

    baishancloud 評(píng)論0 收藏0
  • 前端進(jìn)階之路: 前端架構(gòu)設(shè)計(jì)(1)-代碼核心

    摘要:可能很多人和我一樣首次聽(tīng)到前端架構(gòu)這個(gè)詞第一反應(yīng)是前端還有架構(gòu)這一說(shuō)呢在后端開(kāi)發(fā)領(lǐng)域系統(tǒng)規(guī)劃和可擴(kuò)展性非常關(guān)鍵因此架構(gòu)師備受重視早在開(kāi)發(fā)工作啟動(dòng)之前他們就被邀請(qǐng)加入到項(xiàng)目中而且他們會(huì)跟客戶討論即將建成的平臺(tái)的架構(gòu)要求使用還什么技術(shù)棧內(nèi)容類型 可能很多人和我一樣, 首次聽(tīng)到前端架構(gòu)這個(gè)詞, 第一反應(yīng)是: 前端還有架構(gòu)這一說(shuō)呢? 在后端開(kāi)發(fā)領(lǐng)域, 系統(tǒng)規(guī)劃和可擴(kuò)展性非常關(guān)鍵, 因此架構(gòu)師備...

    rockswang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<