關(guān)于javascript中的圈復(fù)雜度

可測(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


![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2088873-be5d9d49b052b4c3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

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



![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2088873-84d287fb692d5542.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


其中,返回的值分別是 代碼所在的 絕對(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》

肯定能讓你獲益良多,共勉。




最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,027評(píng)論 25 709
  • 原文: https://github.com/ecomfe/spec/blob/master/javascript...
    zock閱讀 3,486評(píng)論 2 36
  • 許多人在單身時(shí),時(shí)常給自己定下許許多多的擇偶標(biāo)準(zhǔn),一副機(jī)智如我的感覺(jué)。愛(ài)情不是交易,不受條件限制,遇上了根本就躲不...
    盛夏弄潮兒閱讀 222評(píng)論 0 0
  • 自食其力,顧名思義,就是憑自己的本事養(yǎng)活自己,有多大能耐就吃多大能耐的飯,不乞求別人的可憐,有自尊地體面的活著。 ...
    夢(mèng)倩閱讀 491評(píng)論 0 3
  • 測(cè)試
    滅苦閱讀 214評(píng)論 0 0

友情鏈接更多精彩內(nèi)容