摘要:如果值是基本類型,則用操作符檢查其類型??偨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 :因各瀏覽器的差異,javascript的hack用于解決什么問(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ò)于緊密地耦合在一起。
直接寫在HTML中javascript,使用包含內(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)該是HTML和Javascript應(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ō)了,CSS和JS都應(yīng)該各司其職,不能有太大的親密動(dòng)作,秀恩愛(ài),死得快 囧~~~。
這個(gè)問(wèn)題并不能說(shuō)完全解耦css和js,因?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
摘要:可能很多人和我一樣首次聽(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)師備...
摘要:可能很多人和我一樣首次聽(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)師備...
摘要:可能很多人和我一樣首次聽(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)師備...
閱讀 1798·2021-11-24 10:18
閱讀 2312·2021-11-18 13:20
閱讀 2404·2021-08-23 09:46
閱讀 1085·2019-08-30 15:56
閱讀 2907·2019-08-30 15:53
閱讀 820·2019-08-30 14:22
閱讀 543·2019-08-29 15:34
閱讀 2595·2019-08-29 12:14