文章目录

  • 目录
    • 1.函数式编程和面向对象编程概念
      • 1.1 函数式编程
      • 1.2 面向对象编程
    • 2.函数式编程和面向对象编程的优缺点
      • 2.1 函数式编程
          • 优点
        • 缺点
      • 2.2 面对对象编程
        • 优点
        • 缺点
    • 3.为什么在并行计算中函数式编程比较好
      • 3.1 什么是并行计算
      • 3.2 函数式编程兴起原因

目录

1.函数式编程和面向对象编程概念

1.1 函数式编程

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

1.2 面向对象编程

面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是种具有对象概念的程序编程范型,同时也是一种程序开发的方法。它可能包含数据、属性、代码与方法。对象则指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据。在面向对象程序编程里,计算机程序会被设计成彼此相关的对象。
对象与对象之间的关系是面向对象编程首要考虑的问题,而在函数式编程中,所有的数据都是不可变的,不同的函数之间通过数据流来交换信息,函数作为FP中的一等公民,享有跟数据一样的地位,可以作为参数传递给下一个函数,同时也可以作为返回值。
面向对象编程,这种编程是把问题看作由对象的属性与对象所进行的行为组成。基于对象的概念,以类作为对象的模板,把类和继承作为构造机制,以对象为中心,来思考并解决问题。

2.函数式编程和面向对象编程的优缺点

2.1 函数式编程

优点
  • 支持闭包和高阶函数,闭包是一种可以起函数的作用并可以如对象般操作的对象;而高阶函数是可以以另一个函数作为输入值来进行编程。支持惰性计算,这就可以在求值需要表达式的值得时候进行计算,而不是固定在变量时计算。还有就是可以用递归作为控制流程。函数式编程所编程出来的代码相对而言少很多,而且更加简洁明了。
  • 在函数式编程中,由于数据全部都是不可变的,所以没有并发编程的问题,是多线程安全的。可以有效降低程序运行中所产生的副作用,对于快速迭代的项目来说,函数式编程可以实现函数与函数之间的热切换而不用担心数据的问题,因为它是以函数作为最小单位的,只要函数与函数之间的关系正确即可保证结果的正确性。
  • 函数式编程的表达方式更加符合人类日常生活中的语法,代码可读性更强。实现同样的功能函数式编程所需要的代码比面向对象编程要少很多,代码更加简洁明晰。函数式编程广泛运用于科学研究中,因为在科研中对于代码的工程化要求比较低,写起来更加简单,所以使用函数式编程开发的速度比用面向对象要高很多,如果是对开发速度要求较高但是对运行资源要求较低同时对速度要求较低的场景下使用函数式会更加高效。

缺点

  • 由于所有的数据都是不可变的,所以所有的变量在程序运行期间都是一直存在的,非常占用运行资源。同时由于函数式的先天性设计导致性能一直不够。虽然现代的函数式编程语言使用了很多技巧比如惰性计算等来优化运行速度,但是始终无法与面向对象的程序相比,当然面向对象程序的速度也不够快。
  • 函数式编程虽然已经诞生了很多年,但是至今为止在工程上想要大规模使用函数式编程仍然有很多待解决的问题,尤其是对于规模比较大的工程而言。如果对函数式编程的理解不够深刻就会导致跟面相对象一样晦涩难懂的局面。

2.2 面对对象编程

