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