Java无参无反,纯函数与反作用

现代的JS有许多概念或者说一些编程技巧,这些概念有来自于其余语言、一些设计模式或者js语言特有的概念等。下面就来讲一下与函数式编程密切相关的两个概念:纯函数和反作用javascript

反作用

在计算机科学中,函数反作用指当调用函数时,除了返回函数值以外,还对主调用函数产生附加的影响。例如修改全局变量(函数外的变量)或修改参数。 --- 维基百科前端

例如在javascript的内置的一些函数是有反作用的:java

[1, 2, 3].pop() // 每次执行pop函数,原数组都会减小一个元素 [1, 2, 3].splice(1, 1) // 会删除原数组里面的元素 ...git

除了这些内置的函数会存在反作用,咱们平时写的一些操做Dom、修改登陆信息和弹出一个弹窗等,这些例子都太多了。github

无反作用 & 纯函数

函数与外界的只有惟一一个渠道进行沟通,经过传入参数和返回值进行沟通。

相同的传入参数永远只会有相同的返回值。

最简单的例子:编程

function sum(a, b) { return a + b }redux

这两个概念是至关简单的,咱们接下来看一下,函数式的出现给JS带来了什么,解决了什么样的问题,存在哪些问题。设计模式

带来了什么

纯函数函数式有一些优势:api

可缓存性(Cacheable)

可移植性/自文档化(Portable / Self-Documenting)

可测试性(Testable)

合理性(Reasonable)

并行代码(Parallel Code)

单从这些有点来看,确实是一些软件工程上所提倡的几个观点,在足够灵活的状况下还能保证稳定性。想一想一些场景,当你使用第三方库的函数,传入了你的比较重要的一个对象,结果被修改了,致使了整个程序的错了,关键是这样的问题还很差定位到。数组

let importantObj = { a: 1 } someFunc(a) console.log(importantObj ) // ??? 不知道被修改为什么样子了。。。埋下了坑

好比,React、lodash和Redux等就巧妙应用了js的函数式编程,使得暴露出来的接口十分稳定,接口结构清晰。可是这些还只是用到了函数式的方式和技巧,还并非彻底的函数范式,真正的函数范式的限制更加严格,可是我认为不能一味的去追求这些严格的理论,而是适合的才是最好的。其中的一些函数式编程模型,好比:闭包(Closure)、高阶函数、柯里化(Currying)和组合(Composing)等,让更多的框架借鉴和使用,函数式编程这些特性给前端带来了更多的活力。

解决了什么样的问题

函数式编程关心数据的映射,命令式编程关心解决问题的步骤。现在前端应用功能愈来愈多,用户交互愈来愈多,全部须要处理的用户数据也是愈来愈复杂,管理这些数据是如今你们比较关心的事情和寻求突破的事情。

函数范式来处理这些数据,就可使得数据的每一次修改均可以变得能够追溯,能够很容易的定位到问题的所在。由于无反作用的特性,减小了影响原始数据噪音,使得每次修改数据都比较稳定。

存在哪些问题

相对于声明式和命令式,函数式的编程是比较不容易理解的,有些接口的用法有时候可能很差理解。下面我引用一下《从新思考 Redux》(rematch 做者 Shawn McKay 写的一篇干货软文)里面有些相关段落进行举例。

如下内容来着精读《从新思考 Redux》 博客,里面文章颇有深度,推荐阅读。简化初始化redux 初始化代码涉及的概念比较多,好比 compose thunk 等等,同时将 reducer、initialState、middlewares 这三个重要概念拆分红了函数方式调用,而不是更容易接受的配置方式:

const store = preloadedState => { return createStore( rootReducer, preloadedState, compose(applyMiddleware(thunk, api), DevTools.instrument()) ); };

若是换成配置方式,理解成本会下降很多:

const store = new Redux.Store({ instialState: {}, reducers: { count }, middlewares: [api, devTools] });

笔者注:redux 的初始化方式很是函数式,而下面的配置方式就更面向对象一些。相比之下,仍是面向对象的方式更好理解,毕竟 store 是一个对象。instialState 也存在一样问题,相比显示申明,将 preloadedState 做为函数入参就比较抽象了,同时 redux 对初始 state 的赋值也比较隐蔽,createStore 时统一赋值比较别扭,由于 reducers 是分散的,若是在 reducers 中赋值,要利用 es 的默认参数特性,看起来更像业务思考,而不是 redux 提供的能力。

经过上面博客的,能够看到,函数式的一些代码理解起来并非那么容易。

由于函数式的处理方式,每次都是产生一个新的数据,全部相对来讲,须要的内存和占的资源是较高的。

总结

通过上面的分析,咱们能够看到函数式的一些模型早已在现在的前端各类库实行开来,而且效果都还很不错,了解函数式的这个概念可谓是很是有必要的,可是是否必定须要函数式须要多多考虑。仍是记住只有适合的技术。

参考文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值