可測(cè)試的javascript代碼
首先,作為一個(gè)正在Javascript中掙扎的人來(lái)說(shuō),寫(xiě)這些東西著實(shí)很緊張,畢竟,個(gè)人資質(zhì)平平,不知道這些東西對(duì)大家有沒(méi)有幫助,但從我個(gè)人角度來(lái)看,覺(jué)得非常重要,對(duì)于規(guī)范化自己的js代碼,增強(qiáng)它的持久性和可維護(hù)性,實(shí)在是非常有幫助。
為什么提到‘圈復(fù)雜度’這個(gè)概念,是因?yàn)樵谖覀兙帉?xiě)js代碼的過(guò)程中,隨著功能的擴(kuò)展和增加,代碼復(fù)雜度也在上漲,為了減少?gòu)?fù)雜性,我們必須確保我們不會(huì)使用任何過(guò)于復(fù)雜或容易出錯(cuò)的構(gòu)造,保證代碼的合理性和可讀性,你不能保證幾個(gè)月之后你是否還會(huì)記得你當(dāng)時(shí)寫(xiě)這段代碼的意圖,所以,重要性不言而喻,而常用的如 'Lintjs' 等工具就可以幫我們很好的規(guī)范化我們的代碼,避免代碼出現(xiàn)難以維護(hù)的場(chǎng)景,而圈復(fù)雜度這個(gè)概念被定義為 “表示代碼中獨(dú)立現(xiàn)行路徑的數(shù)量”,什么意思,就是說(shuō)這個(gè)復(fù)雜度的值代表著 測(cè)試當(dāng)前代碼,所需要編寫(xiě)的單元測(cè)試的最小數(shù)量。
例如:
function sum(a,b){
if(typedef(a) !== typedef(b){
throw new Error("Cann't sum different types!");
} else{
return a + b;
}
}
該方法的圈復(fù)雜度是2,就意味著,要測(cè)試每個(gè)分之,并獲得百分之百的代碼覆蓋率,要編寫(xiě)兩個(gè)單元測(cè)試,雖然上述代碼中部分寫(xiě)法不是必須的,但是規(guī)范化,注意細(xì)節(jié),保持好會(huì)讓代碼在后續(xù)迭代維護(hù)中避免很多問(wèn)題。
一般來(lái)說(shuō),任何方法的圈復(fù)雜度都不應(yīng)該大于10,這個(gè)值不是臆想出來(lái)的,而是規(guī)律總結(jié)出的一個(gè)合理數(shù)值,一旦當(dāng)值超過(guò)25,就意味著這段代碼非常復(fù)雜,換句話說(shuō),你一旦修改,無(wú)論修改前有無(wú)BUG,修改產(chǎn)生新的Bug幾乎是不可避免的。
那么,又是什么引起的呢?一般來(lái)說(shuō),圈復(fù)雜度通常是由很多if/then/else 語(yǔ)句造成的,最簡(jiǎn)單的重構(gòu)修復(fù),是將方法分解成更小的方法。
例如:
function doSomething(a){
if(a==='x'){
doX();
}else if(a==='y'){
doY();
}else{
doZ();
}
}
重構(gòu)之后
function doSomething(a){
var lookup={x:doX:y:doY},def=doZ;
lookup[a] ? lookup[a]() : def();
}
重構(gòu)之后,并沒(méi)有減少必須的單元測(cè)試量,而是分解成更小的量,這樣化難為簡(jiǎn),不用再為一個(gè)單獨(dú)的函數(shù)編寫(xiě)大量的測(cè)試代碼,函數(shù)代碼更具有可維護(hù)性。
當(dāng)然,我們不希望在代碼提交后才發(fā)現(xiàn)此類(lèi)問(wèn)題,所以,我們可以在本地先檢測(cè)js代碼是否符合基本的規(guī)范和要求。
在此推薦一個(gè)計(jì)算圈復(fù)雜度的工具----- jscheckstyle,它可以計(jì)算每個(gè)函數(shù)和方法的圈復(fù)雜度,也包括其中的匿名函數(shù)。
sudo npm install jscheckstyle

簡(jiǎn)單的導(dǎo)入一個(gè)文件測(cè)試樣例:

其中,返回的值分別是 代碼所在的 絕對(duì)行數(shù)(因?yàn)槠陂g注釋?zhuān)招卸紩?huì)計(jì)算在內(nèi))、函數(shù)的參數(shù)數(shù)量、以及 圈復(fù)雜度。這樣一個(gè)大致的預(yù)覽會(huì)讓我們對(duì)代碼的性能有一個(gè)基本的認(rèn)識(shí),更好的能夠保證代碼的可維護(hù)性,當(dāng)然,這里所說(shuō)的只是一個(gè)宏觀的認(rèn)識(shí),涉及的東西也只是冰山一角。
如果你也正面臨著同樣的問(wèn)題,推薦閱讀:
* 《編寫(xiě)可維護(hù)的javascript》
* 《編寫(xiě)可測(cè)試的javascript》
肯定能讓你獲益良多,共勉。