`
HYFY
  • 浏览: 11477 次
  • 性别: Icon_minigender_1
  • 来自: 河北
文章分类
社区版块
存档分类
最新评论

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

阅读更多
圈复杂度,英文为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.
0
0
分享到:
评论

相关推荐

    JavaScript ES6函数式编程入门经典

    《JavaScriptES6函数式编程入门经典》使用JavaScriptES6带你学习函数式编程。你将学习柯里化、偏函数、高阶函数以及Monad等概念。  目前,编程语言已经将焦点从对象转移到函数。JavaScript支持函数式编程,并允许...

    javascript函数式编程 underscore.js

    《Javascript函数式编程》配套代码,适合函数式编程入门。

    javaScript函数式编程

    全书共9章,分别介绍了JavaScript函数式编程、一等函数与Applicative编程、变量的作用域和闭包、高阶函数、由函数构建函数、递归、纯度和不变性以及更改政策、基于流的编程、类编程。除此之外,附录中还介绍了更多...

    JavaScript函数式编程库Prelude.ls.zip

    Prelude.ls是一个JavaScript函数式编程库,这是一个基础库,在一定程度上基于Haskell(一种纯函数式编程语言)的Prelude模块。 Prelude.ls基于LiveScript编写,LiveScript是JavaScript语言的前 身,由网景...

    underscore-min.js

    Underscore 是一个 JavaScript 工具库,它提供了一整套函数式编程的实用功能,但是没有扩展任何 JavaScript 内置对象。

    underscore-analysis:underscore.js源码分析-js

    想知道underscore与函数式编程有什么关系 摸索原始码阅读的正确姿势 lodash是underscore的超集,过多庞大,不适合细读,反之underscore更可以称为短小精炼版 下划线原始码有英文注释,适合作为原始码分析入门第一库 ...

    Javascript函数式编程简单介绍

    几十年来,函数式编程一直是计算机科学狂热者的至爱,由于数学的纯洁性和谜一般的本质, 它被埋藏在计算机实验室,只有数据学家和有希望获得博士学位的人士使用。但是现在,它正经历一场复兴, 这要感谢一些现代语言...

    Underscore.php——Underscore.js的php移植版

    Underscore.js是目前最好用的Javascript工具包,提供了100多个函数。Underscore.php是Underscore.js的PHP移植版,并且实现了部分Underscore.js中的功能! 我花了一个月的时间将Underscore.php的文档翻译为中文,开源...

    Learning.Underscore.js.178439381

    Explore the Underscore.js library by example using a test-driven development approach About This Book Understand and learn to apply functional programming principles using the built-in functions of ...

    Learning Underscore.js

    Explore the Underscore.js library by example using a test-driven development approach About This Book Understand and learn to apply functional programming principles using the built-in functions of ...

    Funfun:用于 JavaScript 的函数式编程实用程序库

    Funfun 试图提供像 Underscore 和 Lodash 一样的函数式操作,但以一种提供简单的函数组合和重用的方式,利用新的 ES6 功能与现有类型集成,并允许库用户自己利用一些“魔法” . 查看下面的概述或查看。 在这里...

    underscore.js帮助文档

    underscore.js的开发文档,需要使用的朋友们可以看看

    underscore-min.js 1.8.3

    underscore-min.js

    underscore.js 1.8.2

    underscore.js underscore.js underscore.js

    Underscore1.8.3 参考手册.CHM

    Underscore1.8.3 参考手册.CHM,Underscore中文教程,Underscore离线手册

    underscore源码学习计划

    underscore源码学习计划

    underscore

    underscore js工具类,underscore为集合类对象提供了一致的接口

Global site tag (gtag.js) - Google Analytics