摘要:如果值是基本類型,則用操作符檢查其類型??偨Y(jié)所有編程語言都需要可維護性良好的代碼,這個很重要,因為大部分開發(fā)人員都花費大量時間維護他人的代碼。
o(╯□╰)o 這并不是什么史詩巨作,沒有非常深入去挖掘這類問題,只是從平常的JS代碼習慣,參考書籍總結(jié)而來,希望對你有幫助的!
今天的web應(yīng)用大至成千上萬行的javascript代碼,執(zhí)行各種復(fù)雜的過程,這種演化讓我們開發(fā)者必須得對可維護性有一定的認識!編寫可維護性代碼很重要,很多情況下我們是以他人的工作成果為基礎(chǔ),確保代碼的可維護性,以便其他開發(fā)人員更好地工作!
1 可維護性代碼的特點可理解性:其他人可以接手代碼并理解它的意圖,無需原開發(fā)人員花太多時間解釋!
直觀性:代碼中的東西一看就能明白,盡管其操作過程復(fù)雜。
可適應(yīng)性:代碼以一種數(shù)據(jù)上的變化不要求完全重寫方法。
可擴展性:在代碼架構(gòu)上可對核心功能的擴展。
可調(diào)式性:出錯時,代碼可以給你足夠的信息來直接確定問題所在。
2 代碼約定由于javascript語言的特點,我們可編寫各種編程風格的代碼,從傳統(tǒng)的面向?qū)ο笫降铰暶魇降胶瘮?shù)式。形成一套良好的javascript代碼書寫約定可大大提高可維護性,這點對初學者來說絕對是沒有很注重的地方。
2.1 可讀性縮進:在項目中統(tǒng)一代碼縮進,更易于閱讀,一種不錯也很常見的縮進大小為四個空格,當然可以是其他數(shù)量。
注釋:其實我們在編寫一些后臺代碼會經(jīng)常把一個功能,一個業(yè)務(wù)邏輯,一個函數(shù)的代碼注釋起來,但我們卻在編寫javascript卻經(jīng)常忽略這些習慣。一般而言,在js中有以下這些地方需要注釋:
函數(shù)和方法 :描述其目的和參數(shù)代表,返回值等。
大段的代碼 :大段代碼通常是一個任務(wù)的代碼,應(yīng)注釋描述任務(wù)。
復(fù)雜的算法 :不是所有人都會你的算法,你需要把你的算法思路簡單描述下。
Hack :因各瀏覽器的差異,javascript的hack用于解決什么問題應(yīng)該描述清楚。
2.2 變量和函數(shù)的命名變量名應(yīng)該名詞:如car,person
函數(shù)名應(yīng)以動詞開始:如getName(),返回布爾類型值的函數(shù)一般以is開頭,如:isEnable();
只要合乎邏輯,不用擔心變量或者函數(shù)名的長度,長度問題可以通過在你發(fā)布代碼壓縮的時候得以解決。
2.3 變量類型透明var car,person; //聲明兩個變量
如上代碼,由于javascript中變量是松散類型的,我們并不知道其中的car和person是什么類型的數(shù)據(jù),不夠透明,我們可以通過一下兩種方式緩解這種問題:
初始化變量:通過初始化指定變量類型,但通過這種方式命名的對象無法用于函數(shù)聲明中的參數(shù)。
var car = null; //car是對象 var person = ""; //person是字符串 var count = -1; //count是整數(shù) var found = false; //found是布爾型
匈牙利標記法:在變量名之前加上一個或多個字符表示數(shù)據(jù)類型。o - 對象,s - 字符串,i - 整數(shù),f - 浮點數(shù),b - 布爾型
var oCar; //car是對象 var sPerson; //person是字符串 var iCount; //count是整數(shù) var bFound; //found是布爾型3 松散耦合
記得以前剛?cè)腴TC#的時候,師兄經(jīng)常跟我說‘高內(nèi)聚低耦合’這詞,我也就含糊地點點頭,很多人可能也像我之前一樣,這詞耳熟能詳,但未真正實踐。
只要應(yīng)用的某個部分過分依賴另一部分,代碼就是耦合過緊,難于維護! 典型的問題:對象直接應(yīng)用另一個對象,并且修改其中一個的同時需要修改另一個。 在我們web應(yīng)用中,我們可以通過一下方式解耦我們的代碼:
3.1 解耦HTML/JavaScript在web應(yīng)用中,我們希望html專注于展示數(shù)據(jù),css專注于樣式,javascript專注于行為交互。但是有一些代碼會將html、javascript過于緊密地耦合在一起。
直接寫在HTML中javascript,使用包含內(nèi)聯(lián)代碼的元素或者是使用HTML屬性來分配事件處理程序。
雖然這樣寫完全正確,但出現(xiàn)javascript錯誤是,我們需要判斷錯誤出現(xiàn)在HTML還是在Javascript中,并且這還存在一個時間差問題,當我按下上面代碼的按鈕時,若此時javascript代碼并未加載完,此時變回引發(fā)錯誤。在實踐中,理想的狀況應(yīng)該是HTML和Javascript應(yīng)完全分離,使用引入外部文件來加載javascript。
相反地,在javascript中也不能包含過多的HTMl
function insertMsg(msg){ var container = document.getElementById("container"); container.innerHtml = "" }" + msg + "
當你在寫這樣的代碼的時候,我想你應(yīng)該去找個js模板引擎來了。
對動態(tài)生成的HTML,對書寫CSS布局,定位錯誤都比較難把控。
3.2 解耦CSS/Javascript上面說了,CSS和JS都應(yīng)該各司其職,不能有太大的親密動作,秀恩愛,死得快 囧~~~。
這個問題并不能說完全解耦css和js,因為在現(xiàn)代web應(yīng)用中常常需要javascript來更改樣式,但是我們還是盡量使他們分離。
// CSS對JS的緊密耦合 element.style.color = "red"; element.style.backgroundColor= "blue";
這樣的代碼在以后修改樣式的時候需要同時修改CSS和JS,可麻煩了。
//這樣就ok了 element.className = "color"; //color是樣式類
還有一個就是不能在CSS中寫CSS表達式,這應(yīng)該是都知道的了。
3.3 解耦應(yīng)用邏輯和事件處理程序每個web應(yīng)用程序都有相當多的事件處理程序,監(jiān)聽著大量不同的事件,然而,很少能有仔細將應(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ù) }
這樣寫有什么好處呢?
當有不同的方式觸發(fā)相同的相同過程事件的時候,這時只需調(diào)用應(yīng)用邏輯處理函數(shù)即可。
應(yīng)用邏輯處理函數(shù)可以在不添加到事件的情況下多帶帶測試。
4 編程實踐在企業(yè)環(huán)境中創(chuàng)建的web應(yīng)用往往同時由大量人員一同創(chuàng)作。在這種情況下的目標是確保每個人所使用的瀏覽器環(huán)境都有一致和不變的規(guī)則,因此,我們需要堅持一下的一些編程實踐:
4.1 避免全局變量在一個js文件中,最多允許有一個全局變量,讓其他對象和函數(shù)包含在其中,因為過多的全局變量會消耗大量內(nèi)存。
//兩個全局變量 var name = "jozo"; function sayName(){ alert("jozo"); }
上面的代碼有兩個全局變量,變量name和函數(shù)sayName(),其實可以創(chuàng)建一個變量包含它們:
//一個全局變量 --推薦 var person = { name:"jozo", sayName : function(){ alert(this.name); } }
這樣一個全局變量延伸開來就是‘空間的概念’了,不會與其他功能產(chǎn)生沖突,有助于消除功能作用域之間的混淆。
4.2 避免與null進行比較function sortArray(values){ if(values != null){ values.sort(比較函數(shù)); } }
上面代碼中的if語句應(yīng)該檢測values是否是數(shù)組,但如果與null作比較的話,字符串,數(shù)字等都會通過,導(dǎo)致函數(shù)拋出錯誤。這里是數(shù)組,那么我們就應(yīng)該檢測其是否為數(shù)組:
function sortArray(values){ if(values instanceof Array){ values.sort(比較函數(shù)); } }
所于當我們遇到與null作比較的代碼的時候,我們應(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ù)中找到對應(yīng)的代碼去修改,而每次修改邏輯代碼,都有可能引入錯誤的風險。所以我們可以把數(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ù)了,甚至可以把Constans多帶帶一個文件。那么什么樣的數(shù)據(jù)需要抽出來做常量呢?
重復(fù)值:任何在多處用到的值。
用戶界面字符串:任何用于顯示給用戶提示信息的字符串。
URLs:在WEB項目中,資源路徑可能經(jīng)常變更。在一個公共的地方存起來,修改起來更容易!
任何可能在以后會改變的值。
5 總結(jié)所有編程語言都需要可維護性良好的代碼,這個很重要,因為大部分開發(fā)人員都花費大量時間維護他人的代碼。為了減輕相互的負擔,從今天起我要做個好人,寫好代碼! o(╯□╰)o
ok,寫了一遍,我印象又加深了!以上內(nèi)容整理自《JavaScript高級程序設(shè)計》,覺得不錯點個贊唄。下一篇將整理如何書寫提高性能的JS代碼。謝謝閱讀……
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/85564.html
摘要:可能很多人和我一樣首次聽到前端架構(gòu)這個詞第一反應(yīng)是前端還有架構(gòu)這一說呢在后端開發(fā)領(lǐng)域系統(tǒng)規(guī)劃和可擴展性非常關(guān)鍵因此架構(gòu)師備受重視早在開發(fā)工作啟動之前他們就被邀請加入到項目中而且他們會跟客戶討論即將建成的平臺的架構(gòu)要求使用還什么技術(shù)棧內(nèi)容類型 可能很多人和我一樣, 首次聽到前端架構(gòu)這個詞, 第一反應(yīng)是: 前端還有架構(gòu)這一說呢? 在后端開發(fā)領(lǐng)域, 系統(tǒng)規(guī)劃和可擴展性非常關(guān)鍵, 因此架構(gòu)師備...
摘要:可能很多人和我一樣首次聽到前端架構(gòu)這個詞第一反應(yīng)是前端還有架構(gòu)這一說呢在后端開發(fā)領(lǐng)域系統(tǒng)規(guī)劃和可擴展性非常關(guān)鍵因此架構(gòu)師備受重視早在開發(fā)工作啟動之前他們就被邀請加入到項目中而且他們會跟客戶討論即將建成的平臺的架構(gòu)要求使用還什么技術(shù)棧內(nèi)容類型 可能很多人和我一樣, 首次聽到前端架構(gòu)這個詞, 第一反應(yīng)是: 前端還有架構(gòu)這一說呢? 在后端開發(fā)領(lǐng)域, 系統(tǒng)規(guī)劃和可擴展性非常關(guān)鍵, 因此架構(gòu)師備...
摘要:可能很多人和我一樣首次聽到前端架構(gòu)這個詞第一反應(yīng)是前端還有架構(gòu)這一說呢在后端開發(fā)領(lǐng)域系統(tǒng)規(guī)劃和可擴展性非常關(guān)鍵因此架構(gòu)師備受重視早在開發(fā)工作啟動之前他們就被邀請加入到項目中而且他們會跟客戶討論即將建成的平臺的架構(gòu)要求使用還什么技術(shù)棧內(nèi)容類型 可能很多人和我一樣, 首次聽到前端架構(gòu)這個詞, 第一反應(yīng)是: 前端還有架構(gòu)這一說呢? 在后端開發(fā)領(lǐng)域, 系統(tǒng)規(guī)劃和可擴展性非常關(guān)鍵, 因此架構(gòu)師備...
閱讀 1758·2021-11-24 10:18
閱讀 2277·2021-11-18 13:20
閱讀 2366·2021-08-23 09:46
閱讀 1022·2019-08-30 15:56
閱讀 2865·2019-08-30 15:53
閱讀 776·2019-08-30 14:22
閱讀 492·2019-08-29 15:34
閱讀 2561·2019-08-29 12:14