Apply Functional Programming Principles

     Edward Garson

 

     函数式编程最近又重新引起了主流编程社区的兴趣。一部分原因来自于函数式编程范式中聚合性质(emergent properties)的出现非常好的解决了由于我们的工业逐渐向多核转变所带来的挑战。但是,虽然可以肯定的说那是一项非常重要的应用,这并不是这篇文章用来说服你去了解函数式编程的根本原因。

     对函数式编程范式的理解和掌握能很大程度上提高你在别的情景环境下编写代码的质量。如果你对其理解到了一定深度,并在实际中应用范式,你的设计能够展现出一个较高程度的引用透明(referential transparency)。(tip:which means that for any given input the method call could be replaced by its result without affecting the program’s semantics.)

     引用透明是一个非常值得拥有的性质:它暗示着函数对于相同的输入总是产生相同的结果,不论它是在哪儿或是什么时候被触发。即,函数的求值更少地依赖于--更理想化的说,更本不依赖于--可变状态的副作用。

      在命令式代码(imperative code)中一个引起缺陷的最主要原因可归于变量的易变性。每个阅读这些代码的人都会想要去探究为什么在某些特定情况下,某些某些产出的值并非所想象的那样。可视性语义(visibility semantics)能够帮助减轻和缓解这些潜伏(insidious)的缺陷,或者至少极大地缩小他们可以出现的场合,但是他们造成的真正的问题实际上应该在于采用过度的可变性的先天性设计。

      而且在这一点上,我们肯定没有从工业标准那里得到任何帮助。对面向对象的介绍和宣传对这种设计起了无声的宣传作用,因为他们经常展示由那些总是开心地互相调用赋值方法的生命周期有点长的对象构成的图所组成的例子,他们是非常危险的。

      但是,自从有了TDD, 特别是当你确定地“模拟角色,而不是对象”,不必要的易变性可以在设计中被剔除。

      最终结果就是这样一种设计,更多的更小的函数作用于被传入给他们的参数,责任被更好地分配给了他们,而不是这些函数去引用易变的成员变量。更少的缺陷会出现,同时,他们会更容易地去debug,因为在这种设计中去定位某个被引入的离群的值会非常容易,否则你就得去在某个产生错误赋值的上下文中进行推导演算。这些都意味着(adds up to)一个更高水平的引用透明,同时可以确定的是没有任何东西会比去学习一门函数式编程语言更能使你把这些思想深深地印刻到你的骨子里,因为在这些语言中,这样的计算模式完全就是标准化的(norm)。

       当然,并非这些方法在所有情况下都是最优的选择。比如,在面向对象系统中,这种编程风格总会在领域模型的开发中(比如,通过协作来打破(减轻?)业务规则的复杂性)比基于UI开发得到更好的效果。

       掌握函数式编程范式,这样你就能非常明智地将你所悟所学应用到别的领域。你的对象系统(一方面)会与引用透明的优点产生共鸣,同时也会超乎你想象的接近他们在函数式编程领域的具有同样功能的系统。实际上,有些人甚至会断言,从他们的最高处看下去,函数式编程和面向对象编程不过是相互之间的倒影,犹如阴与阳的一种计算形式。(a form of conputational yin and yang.)

 

燮羽 2010/5/22

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值