原文链接
函数式编程最近重新引起了主流编程社区的兴趣。其中一个原因就是功能范式能够很好地应对我们的行业朝着多核方向发展所带来的挑战。无论如何,这无疑是一项重要的应用,但这并不是本文劝你要了解函数式编程的原因。
掌握函数式编程范式可以很好地提高你的代码质量。如果你深度理解并应用函数式编程范式,你的设计将拥有更高的引用透明度。
引用透明是一个非常值得拥有的特性:它意味着无论何时何地调用一个函数,同样的输入总能得到同样的输出。换句话说,功能评估对可变状态的副作用影响会越少——理想情况下,毫无影响。
命令式代码的一个主要缺陷可归因于可变变量。每个人读到这里都将调查为何有些值在特殊情况下不符合预期。可见的语义可缓解这些隐藏缺陷,或者至少迅速缩小其所在范围,但它们真正的凶手实际上可能是采用过度可变设计的结果。
并且关于这方面我们不大可能从业内获得太多帮助,面向对象的介绍默认地促进这种设计,因为他们经常显示有相对长生命周期的对象图形组成的例子,并把它们称为设置方法(mutator method我理解为setter),这可能变得很危险。无论如何,通过严谨的测试驱动设计,尤其是当需要保证“模拟角色,并非对象”的时候,可以设计不必要的可变性。
Net Result(最终结果?)是一种设计,通常拥有更好的职责分配、更多更小的函数,作用于传递给他们参数的较小函数,而不是引入可变的成员变量(setter)。他们拥有更少的缺陷,而且也更容易调试,因为它们对与设计中引入的异常值的定位更容易,而不是推断导致错误的上下文分配。这相当于更高的引用透明度,并且没什么能够像这些想法像学函数式编程一样深刻入骨,这种计算模型是常态。
当然,这种方法并非在所有情况下都适用。在面向对象系统中,这些风格相比于用户接口开发,领域模型开发能够得到更好的结果(好比协同能够有效降低业务角色的复杂度)
掌握函数式编程范例,以便于你能将所学到的应用到其他领域。你的对象系统(对于一个而言)将与引用透明的优点产生共鸣,并且更接近它们的功能对等物,比你认为的还要多得多。事实上,有人甚至断言函数式编程和面向对象的顶点就是彼此的影子,是一种计算的阴阳两面。