函数式编程和⾯向对象编程
函数式编程作为结构化编程的⼀种,正在受到越来越多的重视。⼯程中不在只是⾯向对象编程,更多的⼈尝试着开始使⽤函数式编程来解决软件⼯程中遇到的问题。
什么是函数式编程?在中给出了详细的定义,函数式编程(英语:functional programming)或称函数程序设计,⼜称泛函编程,是⼀种编程范型,它将电脑运算视为数学上的函数计算,并且避免使⽤程序状态以及易变对象。函数编程语⾔最重要的基础是λ演算(lambda calculus)。⽽且λ演算的函数可以接受函数当作输⼊(引数)和输出(传出值)。
⽽在⾯向对象编程中,⾯向对象程序设计(英语:Object-oriented programming,缩写:OOP)是种具有对象概念的程序编程范型,同时也是⼀种程序开发的⽅法。它可能包含数据、属性、代码与⽅法。对象则指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提⾼软件的重⽤性、灵活性和扩展性,对象⾥的程序可以访问及经常修改对象相关连的数据。在⾯向对象程序编程⾥,计算机程序会被设计成彼此相关的对象。
对象与对象之间的关系是⾯向对象编程⾸要考虑的问题,⽽在函数式编程中,所有的数据都是不可变的,不同的函数之间通过数据流来交换信息,函数作为FP中的⼀等公民,享有跟数据⼀样的地位,可以作为参数传递给下⼀个函数,同时也可以作为返回值。
⾯向对象编程的优点
⾯向对象程序设计可以看作⼀种在程序中包含各种独⽴⽽⼜互相调⽤的对象的思想,这与传统的思想刚好相反。传统的程序设计主张将程序看作⼀系列函数的集合,或者直接就是⼀系列对电脑下达的指令。⾯向对象程序设计中的每⼀个对象都应该能够接受数据、处理数据并将数据传达给其它对象,因此它们都可以被看作⼀个⼩型的“机器”,即对象。⽬前已经被证实的是,⾯向对象程序设计推⼴了程序的灵活性和可维护性,并且在⼤型项⽬设计中⼴为应⽤。此外,⽀持者声称⾯向对象程序设计要⽐以往的做法更加便于学习,因为它能够让⼈们更简单地设计并维护程序,使得程序更加便于分析、设计、理解。同时它也是易拓展的,由于继承、封装、多态的特性,⾃然设计出⾼内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,⽽且成本较低。
在⾯向对象编程的基础上发展出来的23种设计模式⼴泛应⽤于现今的软件⼯程中,极⼤⽅便了代码的书写与维护。
创建型模式,共五种:⼯⼚⽅法模式、抽象⼯⼚模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
⾏为型模式,共⼗⼀种:策略模式、模板⽅法模式、观察者模式、迭代⼦模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
⾯向对象编程的缺点
⾯向对象编程以数据为核⼼,所以在多线程并发编程中,多个线程同时操作数据的时候可能会导致数据修改的不确定性。
在现在的软件⼯程中,由于⾯向对象编程的滥⽤,导致了很多问题。⾸先就是为了写可重⽤的代码⽽产⽣了很多⽆⽤的代码,导致代码膨胀,同时很多⼈并没有完全理解⾯向对象思想,为了⾯向对象⽽⾯向对象,使得最终的代码晦涩难懂,给后期的维护带来了很⼤的问题。所以对于⼤项⽬的开发,使⽤⾯向对象会出现⼀些不适应的情况。
⾯向对象虽然开发效率⾼但是代码的运⾏效率⽐起⾯向过程要低很多,这也限制了⾯向对象的使⽤场景不能包括那些对性能要求很苛刻的地⽅。
函数式编程的优点
在函数式编程中,由于数据全部都是不可变的,所以没有并发编程的问题,是多线程安全的。可以有效降低程序运⾏中所产⽣的副作⽤,对于快速迭代的项⽬来说,函数式编程可以实现函数与函数之间
的热切换⽽不⽤担⼼数据的问题,因为它是以函数作为最⼩单位的,只要函数与函数之间的关系正确即可保证结果的正确性。
函数式编程的表达⽅式更加符合⼈类⽇常⽣活中的语法,代码可读性更强。实现同样的功能函数式编程所需要的代码⽐⾯向对象编程要少很多,代码更加简洁明晰。函数式编程⼴泛运⽤于科学研究中,因为在科研中对于代码的⼯程化要求⽐较低,写起来更加简单,所以使⽤函数式编程开发的速度⽐⽤⾯向对象要⾼很多,如果是对开发速度要求较⾼但是对运⾏资源要求较低同时对速度要求较低的场景下使⽤函数式会更加⾼效。
函数式编程的缺点
由于所有的数据都是不可变的,所以所有的变量在程序运⾏期间都是⼀直存在的,⾮常占⽤运⾏资源。同时由于函数式的先天性设计导致性能⼀直不够。虽然现代的函数式编程语⾔使⽤了很多技巧⽐如惰性计算等来优化运⾏速度,但是始终⽆法与⾯向对象的程序相⽐,当然⾯向对象程序的速度也不够快。
函数式编程虽然已经诞⽣了很多年,但是⾄今为⽌在⼯程上想要⼤规模使⽤函数式编程仍然有很多待解决的问题,尤其是对于规模⽐
较⼤的⼯程⽽⾔。如果对函数式编程的理解不够深刻就会导致跟⾯相对象⼀样晦涩难懂的局⾯。
lambda编程总结
函数式编程和⾯向对象编程各有利弊,⼀个语法更加⾃由,⼀个健壮性更好。作为程序员应该对两种编程⽅式都有所了解,不管是哪种⽅式,只要能够很好的解决当前的问题就是正确的⽅式,毕竟对于软件⼯程来说解决问题是最主要的,⽤的⼯具反⽽没有那么重要,就像对程序员来说语⾔不重要,重要的是解决问题的思想。
现在这两者的发展趋势是相互借鉴的,许多以⾯向对象作为基础的语⾔例如Java等都在新的版本中添加了对函数式编程的⽀持,⽽函数式编程则借鉴了⼀些在⾯向对象语⾔⾥⽤的⼀些编译技巧使得程序运⾏更快。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论