1.函数式

面向对象编程(OO)通过封装变化使得代码更易理解。

函数式编程(FP)通过最小化变化使得代码更易理解。

函数式思想

JavaScript是一种拥有很多共享状态的动态语言,用不了多久,代码就会积累足够的复杂性。面向对象的编程思想可以解决一部分问。

我们需要的是一个可以对数据处理,并能处理交互,IO的编程范式,函数式编程在处理数据流转很有帮助,下一步我们希望深入函数式编程的理念,能让其处理异步交互,并且解决代码的复杂性

在应用设计时应该考虑一下几点:

  • 可扩展性——我是否需要不断地重构代码来支持额外的功能?
  • 易模块化——如果我更改了一个文件,另一个文件会不会受到影响?
  • 可重用性——是否有很多重复的代码?
  • 可测性——给这些函数添加单元测试是否让我纠结?
  • 易推理性——我写的代码是否非结构化严重并难以推理?

使用Javascript语言的其中一个问题是,缺乏一些能够妥当管理状态的原生解构,需要开发人员自身把控。随着复杂度的增高,变得难以控制。

声明式编程

命令式编程是很具体的告诉计算机如何执行某个任务,而声明式编程是将程序的描述和求值分离。

副作用和纯函数

纯函数

  • 仅取决于提供的输入,而不依赖于任何在函数求值期间或调用间隔时可能变化的隐藏状态和外部状态。

  • 不会造成超出其作用域的变化,例如修改全局对象或引用传递的参数。

副作用的发生情况

  • 改变一个全局的变量、属性或数据结构。this的使用容易发生问题。

  • 改变一个函数参数的原始值。

  • 处理用户输入。

  • 抛出一个异常,除非它又被当前函数捕获了。

  • 屏幕打印或记录日志。

  • 查询 HTML 文档、浏览器的 cookie或访问数据库。

引用透明和可置换性

引用透明使得开发者可以用这种系统的甚至是数理的方法来推导程序

1
2
3
increment();
increment();
print(counter);//引用不透明,调用期间如果被修改,会影响结果
1
2
const plus = run(increment,increment);
print(run(0))//总是为初始值加2

存储不可变数据

JavaScript 开发人员面临的问题都是由大量使用严重依赖外部共享变量的、存在太多分支的以及没有清晰的结构大函数所造成的。

即便是一些由很多文件组成并执行得很成功的应用,也会形成一种共享的可变全局数据网,难以跟踪和调试。

函数式编程的优点

  • 促使将任务分解成简单的函数。

  • 使用流式的调用链来处理数据。

  • 通过响应式范式降低事件驱动代码的复杂性。

复杂异步应用中的响应

总结

  • 使用纯函数的代码绝不会更改或破坏全局状态,有助于提高代码的可测试性和可维护性。

  • 函数式编程采用声明式的风格,易于推理。这提高了应用程序的整体可读性,通过使用组合和lambda表达式使代码更加精简。

  • 集合中的数据元素处理可以通过链接如map和reduce这样的函数来实现。

  • 函数式编程将函数视为积木,通过一等高阶函数来提高代码的模块化和可重用性。

  • 可以利用响应式编程组合各个函数来降低事件驱动程序的复杂性。

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2015-2025 SunZhiqi

此时无声胜有声!

支付宝
微信