为什么要考虑函数式编程

哈Ha! 我向您介绍我的文章“为什么要考虑函数式编程”的翻译,该文章专门介绍了函数式编程。

图片

为什么要考虑函数式编程? 让我们回答以下问题:

  • 您的项目总是按时进行吗?
  • 用户有任何投诉吗?
  • 项目支持需要很长时间吗?
  • 新功能是否总是与现有架构完全吻合?

如果对以上所有问题的回答都是肯定的,则您无需进行任何更改,您的团队是和谐的员工,方法论和工具的罕见例子。 否则,您应该对解决问题的新方法持开放态度,包括对所使用的硬件和编程语言进行认真的研究。

初看


如您所知,程序员是极富创造力的人,但同时,他们在选择编程语言时往往会遵循一些趋势。 在众多的语言中,功能性语言越来越受到粉丝的欢迎,世界各地的公司也越来越自信地使用它们。 功能语言的使用可以显着提高程序员的工作效率和质量。 自然,这取决于任务,语言和编程技能的组合。 在这种情况下,程序员只需描述自己想要的内容,而无需列出获得结果所需的动作序列。 因此,开发人员专注于高层的“要求”,而不是停留在底层的“如何做”。

函数式编程是通过编译一组函数来编写程序的样式。 它的基本原理是将几乎所有内容包装在一个函数中,编写许多小的可重用函数,然后依次调用它们。 另外,这些功能的结构必须符合某些规则并解决一些问题。

因此,如果可以通过组合调用多个函数来解决任何问题,则:

  1. 如何实现if-else条件?
  2. 如何使用Null Exception解决技巧?
  3. 如何确保该功能真正“可重用”并且可以在任何地方使用?
  4. 如何确保传输到我们功能的数据已更改并可以在其他地方使用?
  5. 如果一个函数采用多个值,但是当组合成一个链时,您只能传递一个函数,那么如何使该函数成为链的一部分?

为了解决所有这些问题,功能语言提供了数学工具和解决方案,例如单子,函子等。

函数式编程的好处早已为公众所认可。 成功的软件开发通常可以归结为简化现有机制,使新应用程序能够适应现代用户的需求。 同时,我们必须急于设法在短时间内为客户提供无限可能的产品。 当将已开发的应用程序划分为易于测试的几个简单功能时,不断变化的要求就容易遵循。 这样的算法没有棘手的副作用,也没有旨在在全球范围内实现结果的抽象表述。

那么,为什么专家这么长时间忽略函数式编程呢? 为什么今天变得如此普遍?

现实世界中的函数式编程在哪里使用?


由于函数式编程主要是编写代码的一种方法,因此您可以在任何语言中使用其原理。 但是,有些语言是通过功能方法专门磨练的。 根据GitHub和Stack Overflow的说法,诸如Elm和Elixir之类的更现代的功能语言正逐渐自信地获得普及。 JavaScript的日益普及也增加了对该语言中使用的函数式编程概念的兴趣。 此外,功能编程领域经验丰富的开发人员随后开始在Single Web Application-SPA环境中工作,因此,我们拥有Redux,React,MobX和数百万人使用的其他库。

图片

现实生活中的例子:

  • 阿帕奇火花
  • 烫伤(来自Twitter)
  • 阿帕奇卡夫卡
  • Finagle(来自Twitter)
  • AutoCAD
  • emacs(LISP)

那么什么是函数式编程,这种繁荣从何而来?为什么要考虑它呢? 让我们弄清楚。

关于函数式编程


几年前,只有很少的专家对函数式编程有所了解,但是在过去的三年中,几乎所有大型应用程序的代码库都积极使用了函数式编程的思想。 这是有客观原因的:

  • 函数式编程可让您编写更简洁和可预测的代码
  • 更容易检查(尽管从头开始学习并不容易)