优点

  • 面向对象编程:面向对象有三个主要特征,分别是封装性、继承性和多态性。类的说明展现了封装性,类作为对象的模板,含有私有数据和公有数据,封装性能使数据更加安全依赖的就是类的特性,使得用户只能看到对象的外在特性,不能看到对象的内在属性,用户只能访问公有数据不能直接访问到私有数据。类的派生功能展现了继承性,继承性是子类共享父类的机制,但是由于封装性,继承性也只限于公有数据的继承(还有保护数据的继承),子类在继承的同时还可以进行派生。而多态性是指对象根据接收的信息作出的行为的多态,不同对象接收同一信息会形成多种行为。
  • 面向对象程序设计可以看作一种在程序中包含各种独立而又互相调用的对象的思想,这与传统的思想刚好相反。传统的程序设计主张将程序看作一系列函数的集合,或者直接就是一系列对电脑下达的指令。面向对象程序设计中的每一个对象都应该能够接受数据、处理数据并将数据传达给其它对象,因此它们都可以被看作一个小型的“机器”,即对象。目前已经被证实的是,面向对象程序设计推广了程序的灵活性和可维护性,并且在大型项目设计中广为应用。此外,支持者声称面向对象程序设计要比以往的做法更加便于学习,因为它能够让人们更简单地设计并维护程序,使得程序更加便于分析、设计、理解。同时它也是易拓展的,由于继承、封装、多态的特性,自然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低。
  • 在面向对象编程的基础上发展出来的23种设计模式广泛应用于现今的软件工程中,极大方便了代码的书写与维护。
    • 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
    • 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
    • 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

缺点

  • 面向对象编程以数据为核心,所以在多线程并发编程中,多个线程同时操作数据的时候可能会导致数据修改的不确定性。
  • 在现在的软件工程中,由于面向对象编程的滥用,导致了很多问题。首先就是为了写可重用的代码而产生了很多无用的代码,导致代码膨胀,同时很多人并没有完全理解面向对象思想,为了面向对象而面向对象,使得最终的代码晦涩难懂,给后期的维护带来了很大的问题。所以对于大项目的开发,使用面向对象会出现一些不适应的情况。
  • 面向对象虽然开发效率高但是代码的运行效率比起面向过程要低很多,这也限制了面向对象的使用场景不能包括那些对性能要求很苛刻的地方。

3.为什么在并行计算中函数式编程比较好

3.1 什么是并行计算

并行计算或称平行计算是相对于串行计算来说的。它是一种一次可执行多个指令的算法,目的是提高计算速度,及通过扩大问题求解规模,解决大型而复杂的计算问题。所谓并行计算可分为时间上的并行和空间上的并行。 时间上的并行就是指流水线技术,而空间上的并行则是指用多个处理器并发的执行计算。[百度百科]

3.2 函数式编程兴起原因

随着web2.0的到来,无论是数据的数量还是数据的形式都大大的增加。而随着芯片制造工艺的限制,硬件摩尔定律的失效,而大数据的摩尔定律的发展,对计算机的计算能力要求越来越高,压力也越来越大。其中并行计算是一个很好的解决方法。而目前比较流行的一种并行计算方式是使用集群进行并行计算。这就需要我们把一个大的任务进行拆解成很多小问题,然后在不同的机器上单独进行运行,最终将计算结果进行合并,这便是Hadoop中MapReduce的思想。函数式编程具有:不可变性和并行操作性两个特点,使得函数式编程思想在并行计算中发挥比较大的作用。这也是函数式编程兴起的原因。

