vlambda博客
学习文章列表

[译] 应用函数式编程的原则(《程序员应该知道的97件事》第2篇)

(慢慢补上过去篇章的译文,以便参考)

 

原文标题:Apply Functional Programming Principles

原文链接:点击“原文阅读”

推荐指数:⭐⭐⭐⭐ 

 
函数式编程最近重新引起了主流编程社区的兴趣。部分原因是由于函数式编程范式的涌现性[1] emergent properties 能够很好地应对我们的工业向多核心转变所带来的挑战。然而,尽管这的确是一个重要的应用场景,但是这并不是本文劝告你要了解函数式编程的原因。
 
掌握函数式编程范式可以极大地提高你在其他编程范式中编写的代码的质量 。如果你深刻理解并应用了函数式编程范式,你的设计将展现更高程度的 引用透明性[2]
 
引用透明性 是一种非常好的特性: 它意味着函数在相同的输入下始终产生相同的结果,无论在什么时候或什么位置被调用 。也就是说,函数求值不太依赖于——理想下完全不依赖于——可变状态带来的副作用。
 
命令式编程的缺陷通常归因于可变的变量(mutable variables) 。每一个读到这里的人都调查过为什么某些值在特定情况下不符合预期。可见性语义 (visibility semantics) 可以帮助减轻这些潜在的缺陷,或者至少极大地缩小它们出现的位置范围,但是它们真正的罪魁祸首实际可能是 过度地使用了易变性的设计 。 
 
在这方面,我们并没有从工业实践那得到多少帮助。面向对象编程的引入默默地促进了这种设计,因为它通常展示一些例子,在这些例子里一些相对长寿的对象实例愉快地相互调用改变对象属性的方法,这可能是危险的。然而,通过精明的测试驱动设计 (Test-Driven Design,TDD) ,特别是在确保“模拟角色,而不是对象”原则[3]时,不必要的可变性可以在设计过程被移掉。
 
最终的结果是形成一种设计,即 通常通过更多的和更小的函数来处理输入参数而不是引用可变的成员变量,来获得更好的职责分配 。这样会有更少的缺陷,通常也更容易调试。因为在这种设计里我们更容易定位到一个错误的参数值是在什么时候被引入的,相对于通过推断的方式找出一个能导致错误赋值的特定上下文环境。这就形成了更高程度的引用透明性。肯定地,没有什么方式能比学习函数式编程语言更能将这种理念深入你的骨髓。在函数式编程语言中,这种运算模型是语言规范。
 
当然,这种方式并不是在所有场景下都是最佳的。例如,在面向对象的系统中,相比于用户界面开发,这种风格通常会让步给能产生更好结果的领域模型开发(即在协作有助于分解业务规则的复杂性的场景下)[4]。
 
掌握函数式编程范式,你便能明智地将学到的经验应用到其他领域。举个例子,你的那些对象式系统会和引用透明性之美产生共鸣,变得比你认为的更要接近它们的功能对等物[5]。事实上,有些人甚至断言, 当运用到极致,函数式编程和面向对象式编程只是彼此的倒影,就像“阴”“阳”运算的一种形式。 
 

[1] 涌现性(emergent properties),说的是多个要素组成系统后突变出系统组成前单个要素所不具有的性质,有的也称作突变性。推荐阅读另一篇文章《Functional Programming and Emergence》(链接太长,建议搜索) 。

[2] 引用透明性,即在相同的输入情况下,在任何时间和空间情况下,运算结果都是一致的。 

[3] Mock Roles, not Object:http://jmock.org/oopsla2004.pdf

[4] 感觉翻译得一般,附上原文“in object-oriented systems this style often yields better results with domain model development (i.e., where collaborations serve to break down the complexity of business rules) than with user-interface development.”我能理解从研发协作的角度,一般还是优先从领域模型开发角度出发,尤其对于复杂的业务场景下会更加直观。但是,我没太理解为什么要再和用户界面开发相比较。可能是因为用户界面开发的业务模型相对简单,更适合直接从函数式编程思维去着手。

[5] 基本是直译了,感觉中文读起来不是非常很直观原文是“Your object systems (for one) will resonate with referential transparency goodness and be much closer to their functional counterparts than many would have you believe.

 

 (译文结束)


过去发过这篇文章的读后感——。希望大家看完这篇译文可以阅读(或重温)我那篇文字,以作补充🙂。

也欢迎大家留言交流的——😉。



既要从技术的视角看生活

还要从生活的视角看技术

叻道
奔往不惑的IT程序员。分享关于技术、职业、行业和生活的观点、经验、知识和感悟。了解更多请转向菜单栏。
171篇原创内容
Official Account
感谢你的“ 点赞 ”/“ 在看 ”/转发

🙏🙏🙏