程序员应该知道的75件事–2.应用函数式编程的理念

译文

函数式编程最近重新成为了编程社区的热点话题。部分原因是由于函数式编程的固有属性完美的解决了现在工业界面临的多核问题。这是函数式编程的一个重大应用,但是这绝对仅仅是你需要了解函数式编程的唯一理由。
掌握函数式编程,可以让你在其他领域中极大的提高你的代码质量。如果你真正的了解函数式编程范式,你的设计绝对会体现出更好的“引用透明性”。

引用透明性是一个非常诱人的性质。它要求无论函数在何时何处调用,它都在相同的输入下持续的产生相同的输出。这就是,函数调用时,返回值对可变状态的依赖依赖非常少,理想情况下,完全不依赖。

在实际开发中,导致这种缺陷的原因是由于变量的出现。每个读这篇文章的人,可能都有这种经历:为什么在特定情况下某些输入并没有产生需要的输出?可视化机制也许可以管理这些隐藏的问题。或者至少将这些问题定位到一部分代码中。但是,如果无节制的引入变量,它确实会导致这种问题的出现。

我们并不能得到产业界在这方面的认同。引入面向对象的设计就已经支持了上面说的那种糟糕设计。因为经常有人画出一张图,图中几个对象高高兴兴的相互调用,并且这几个对象的内部状态一直在变化,这肯定是危险的。但是,使用敏捷的测试驱动设计,特别是确信”Mock Roles, not Objects”时,不必要的变量便可以不被设计引入。

最根本的结果就是,使用许许多多的小函数,并通过函数传参数的设计,会比引用大量的变量更具有责任感。这样做产生的缺陷更少,更进一步说,也更容易调试。因为这么做,很容易便可以发现诡异的变量是从那个阶段引入的,而不是像传统编程那样,需要依赖特定的上下文这个错误的结果才会出现。这种设计需要高度的引用透明性。并且可能没有什么比你学习一种函数式编程语言更能让你深入骨髓的体会这中特性的好处了。因为函数式编程语言的计算模型是规范的。

当然,这种事件也并不是适用于任何系统的。例如,在OO系统中,这种设计原则可能更适用于领域模型开发(也就是,使用各种服务的协作来降低业务的复杂度),而不是用户界面。

掌握一种函数式编程范式,你就可以审慎而明智的在其他领域中应用到你学习的东西。你的面向对象系统也会学习到引用透明性的好处,并且更像函数式的风格。事实上,很多人甚至认为,极端的函数式编程正好是面向对象编程的对立面,这就像计算机程序界的阴和阳。


想法

  • 这篇文章可以说是我学习函数式编程的原因。其实我一直对学习新语言非常抵触,更多的时候用就好了。真正学习过的语言,对我自己而言只有C++。但是,看完这篇文章后,便多了一个erlang。
  • 函数式编程确实有很多不同的地方,语法方面倒是其次。我觉得,有人说java是第一门为了让程序员轻松而产生的语言,但是我觉得,函数式编程是真的为了解决程序而产生的语言,而不是简单的对计算机的抽象。
  • 在这周的前几天,在libcstl的群里和群里争论并发模型的问题。我是坚持单线程多进程+coroutine,在网页服务器上,绝对比多线程模型优良的多的。比如,node.js的服务器要远比tomcat服务器更适用于现在的网络编程开发。和一个大叔交流的很好,大叔最后说了句话我认为很多。在局部下,多线程模型更为简单和有优势。不过,群里的其他人我就很无语了。随便说说,就扯到“你怎么能不用多线程,全局变量呢?”,“你不用全局变量,多线程怎么写程序?”,“你会不会写程序?”。国人程序员的浮躁和素质可见一斑了。而且动不动就人身攻击这点很无聊。
  • 所以,还是混邮件列表吧。

本文翻译,源自项目TranslateTogether。欢迎大家访问我的博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值