Object-Oriented vs. Functional Programming第四章

面向对象语言vs函数式语言

在本报告中,我们已经讨论了许多函数式编程和现有的面向对象设计原则的关系。这些风格差异并没有人们认为的那么大。函数式编程强调通过高阶函数重用和组合行为,和不变性的数据结构也毫无疑问地可以增强我们代码的安全性,而在面向对象代码中也同样支持这些特性,一般能够获得从中益处的通常是这两种方式。我们总是想让代码编写变得更安全和提供更多的机会去灵活地组合行为。
函数式编程是一个思考的过程,你不必特地为了让程序变成函数式的而需要一个新的编程语言,原本语言的一些特性通常都可以协助做到。Java 8的lambda表达式引入使得Java更适应函数式编程,而传统的面向对象编程也已经可以封装数据和行为,现在它就是从函数式编程思想增加更多对行为的支持。
另一些诸如Scala或者Haskell的语言则是贯通函数式的理念。Scala是函数式和面向对象的混合,而Haskell关注纯粹的函数式编程。我们开发这些语言是值得的,而且我们可以从这些语言中找到解决我们问题的有用特性。我们没有必要把代码迁移到Scala或者Haskell,认为只有它们才能让程序变成函数式形式。然而,它们确实提供一些Java缺乏的特性,而有时候是值得去使用不同的编程语言。
对于那些在职业生涯中一直提倡函数式编程的人来,这是一个有争议的观点,我是赞同的。但是,软件开发并不是理想主义又或者是宗教布道,它是有关如何为我们的客户和业务生产可靠软件的工程。一个函数式形式的编程能够帮助我们达到目的,但它本身并不是目的。

程序语言演变

随着时间的推移,编程语言一个有趣的趋势是在更面向对象和更函数式之间逐渐转变。如果我们坐上时间旅行机器回到20世纪80年代,那就会发生许多有趣的变化。更古老的过程式编程语言逐渐被淘汰,面向对象和函数式语言则开始流行起来。
有趣的是,许多早期提倡面向对象和函数式编程的人都混合另一种语言特性。如果你问任何一个面向对象的纯粹主义者,她理想中的编程语言是什么,她将会告诉你是Smalltalk。而Smalltalk 80有着lambda表达式,和Smalltalk的collection库天生有着函数式结构,而且还有map,reduce和filter的等效操作存在(尽管名称不一样)。
许多更早期的函数式编程的纯粹主义者会告诉你Common LISP是最好的函数式语言,有趣的东西又来了,它却有着一个面向对象系统CLOS(Common LISP Object System)。所以回到20世纪80年代,人们有理由意识到,这两种范式都不是启蒙运动的唯一途径。
20世纪90年代,编程方式改变。面向对象面成为面向业务用户的主流编程方法。例如Java和C++的编程语言开始流行。在20世纪末,21世纪早期,Java成为规模庞大的流行语言。2001,年,JavaOne会议已经有了28000参与者,那是摇滚演唱会的规模!
在编写本文时,这个趋势也已经改变了。流行的编程语言正在偏离特定的面向对象或者函数式。当然你也能得到诸如Haskell或者Clojure的旧式坚持,但总分的来说,语言在开始混合。C++和Java 8都加入了lambda表达式并且开始将函数式编程的有用元素用于原本的面向对象功能。不仅如此,而且Java的泛型和C++的模板底层思想都源于函数式编程语言。
较新的语言则一开始就是多范式的。F#就是一个很好的例子,不仅有着函数式形式,而且在面向对象部分保留了和C#一样的特性。诸如Ruby,Python和Groovy的语言能同时用函数式和面向对象形式编写代码,它们的collection API都是具有函数式特性。在上一个年代,JVM上有许多新语言被开发出来,它们也都是混合了函数式和面向对象特性,在这方面就有Scala,Ceylon和Kotlin。
The future is hybrid:从函数式和面向对象两者中选择最好的特性和想法来解决手头的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值