圈复杂度,underscore与函数式编程

[size=medium]圈复杂度,英文为CCN(Cyclomatic Complexity Number)。官方解释为:

“用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,即合理的预防错误所需测试的最少路径条数,圈复杂度 大说明程序代码可能质量低且难于测试和维护,根据经验,程序的可能错误和高的圈复杂度有着很大关系”。

简单来说,圈复杂度表现了一段代码的复杂程度(这里的复杂,指逻辑的复杂),即圈复杂度越大,代码中的逻辑判断数量越多,越复杂,从而可能导致代码质量越差。

计算圈复杂度的方法:
每出现while,for,if中的一个,圈复杂度就要加一,出现一个switch,有几个case,圈复杂度就要加几。

除此之外很难一眼看出这个for循环或while循环是做什么的,也就是说循环体的意义没有被表现出来。

如何较为安全快速的减少圈复杂度,并且直观的展现出一段代码的含义呢?这就是underscore的功能了。

目测underscore的功能很强大,目前学会的也只是冰山一角。

underscore中常用的一些功能,就是针对数组及对象的一些方法了。简单说几个:

首先要说的是如何将一个对象转换成underscore对象:[/size]

[size=x-large]通过_()转换[/size]
var a=[1,2,3];
b=_(a);

[size=medium]这样,b就成了underscore对象,可以直接调用underscore提供的任何方法。
[/size]
[size=x-large]通过.value()还原[/size]
c=b.value();

[size=medium]这样,c又变成了原始的js对象。
[/size]
[size=x-large]遍历:_.each(params[0],params[1])[/size]

[size=medium]params[0]为要遍历的对象,params[1]为操作这个对象中没一个元素的方法,是个函数。例如:[/size]
_.each([1,2,3],function(num){alert(num);});

[size=medium]也可以直接写成[/size]
_.each([1,2,3],alert);
[size=medium]匿名函数体和函数名是等价的,这样会一次alert出1,2,3.[/size]

[size=x-large]链式处理:_.chain()[/size]

var a=[{'name':'B'},{'name':'A'},{'name':'C'}];
var b=_.chain(a).sortBy(function(people){return people.name;}).map(function(people){return people.name + ' is a boy.';}).value();


[size=medium]结果b=["A is a boy.", "B is a boy.", "C is a boy."]

等等,这里就不一一列举例子了,有兴趣的同学可以看这里: [url]http://www.css88.com/doc/underscore/[/url]

写道这里,各位同学有没有发现underscore的调用很诡异,为什么每个方法的参数中总是有一个匿名函数体,不像我们曾经使用过的js方法如push()等方法的参数直接就是一个变量呢?[/size]

[size=x-large]另一种编程思想:函数式编程[/size]

[size=medium]最开始我理解函数式编程是:程序中全是一个个的函数,没有单独的语句。后来发现这是一个美丽的误会。后来通过看一些资料明白了一些基本的:
所谓函数式编程,参数和返回值都是函数(这里的函数是函数体的地址),也就是不同函数之间飞来飞去的也都是函数。

用js写个简单的例子:[/size]

var a = function(num){
num=num+1;
return function(second_num){
return num - second_num;
}}
var b = a(1)(3)

[size=medium]这样b=-1.[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值