函数式编程与面向对象编程的比较

转自:  http://www.cnblogs.com/zhenw/p/6160931.html html

函数式编程做为结构化编程的一种,正在受到愈来愈多的重视。工程中不在只是面向对象编程,更多的人尝试着开始使用函数式编程来解决软件工程中遇到的问题。程序员

            什么是函数式编程?在维基百科中给出了详细的定义,函数式编程(英语:functional programming)或称函数程序设计,又称泛函编程,是一种编程范型,它将电脑运算视为数学上的函数计算,而且避免使用程序状态以及易变对象。函数编程语言最重要的基础是λ演算(lambda calculus)。并且λ演算的函数能够接受函数看成输入(引数)和输出(传出值)。编程

             而在面向对象编程中,面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是种具备对象概念的程序编程范型,同时也是一种程序开发的方法。它可能包含数据、属性、代码与方法。对象则指的是类的实例。它将对象做为程序的基本单元,将程序和数据封装其中,以提升软件的重用性、灵活性和扩展性,对象里的程序能够访问及常常修改对象相关连的数据。在面向对象程序编程里,计算机程序会被设计成彼此相关的对象。设计模式

            对象与对象之间的关系是面向对象编程首要考虑的问题,而在函数式编程中,全部的数据都是不可变的,不一样的函数之间经过数据流来交换信息,函数做为FP中的一等公民,享有跟数据同样的地位,能够做为参数传递给下一个函数,同时也能够做为返回值。安全

 

面向对象编程的优势多线程

            面向对象程序设计能够看做一种在程序中包含各类独立而又互相调用的对象的思想,这与传统的思想恰好相反。传统的程序设计主张将程序看做一系列函数的集合,或者直接就是一系列对电脑下达的指令。面向对象程序设计中的每个对象都应该可以接受数据、处理数据并将数据传达给其它对象,所以它们均可以被看做一个小型的“机器”,即对象。目前已经被证明的是,面向对象程序设计推广了程序的灵活性和可维护性,而且在大型项目设计中广为应用。此外,支持者声称面向对象程序设计要比以往的作法更加便于学习,由于它可以让人们更简单地设计并维护程序,使得程序更加便于分析、设计、理解。同时它也是易拓展的,因为继承、封装、多态的特性,天然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,并且成本较低。并发

            在面向对象编程的基础上发展出来的23种设计模式普遍应用于现今的软件工程中,极大方便了代码的书写与维护。编程语言

            建立型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。函数式编程

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。函数

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

 

面向对象编程的缺点

            面向对象编程以数据为核心,因此在多线程并发编程中,多个线程同时操做数据的时候可能会致使数据修改的不肯定性。

            在如今的软件工程中,因为面向对象编程的滥用,致使了不少问题。首先就是为了写可重用的代码而产生了不少无用的代码,致使代码膨胀,同时不少人并无彻底理解面向对象思想,为了面向对象而面向对象,使得最终的代码晦涩难懂,给后期的维护带来了很大的问题。因此对于大项目的开发,使用面向对象会出现一些不适应的状况。

            面向对象虽然开发效率高可是代码的运行效率比起面向过程要低不少,这也限制了面向对象的使用场景不能包括那些对性能要求很苛刻的地方。

 

函数式编程的优势

            在函数式编程中,因为数据所有都是不可变的,因此没有并发编程的问题,是多线程安全的。能够有效下降程序运行中所产生的反作用,对于快速迭代的项目来讲,函数式编程能够实现函数与函数之间的热切换而不用担忧数据的问题,由于它是以函数做为最小单位的,只要函数与函数之间的关系正确便可保证结果的正确性。

            函数式编程的表达方式更加符合人类平常生活中的语法,代码可读性更强。实现一样的功能函数式编程所须要的代码比面向对象编程要少不少,代码更加简洁明晰。函数式编程普遍运用于科学研究中,由于在科研中对于代码的工程化要求比较低,写起来更加简单,因此使用函数式编程开发的速度比用面向对象要高不少,若是是对开发速度要求较高可是对运行资源要求较低同时对速度要求较低的场景下使用函数式会更加高效。

 

函数式编程的缺点

            因为全部的数据都是不可变的,因此全部的变量在程序运行期间都是一直存在的,很是占用运行资源。同时因为函数式的先天性设计致使性能一直不够。虽然现代的函数式编程语言使用了不少技巧好比惰性计算等来优化运行速度,可是始终没法与面向对象的程序相比,固然面向对象程序的速度也不够快。

            函数式编程虽然已经诞生了不少年,可是至今为止在工程上想要大规模使用函数式编程仍然有不少待解决的问题,尤为是对于规模比较大的工程而言。若是对函数式编程的理解不够深入就会致使跟面相对象同样晦涩难懂的局面。

 

总结

            函数式编程和面向对象编程各有利弊,一个语法更加自由,一个健壮性更好。做为程序员应该对两种编程方式都有所了解,不论是哪一种方式,只要可以很好的解决当前的问题就是正确的方式,毕竟对于软件工程来讲解决问题是最主要的,用的工具反而没有那么重要,就像对程序员来讲语言不重要,重要的是解决问题的思想。

如今这二者的发展趋势是相互借鉴的,许多以面向对象做为基础的语言例如Java等都在新的版本中添加了对函数式编程的支持,而函数式编程则借鉴了一些在面向对象语言里用的一些编译技巧使得程序运行更快

相关文章
相关标签/搜索