翻译:为什么FI对OOP程序员也很重要?

哈Ha! 我向您介绍了Roman Provaznik的文章翻译- 为什么FP对OOP开发人员也很重要?

一旦我对函数式编程非常感兴趣,便开始研究它,并告诉所有朋友有关它的美妙之处。 后来,我从OOP程序员的角度看了一篇有关函数式编程的文章,并决定为您翻译它。 不要严格判断,这是我的第一篇译文。

我被要求从面向对象的角度对函数式编程发表个人看法。 我什至被迫在Medium上创建一个帐户。 作为一名前OOP开发人员,目前,有一天我将成为一名真正的FP程序员,我想我有话要说:

欢迎旅客


如果您在过去的60年中没有在另一个星球上度过(如果是这样,欢迎回来,旅行者),您可能已经听说过函数式编程。 如果您遵循软件行业的当前趋势,则每天都会听到诸如“功能编程”,“不变性”,“纯功能”和“组成”之类的术语。 所有这些听起来都很酷,令人愉悦并且可以理解,直到您认为:“嘿,我是OOP程序员,我不能(或不想)改变范例。 函数式编程能给我带来什么? 我为什么要打扰?” 作为来自OOP领域的FP程序员/发烧友,我想分享很多年前我自己想知道的内容。 您可以谈论几个小时,所以让我们选择三个最重要的事情。

不变性


FP的传统优势是单词,通常每个功能演示的演示至少要使用两张幻灯片。 FP银弹吧? 不完全是 尽管事实上这个词最常被功能程序员使用,但它并不是FP独有的。 作为OOP开发人员,您可以(几乎)实现与FP开发人员相同的不变性。 实际上,这很容易,您只需要在对象和集合上稍有不同即可。 想象一下,您没有更改原始版本,而是创建了一个新版本。 已将商品添加到收藏夹? 太好了! 您没有更改原始集合,而是只有一个包含添加项的新集合。 更改了对象的属性? 哇! 现在,您有了一个具有更改属性的新对象。

我知道,我知道-听起来很奇怪。 但是,这种意识上的微小转变将使您睡得更平静。 一旦您了解到您的对象无法更改(只能复制),您将确定团队中没有人可以将它们重新分配到其他位置。 这就像借用您最喜欢的古老的Pink Floyd录音带,而不必担心将其带回Justin Bieber重新录制。 另外,您的代码将具有完全可追溯的方法,在这些方法中会发生真正的更改(在此方法中,将基于原始对象创建新对象)。 而且,我几乎忘记了您是C#还是Java开发人员,您已经通过在最初不可变的行上调用“ ToLower()”,“ Trim()”来使用它们。 基本上,这并不是什么新鲜事。

纯功能


另一个时髦的短语被误认为是FP。 什么是“纯功能”? 简而言之,纯函数是在不与“外部世界”(I / O操作,一般状态等)进行通信的情况下以相同的输入值返回相同结果的函数,也称为“副作用”。 此类函数的一个典型示例是获取字符串长度(您是否要连接到数据库以计算字符串中的字符数?),计算正弦值等等。 这样做对OOP有什么好处? 与FP相同。 如果使用纯函数(或方法),则确切知道每个输入值将得到什么结果。 而且,如果您的代码不依赖某些隐藏状态,则测试起来非常容易,并且您也不必费心编写单元测试。 我们都知道,如果不与外界互动,我们的软件将毫无用处,但是纯输入代码(使用纯函数/方法编写)的纯代码(仅在系统边界处输入输出)与每个方法都取决于内部状态的系统之间存在明显差异,通过其他方法更新。

再一次,对I / O方法的一点重新思考就可以提供FP的所有优点,而且测试变得如此简单,最终将开始带来乐趣。

声明式VS命令式


我们已经改变了对代码的看法-我们可以编写更安全(不可变)和可测试(干净)的代码。 现在该走得更远,改变确定我们的软件应该做什么的方法。 OOP与AF有何不同? 在功能世界中,我们定义“应该发生”而不是确定“应该如何发生”。 当然,程序中仍有执行该特定操作的部分,但是在这里重要的是专注于表达式而不是语句。 这就是您可以使用自己喜欢的OOP语言进行的操作。

例如,如果您熟悉LINQ(来自C#)之类的内容,那么当您将代码读为“是的,这里我从集合中选取10个元素,按字母顺序对它们进行排序并将它们用作以下参数时,您已经知道查询表达式的好处。方法。” 您可能已经阅读了成千上万个类似LINQ的表达式,而不必考虑背后的实际情况。 最重要的是集中精力于真正重要的事情。

总结


我认为现在就足够了。 我不想最终将FP当作灵丹妙药来出售。 世界不仅是黑白的。 事实是,FP对我来说很难做到。 几乎与适当的OOP一样复杂。 但是它绝对值得一试。 从我的角度来看,OOP与FP大体上是我对代码及其结构的思考。 我如何看待依赖性,副作用,I / O和测试的整个世界。 总而言之,“无论语言,主题领域和平台如何,一种实用的方法都会有所帮助。”

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


All Articles