龙空技术网

前端开发JS函数式编程真实用途体现在哪里?

前端在路上 449

前言:

眼前我们对“viewstatejs”大体比较关注,各位老铁们都想要知道一些“viewstatejs”的相关知识。那么小编同时在网上网罗了一些关于“viewstatejs””的相关资讯,希望大家能喜欢,姐妹们快快来学习一下吧!

前面两篇文章介绍了JavaScript函数式编程的概念(并不是你认为的只用函数写程序),大家应该对函数式编程有了一个新的概念,但同时更多的疑问出来了,函数式编程似乎并不简单,而且和面向对象编程有点格格不入,那么我们应该如何抉择呢?至少我们学习的函数式编程有哪些前景和应用场景呢?下面我给大家分享一些有价值的参考

1. 优化绑定

说白了前端和后端不一样的关键点是后端HTTP较多,前端渲染多,前端真正的刚需是数据绑定机制。后端一次对话,计算好Response发回就完成任务了,所以后端吃了二十年年MVC老本还是挺好用的。前端处理的是连续的时间轴,并非一次对话,像后端那样赋值简单传递就容易断档,导致状态不一致,带来大量额外复杂度和Bug。不管是标准FRP还是Mobx这种命令式API的TFRP,内部都是基于函数式设计的。函数式重新发明的Return和分号是要比裸命令式好得多的(前端状态可以同步,后端线程安全等等,想怎么封装就怎么封装)。

2. 封装作用

接上条,大幅简化异步,IO,渲染等作用/副作用相关代码。和很多人想象的不一样,函数式很擅长处理作用,只是多一层抽象,如果应用稍微复杂一点,这点成本很快就能找回来(Redux Saga是个例子,特别是你写测试的情况下)。渲染现在大家都可以理解幂等渲染地好处了,其实函数式编程各种作用和状态也是幂等的,对于复杂应用非常有帮助。

(很多人认为函数式编程没用,主要是因为写的东西太简单,这也是为啥大数据团队Scala比例这么高的原因)

3. 复用

引用透明,无副作用,代数设计让函数式代码可以正确优雅地复用。前端不像后端业务固定,做好业务分析和DDD就可以搭个静态结构,高枕无忧了。前端的好代码一定是活的,每处都可能乱改。可组合性其实很重要。通过高阶函数来组合效果和效率都要高于继承,试着多用ramda,你就可以发现绝大部分东西都能一行写完,最后给个实参就变成一个UI,来需求改两笔就变成另外一个。

(好像轮子哥以前还说过其实Monad这种东西反而适合搬砖,我觉得因为API简单好用,而且它也没给你额外的能力,让你做到以前做不到的东西)。

到底什么是函数式编程?

其实函数式编程是个笼统的称呼,不太容易一概而论。到底用了map filter compose就叫函数式编程,有一等函数就算,还是依赖hm类型系统的的静态类型语言,还是依赖Monadic IO,还是要自动并行化才算函数式编程呢,还是都不算,只有Lambda演算才是?这个问题很难回答,比较像局外人的统称(你看西方人看见长得像中国人经常说Asian),说OO也会有Smalltalk和Simula这两种调用机制完全不同的流派,也有C++和Ruby静态动态类型不同的运行机制,更别提更多混合范式的OO语言。它们擅长解决的事情截然不同。对FP来说,也是一样的:从最标准的Lambda演算到Haskell,再到ML系语言,再到Lisp等等,FP的含义其实是不同的。

所以JavaScript算不算FP语言?

不过一般人们把Scheme也称做函数式编程语言。JavaScript和Scheme比也就少了元编程,事实上JavaScript本来就是打算仿照Scheme设计的脚本语言,只不过95年Java太火了,因此NetScape想让语法像Java一些……于是你就看到了现在的JavaScript。

所以按照一般工程上可以接受的说法,JavaScript因为有一等函数这张门票,大部分时候可以算FP语言。(不说JavaScript,Java 8函数式编程的书市面上就有多少本!)

除了类型系统上由于JavaScript是动态类型语言,不容易模拟类型系统之外,大部分函数式特性都可以在JS里比较自然地实现。

JavaScript函数式编程的现状和未来?

实话说各种编程开发应用函数式编程的其实比较少。实际上能看到函数式架构的项目除了某些银行内部的高端项目基本就没见过太多,不然就是大数据处理这些和Web直接关联比较小的。React Redux带起这波节奏反而让函数式编程在前端领域里占有相当的一席之地了。

不要小看Redux这么几行代码——基本上就是后端喊了很多年都没搞起来的CQRS + Event Sourcing的优雅实现,甚至你能看到很罕见的Haskell真实项目基本也都只能用这个架构。前端没有性能压力,没有持久化,没有向后兼容版本问题,和这种模式天然亲和,避免了这种模式的所有缺点,只获得了好处。

除此之外(State, Action) => State这种纯函数状态表示,之前也仅在Haskell和Scala里面常用到。加上React本身的UI = View(State)这种幂等渲染的模式,基本已经算是相当函数式的架构了。(当然很多组件一大堆方法,内部状态,老从Promise获取然后赋值等等的项目不算……对Redux利用率比较高的项目才算)。

再往未来展望的话就是Observable这种流式结构和现在Redux这种Plain函数式风格的较量了。特别像Scala现在到底是用Akka这种纯Actor API还是用Akka Stream这种流式API好的赶脚——Redux比较像Actor,Observable就是Stream。

参考文章:

标签: #viewstatejs #前端function函数可以干什么