初探函数式编程和面对对象式编程相关推荐

  1. 函数式编程和面向对象式编程_比较函数式编程,命令式编程和面向对象的编程

    函数式编程和面向对象式编程 As Oracle Corporation has introduced some Functional constructs in Java SE 8, now-a-da ...

  2. 函数式编程语言python-函数式编程初探

    诞生50多年之后,函数式编程(functional programming)开始获得越来越多的关注. 不仅最古老的函数式语言Lisp重获青春,而且新的函数式语言层出不穷,比如Erlang.clojur ...

  3. 初探数通网络开放可编程简介

    文章目录 网络运维面困难与挑战 行业趋势 面临困难 数通网络可开放编程简介 应用场景 多厂商设备快速适配 新业务快 网络变更可靠 管控析全栈可编程 特性介绍 动态加载软件包 事务机制 数据一致性 用户 ...

  4. 【学习笔记】Part1·JavaScript·深度剖析-函数式编程与 JS 异步编程、手写 Promise(二、JavaScript 异步编程)

    [学习笔记]Part1·JavaScript·深度剖析-函数式编程与 JS 异步编程.手写 Promise(课前准备) [学习笔记]Part1·JavaScript·深度剖析-函数式编程与 JS 异步 ...

  5. 函数式编程和响应式编程

    到底什么是函数式,他和命令式编程和面向对象有什么区别.(知乎上已经有很多讨论了,感兴趣的话,我在结尾的地方贴了一些链接.) 总的来说,在函数式中,函数是一等公民,函数能作为变量的值,函数可以是另一个函 ...

  6. 初探儿童编程,如何学习编程及幼儿逻辑训练的必要性

    前言 这两年儿童编程很火,火得"不能让孩子输在起跑线上"的爸爸妈妈们又又又焦躁起来,又又开始给孩子报编程培训班.儿童学编程合适吗?我认为:很合适,只要他们有兴趣.兴趣不是天生的是培 ...

  7. python核心编程电子书_Python核心编程 PDF 超清第3版

    给大家带来的一篇关于Python编程相关的电子书资源,介绍了关于Python编程.Python核心编程方面的内容,本书是由人民邮电出版社出版,格式为PDF,资源大小22.4 MB,卫斯理编写,目前豆瓣 ...

  8. 编程开发软件java编程入门到精通,大量教程

    Java开发工程师前途在哪里?常听到有人这么说:现在Java开发工程师的前途在哪儿?如何成为一名优秀的Java工程师?我的路该怎么走?很多人想着自己初出茅庐,不知这个专 编程,并将它作为一份事业来持之 ...

  9. socket recv 服务端阻塞 python_网络编程(基于socket编程)

    网络编程(基于socket编程) socket套接字:应用程序通常通过socket"套接字"向网络发送请求或应答网络请求,是主机间或同一计算机中的进程间相互通讯 socket是介于 ...

最新文章

  1. pta7-3 统计不及格人数_编写程序,统计学生的成绩信息
  2. sqlserver往oracle写数据,Sqlserver连接oracle进行读写数据库
  3. 首次使用gradle出现Could not find method leftShift() for arguments解决办法
  4. 使用VScode开发C语言程序,环境安装配置,保姆级教程
  5. session的存储方式和配置
  6. c++incline函数
  7. Adobe正式在中国市场推出Creative Cloud创意应用软件
  8. 如何使用VideoProc从MKV提取字幕?
  9. H5调用摄像头实现视频拍摄及iOS兼容性问题
  10. 高德地图API(使用浏览器ip实现精确定位)
  11. linux中如何分割字符串数组中,Linux教程——Shell中字符串与数组操作实例
  12. 电器元件——LM7805
  13. 超闩锁和子闩锁如何工作的
  14. Java break outer和continue outer的用法
  15. 这篇文章告诉你三个能给视频去水印的软件
  16. Ajax执行向php请求的js脚本
  17. Oracle索引梳理系列(一)- Oracle访问数据的方法
  18. 关于csdn写的博文未显示,待审核状态
  19. 软件工程7-软件测试
  20. 【工业互联网】思科大中华区网络安全事业部技术总监徐洪涛:工业互联网的安全防护思路...

热门文章

  1. linux内核I2C子系统学习(一)
  2. 中如何计算工龄_在Substrate中如何计算交易权重
  3. java正则表达式及api_Java API 之 正则表达式
  4. python离线安装pip出现timeout_Python pip安装包出现timeout的解决办法,修改国内的镜像源...
  5. Java设计模式、框架、架构、平台之间的关系
  6. linux打包启动这着的文件,linux – 打开一个RPM文件并重新打包它
  7. this指针不全等于对象地址
  8. REVERSE-PRACTICE-BUUCTF-30
  9. oracle扩容日志文件,调整Oracle Redo Logfile日志文件的大小
  10. 【HDU - 1937 】Finding Seats(二维前缀和+尺取法)