圈复杂度

圈复杂度

圈复杂度是表示代码中独立现行路径的数量。举个例子:

function sum(a, b) {
	if (typeof(a) !== typeof(b)) {
	    throw new Error('Cannot sum different types');
    } else {
 	    return a + b;
    }
}

这个方法的圈复杂度就是2,也就是说需要测试两个分支,以获取100%的代码覆盖率。因此需要编写两个单元测试。

计算圈复杂度可以使用的工具一般有jsmeter,感兴趣的可以看看。

一般来说,一个方法的圈复杂度越大,那么这个方法需要的测试代码就越多,这个道理很简单,需要测试的分支越多,那么单元测试自然就多嘛。有一个经验的法则就是:一般一个方法的复杂度保持在7以下就好,更好的就是保持在4以下。

造成方法的圈复杂度高的原因常常是方法里面的分支太多。举个例子

function doSomething(a) {
	if (a === 'x') {
		doX();
	}else if (a === 'y') {
		doY();
	}else {
 		doZ();
 	}
}

看到了没,这个方法的圈复杂度为3,显然如果判断增多的话,这个函数的圈复杂度会明显提高。解决这个问题的办法如下:

function doSomething(a) {
	var lookup = {x: doX, y: doY},def = doZ;
	lookup[a]? lookup[a]: def();
}

这个方法使用lookup表重构后,无论增加多少分支,这个方法的圈复杂度就是2。而且每个小的方法都是可以单独测试的,起到了隔离代码的作用。

对了,还有一个计算圈复杂度的工具是jscheckstyle,感兴趣的可以去了解它的用法。

 

软件重用

这一节,我们来谈谈另一个话题,那就是代码重用。根据研究表明:

软件一般有三个种类:程序特定(application-specific)、领域特定(domain-specific)、领域独立(domain-independent)。一般来说,第一类是程序员需要编写的,剩下的两类都是可以重用的。

比如nodejs就是独立领域的原件,而第三方模块就属于特定领域的软件,程序员编写的就是程序特定的软件

对于程序特定软件,一般占整个代码比例的15%,剩下的两类占到了85%。因此如果我们自己编写的程序代码如果能提高重用率,那么我们的整个项目的质量将得到一定程度的提高。至于提高多少,感兴趣的可以研究研究。

 

 

 

 

版权声明:著作权归作者所有。

thumb_up 0 | star_outline 0 | textsms 0