Javascript和函数式编程— Pt。 3:纯函数

纯度

注意:这是关于“ 学习 JavaScript ES6 +中的函数式编程技术”的“ JavaScript和函数式编程 ”系列的一部分。 在此处查看关于currying函数的第4部分。 要从头开始,请查看<第1部分>
该死的,感觉很好

动机

因此,我们的许多错误都源自与IO相关的,数据突变,带有副作用的代码。 这些在我们的代码库中不断攀升-从接受用户输入,通过http调用接收到意外响应或写入文件系统之类的东西开始。 不幸的是,这是一个严峻的现实,我们应该习惯于应对。 还是?

如果我告诉您,我们可以使执行程序的关键/易失性位的代码部分最小化,该怎么办? 我们可以强制(按照惯例)我们的代码库中的绝大多数将是纯净的,并将与IO相关 /具有副作用的代码限制到我们代码库的特定部分。 这将使我们的调试过程更容易,更连贯并且更容易推理。

那么,这个神话般的纯函数是什么? 纯函数具有两个主要特征:

1.纯函数是确定性的 。 这意味着,给定相同的输入,该函数将始终返回相同的输出。 为了用数学术语将其说明为函数(这会很快!),它是定义明确的函数。 每个输入每次都返回一个输出。

纯粹的功能,在野外!
纯功能
const add = (x, y) => x + y // A pure function

add是一个纯函数,因为它的输出仅取决于它接收的参数。 因此,给定相同的值,它将始终产生相同的输出。

这个怎么样?

const magicLetter = '*'
const createMagicPhrase = (phrase) => `${magicLetter}abra${phrase}`

关于这一件事有些可疑……。 createMagicPhrase函数取决于其范围外部的值。 因此,这不是纯粹的!

函数不纯
const fetchLoginToken = externalAPI.getUserToken

fetchLoginToken是纯函数吗? 它是否每次都返回相同的值? 绝对不! 有时它将正常工作-有时服务器将关闭并且我们将收到500错误-将来的某个时候API可能会更改,因此该调用不再有效! 因此,由于该函数是不确定的,因此可以放心地说它是不纯函数。

2.纯功能不会引起副作用 。 副作用是外界可以观察到的系统变化。

const calculateBill = (sumOfCart, tax) => sumOfCart * tax

是否calculateBill是纯净的? 绝对:)它具有两个必要的特征:

  • 该函数仅取决于其参数以产生结果
  • 该功能不会引起任何副作用

《最适当的指南》指出,副作用包括但不限于:

  • 更改文件系统
  • 将记录插入数据库
  • 拨打http电话
  • 突变
  • 打印到屏幕/记录
  • 获取用户输入
  • 查询DOM
  • 访问系统状态
为什么我们的功能应该是纯净的?
除了很棒

可读性->副作用使我们的代码难以阅读。 由于非纯函数不是确定性的,因此它可能会为给定的输入返回几个不同的值。 我们最终编写了需要考虑各种可能性的代码。 让我们来看另一个基于http的示例:

此代码段可能以多种不同方式失败。 如果传递给getTokenFromServerID无效怎么办? 如果服务器崩溃并返回错误,而不是预期的令牌,该怎么办? 需要计划许多突发事件,而忘记其中的一个(或几个!)非常容易。

此外,纯函数更易于阅读,因为它不需要上下文 。 它预先接收了所有需要的参数,并且不会谈论/篡改应用程序的状态。

可测试性 ->由于纯函数本质上是确定性的,因此为它们编写单元测试要简单得多。 您的函数有效或无效😁

并行代码 ->由于纯函数仅取决于其输入,不会产生副作用,因此它们非常适合并行线程运行并使用共享内存的情况。

模块化和可重用性 ->将纯函数视为逻辑的小单元。 由于它们仅取决于您提供给它们的输入,因此您可以轻松地在代码库的不同部分或不同项目之间完全重用函数。

参照透明->这个听起来很复杂 🙄🙄当我第一次阅读标题时,我想喝咖啡休息一下! 简而言之,引用透明性意味着函数调用可以用其输出值替换,而无需更改程序的整体行为。 在创建纯函数时,这作为思想框架最为有用。

它是纯粹的……。 但是它有什么作用吗?

重要的是要注意,尽管纯函数有很多好处, 但在我们的应用程序中仅具有纯函数是不现实的 。 毕竟,如果我们这样做,我们的应用程序将没有任何副作用,因此不会对外界产生任何可观察到的影响。 那会很无聊。 相反,我们将尝试将所有副作用封装到代码库的特定部分。 这样,假设我们已经为纯函数编写了单元测试,并且知道它们正在工作,那么如果我们的应用程序出现问题,则查找起来会容易得多。

让我们变得纯净

让我们通过将以下非纯函数转换为纯函数来结束我们的讨论。 这是一个人为的示例,但演示了如何轻松地将纯代码重构为纯代码。

让我们首先回顾一下此功能不纯的原因。 我们的功能不纯,因为它取决于范围之外的a和b。 另外,它也直接改变(改变)变量的值。 重构此功能的最快方法是

  • 首先确保函数依赖的所有变量都作为参数传递
  • 代替突变(操纵)b和c,我们可以返回将反映新值的新值。

摘要

我们已经介绍了转换代码库以包含更多纯函数的许多好处。 它使我们的代码更易于推理,测试,最重要的是更可预测。 请记住,纯函数并不是要完全消除我们的副作用代码库 这是关于将它们约束到确定的位置并尽可能地消除它们。 当您的程序的大小和复杂性开始增长时,这种方法会多次证明其合理性。

在这里查看下一篇文章 ,我们讨论JS中的功能组合,为什么它们使您的代码更具可读性以及如何立即开始使用它们。

如果此帖子有帮助,请单击下面的拍手ap按钮以表示支持! ⬇⬇

您可以在InstagramLinkedinMedium上关注我。

From: https://hackernoon.com/javascript-and-functional-programming-pt-3-pure-functions-d572bb52e21c

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值