圈复杂度,英文为CCN(Cyclomatic Complexity Number)。官方解释为:
“用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,即合理的预防错误所需测试的最少路径条数,圈复杂度 大说明程序代码可能质量低且难于测试和维护,根据经验,程序的可能错误和高的圈复杂度有着很大关系”。
简单来说,圈复杂度表现了一段代码的复杂程度(这里的复杂,指逻辑的复杂),即圈复杂度越大,代码中的逻辑判断数量越多,越复杂,从而可能导致代码质量越差。
计算圈复杂度的方法:
每出现while,for,if中的一个,圈复杂度就要加一,出现一个switch,有几个case,圈复杂度就要加几。
除此之外很难一眼看出这个for循环或while循环是做什么的,也就是说循环体的意义没有被表现出来。
如何较为安全快速的减少圈复杂度,并且直观的展现出一段代码的含义呢?这就是underscore的功能了。
目测underscore的功能很强大,目前学会的也只是冰山一角。
underscore中常用的一些功能,就是针对数组及对象的一些方法了。简单说几个:
首先要说的是如何将一个对象转换成underscore对象:
通过_()转换
var a=[1,2,3];
b=_(a);
这样,b就成了underscore对象,可以直接调用underscore提供的任何方法。
通过.value()还原
c=b.value();
这样,c又变成了原始的js对象。
遍历:_.each(params[0],params[1])
params[0]为要遍历的对象,params[1]为操作这个对象中没一个元素的方法,是个函数。例如:
_.each([1,2,3],function(num){alert(num);});
也可以直接写成_.each([1,2,3],alert);
匿名函数体和函数名是等价的,这样会一次alert出1,2,3.
链式处理:_.chain()
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();
结果b=["A is a boy.", "B is a boy.", "C is a boy."]
等等,这里就不一一列举例子了,有兴趣的同学可以看这里: http://www.css88.com/doc/underscore/
写道这里,各位同学有没有发现underscore的调用很诡异,为什么每个方法的参数中总是有一个匿名函数体,不像我们曾经使用过的js方法如push()等方法的参数直接就是一个变量呢?
另一种编程思想:函数式编程
最开始我理解函数式编程是:程序中全是一个个的函数,没有单独的语句。后来发现这是一个美丽的误会。后来通过看一些资料明白了一些基本的:
所谓函数式编程,参数和返回值都是函数(这里的函数是函数体的地址),也就是不同函数之间飞来飞去的也都是函数。
用js写个简单的例子:
var a = function(num){
num=num+1;
return function(second_num){
return num - second_num;
}}
var b = a(1)(3)
这样b=-1.
分享到:
相关推荐
Underscore.js是一个轻量级的JavaScript实用库,它为开发者提供了大量函数式编程工具,使得在JavaScript中实践函数式编程变得更加容易。 在JavaScript中,函数式编程的核心概念包括: 1. **纯函数**:一个纯函数在...
《JavaScriptES6函数式编程入门经典》使用JavaScriptES6带你学习函数式编程。你将学习柯里化、偏函数、高阶函数以及Monad等概念。 目前,编程语言已经将焦点从对象转移到函数。JavaScript支持函数式编程,并允许...
全书共9章,分别介绍了JavaScript函数式编程、一等函数与Applicative编程、变量的作用域和闭包、高阶函数、由函数构建函数、递归、纯度和不变性以及更改政策、基于流的编程、类编程。除此之外,附录中还介绍了更多...
这一点与封装和隐藏紧密相关,封装是面向对象编程中的一个概念,但在函数式编程中同样重要。通过隐藏实现细节,函数式编程鼓励开发者编写更易于理解和维护的代码。 “一等函数和应用式编程”章节可能探讨了将函数视...
#### JavaScript与函数式编程 JavaScript天生适合函数式编程,因为它支持第一类函数(functions as first-class citizens),这意味着函数可以像其他值一样被传递和返回。JavaScript还提供了一些内置方法,如`map()`...
JavaScript函数式编程是一种编程...借助于Underscore.js这样的库,可以轻松地在JavaScript中应用函数式编程思想。对于想要深入理解JavaScript和函数式编程的开发者来说,相关的书籍和在线资源提供了丰富的学习材料。
Prelude.ls是一个JavaScript函数式编程库,这是一个基础库,在一定程度上基于Haskell(一种纯函数式编程语言)的Prelude模块。 Prelude.ls基于LiveScript编写,LiveScript是JavaScript语言的前 身,由网景...
3. **函数编程**:underscore支持函数式编程,如`_.partial()`用于部分应用函数,`_.bind()`绑定函数上下文,`_.compose()`用于函数组合,以及`_.throttle()`和`_.debounce()`用于限制函数执行频率。 4. **实用工具...
Underscore.js深受函数式编程思想的影响,强调无副作用、纯函数和高阶函数等概念。例如,_.map()、_.filter()和_.reduce()等函数就是对数组操作的抽象,它们返回新的数据结构,而不是修改原始数据,这符合纯函数的...
随着诸如jQuery、backbone.js、Dojo和underscore.js等库的流行,JavaScript开发者开始更多地采用函数式编程的概念来处理复杂的Web应用程序。JavaScript作为一种动态类型的语言,天然支持高阶函数、闭包和匿名函数,...
标题“Thinking in Ramda”与描述表明本文是关于Ramda库使用方法和函数式编程(Functional Programming)基本概念的介绍。Ramda是一个为JavaScript设计的库,它提供了丰富的函数工具,用于进行函数式编程,且其设计...
3. **函数编程**:Underscore支持函数式编程,如`_.bind()`可以绑定函数到特定上下文,`_.compose()`用于组合多个函数,`_.after()`可以创建一个新函数,在原始函数被调用指定次数后才执行,`_.throttle()`和`_....
Underscore.js是一个实用的JavaScript函数式编程工具库,它提供了一整套函数式编程辅助功能,包括迭代、函数绑定、模板和对象操作等。该库虽然不是JavaScript语言的一部分,但它的存在显著增强了JavaScript的函数式...
3. **函数工具**:Underscore.js支持函数的延迟执行、节流和防抖,以及提供`bind`(绑定上下文)、`compose`(函数组合)等高阶函数,使得函数式编程在JavaScript中更加便捷。 4. **实用函数**:此外,Underscore....
Underscore 是一个 JavaScript 工具库,它提供了一整套函数式编程的实用功能,但是没有扩展任何 JavaScript 内置对象。
Underscore.js 是一个功能强大的 JavaScript 工具库,它提供了大量的函数式编程支持,这些支持在 Prototype.js 或 Ruby 中是常见的,但并未扩展任何内置的 JavaScript 对象。Underscore 的设计初衷是为了与 jQuery ...
9. **函数式编程库**:在JavaScript中,有许多库如Ramda、Lodash和Underscore提供了丰富的函数式工具。这些库帮助开发者更容易地实现函数式编程风格。 10. **尾递归优化**:一些语言如Scala和ES6(在某些情况下)...
想知道underscore与函数式编程有什么关系 摸索原始码阅读的正确姿势 lodash是underscore的超集,过多庞大,不适合细读,反之underscore更可以称为短小精炼版 下划线原始码有英文注释,适合作为原始码分析入门第一库 ...