越来越多关于函数式编程的文章,甚至很多语言特性中都要把对函数式编程的支持程度作为一个吸引开发者的feature。
很多年以前,大家都推崇面向对象编程,那么,面向对象编程的和函数式编程的本质区别在哪里?在编程的过程中,我该如何使用呢?
越来越多关于函数式编程的文章,甚至很多语言特性中都要把对函数式编程的支持程度作为一个吸引开发者的feature。
很多年以前,大家都推崇面向对象编程,那么,面向对象编程的和函数式编程的本质区别在哪里?在编程的过程中,我该如何使用呢?
两年前就有这种问题, 还说那么多文章, 挺赞啊
我觉得主要是"数据不变性"这个问题比较重要, 而函数在大量编程语言都实现了, 不那么能说明问题.
软件规模变大, 复杂度变大, 就存在各种问题, 特别是大量的状态需要维护的问题,
函数式编程提倡的解决方案是数据是不可变的, 就没有了一直在改变的状态, 从而降低了复杂度.
同样要模拟真实世界可变的状态, 函数式语言中通过不断生成新的值来实现,
以这样的性能和学习曲线的代价, 函数式语言的抽象更清晰, 换取更强大的功能.
编程过程中如何使用的问题, 无法回答..
两者都是编程范式,从这个角度来讲:
面向对象式编程因为引入了类、对象、实例等概念,非常贴合人类对于世间万物的认知方式和思考方式。对于复杂的事物,人类是如何去认识、归纳、总结的?面向对象式编程就是在努力回答这个问题,而答案的核心就是两个字:抽象。所以面向对象式编程特别适合处理业务逻辑,因此被广泛应用于目前的软件开发当中。(因为我们开发软件就是为了解决问题,面向对象式编程符合人类对于“问题”的认知方式)
尽管如此,与命令式编程范式相比,面向对象式编程依然没有摆脱“着重于数据和状态”的计算模型。在处理业务逻辑的高度抽象层面,面向对象式编程已经非常符合我们的需要了,但是当进入具体运算的时候,在考虑更低一层的代码实现的时候,我们仍然依赖于数据(比如使用变量存储)和状态(比如全局作用域)的计算处理,这就导致了粒度更细的处理还是复杂。
函数式编程最大的特点之一就是摒弃了数据与状态的计算模型,同时也就避免了诸如作用域等细节给我们带来的副作用。实际上对于熟悉过程式编程的人来说,函数这个概念并不难理解,我们经常把对于数据和状态的处理封装为函数去隐藏其中的复杂;而函数式编程范式就是把函数提升为基本的编程要素,从语言设计的层面上着眼于函数本身,消除对数据和状态进行处理的过程。
当然,函数式编程还有其他的特点,只是和面向对象式编程做比较的话,前面说的那些是比较本质性的。对于应用场景来说函数式编程并不“挑食”,不过考虑到它的一些特性(如代码热升级等),函数式编程特别适用于那些需要持续运行的应用。例如Erlang是爱立信为了管理电话系统而开发的,电话系统的升级当然是不能停机的。