使用功能编程进行软件开发的主要特征


  • 清理功能非常简单。 它应始终返回相同的结果。 使用相同的X和Y值,我们总是得到相同的函数结果。 可预测性在函数式编程的程序执行过程中起着重要作用。
  • 避免一般情况,易变数据和副作用;
    不变对象是指其状态在创建后无法更改的对象。 不可变对象比可变对象更面向线程。 如果该功能无法正常运行,将导致不良的副作用。 在命令式语言中,实现过程中的函数可以读取和更改全局变量的值并执行输入/输出。 因此,如果我们使用相同的参数两次调用相同的函数,则可能会得到两个不同的结果。 此功能称为副作用。

    函数式编程可帮助我们编写面向线程的代码。
  • 声明式而非命令式方法的盛行。

功能组成


函数组合是一种函数编程方法,其中涉及将某些函数作为其他函数的参数来调用,以创建较简单函数的复杂组合。 这种布局方法使您可以采用两个或多个简单功能,并将它们组合为一个更复杂的功能,该功能以逻辑顺序对任何数据执行子功能。 要获得此结果,可以将一个函数放在另一个函数中,并对内部函数的结果执行外部函数的操作,直到获得结果为止。 并且结果可能会有所不同,具体取决于应用功能的顺序。

结果,在调用纯函数的逻辑顺序不同且参数的值相同的情况下,我们将获得更复杂的功能,这些功能可为我们提供所需的结果并使其可预测。

图片

函数式编程的好处


函数式编程有助于使代码更易于理解,可预测和易于阅读。 使用函数式编程的原理有助于消除具有不可预测行为的不必要抽象,从而使程序更可预测并减少可能的错误数量。

在函数式语言中,函数可以作为参数传递给其他函数或作为结果返回。 带有函数参数的函数称为高阶函数或函数。 最受欢迎的功能是卡。 一种对列表的所有元素应用特定功能的映射,该映射根据结果形成另一个列表。

在纯函数式编程中,缺少赋值运算符,无法更改和销毁对象,只能通过解码和综合现有对象来创建新对象。 内置的垃圾收集器将处理不必要的对象。 因此,在纯函数式语言中,所有函数都没有副作用。 但是,这不会阻止该语言模仿某些有用的命令式属性,例如异常和可变数组。 当然,有一些特殊的技巧。

函数式编程的缺点


  • 函数式编程的问题之一是它与您已经知道的有所不同。 您必须在必要的情况下重新学习很多已经知道的知识! 许多已经知道他们已经知道的知识的经验丰富的开发人员不会以不同的方式解决问题。 进行不同的思考需要花费时间和精力。
  • 编写简洁的函数很容易,但是将它们组合成一个完整的应用程序会使事情变得更加复杂。
  • 可预测的性能大问题。 仅使用不可变的值和递归可能会导致性能问题,包括RAM使用率和速度,因此对于软或硬实时系统或嵌入式计算,大多数功能语言都不是特别好的选择。
  • 当程序员本人一段时间后不再理解自己编写的内容时,函数式编程就会以过于抽象的形式编写代码。
  • 纯功能和I / O并没有真正混在一起。

结论


如果您和您的开发团队认为您的编码风格不能为您提供业务领域中必要的复杂性管理级别,并且由于不必要的语法垃圾而阻塞了代码,从而浪费了时间,请尝试函数式编程。 因此,在涉及大量计算或数据转换,并行/异步编程的领域中,您将获得沉浸在函数式编程中的显着优势。

用功能语言编写代码使您有机会从不同的角度看问题,从而可以更有效地开发解决方案。 而且,这只会增加表达想法的方式。

使用功能性编程范例开发解决方案时,您将越来越快地加快整个开发过程,变得越来越有经验。 与命令式程序员的移动方式相比,您似乎在高速驾驶汽车。

函数式编程可以更好地改变您的编码风格。 但是要掌握它是非常困难且耗时的,并且许多帖子和教程都没有考虑细节(例如,monad,应用函子等),也没有提供实用的示例来帮助初学者每天使用功能强大的函数式编程方法。 但是您可以吸引经验丰富的程序员加入团队,这将节省您的时间,精力和金钱。

图片

如果正确执行所有操作,结果将更易于理解,简洁,并且您将拥有可读的代码。 那不是我们所有人想要的吗?

罗曼·塔卢耶夫(Roman Taluev)
Quasarbyte软件开发人员

Source: https://habr.com/ru/post/zh-CN438396/


All Articles