初探函数式编程和面对对象式编程

文章目录

  • 目录
    • 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的思想。函数式编程具有:不可变性和并行操作性两个特点,使得函数式编程思想在并行计算中发挥比较大的作用。这也是函数式编程兴起的原因。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445232.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux常用解压和压缩文件的命令

linux常用解压和压缩文件的命令 .tar 解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)———————————————.gz解压1:gunzip FileN…

Python外(4)-读写mat文件

读写mat文件1.读取2.写入.mat 是matlab中数据存储的标准格式,Python中能够通过库scipy读取和保存。导入scipy库 from scipy import io 1.读取 io.loadmat(file_name, mdictNone, appendmatTrue, **kwargs) 简便方式: io.loadmat(file_name) append mat–…

Linux下的xml文件的创建

创建一个xml文档流程如下: l 用xmlNewDoc函数创建一个文档指针doc; l 用xmlNewNode函数创建一个节点指针root_node; l 用xmlDocSetRootElement将root_node设置为doc的根结点; l 给root_node添加一系列的子节点&#x…

压力测试http_load 通过修改配置测试https协议成功了。

到http://www.acme.com/software/http_load/ 下载http_load ,安装也很简单直接make;make instlall 就行。 如果你需要测试https,你必须将 Makefile中 # CONFIGURE: If you want to compile in support for https, uncomment these # definitions. You w…

面向对象设计与分析40讲(16)静态工厂方法模式

前面我们介绍了简单工厂模式,在创建对象前,我们需要先创建工厂,然后再通过工厂去创建产品。 如果将工厂的创建方法static化,那么无需创建工厂即可通过静态方法直接调用的方式创建产品: // 工厂类,定义了静…

搜索详解

搜索 一.dfs和bfs简介 深度优先遍历(dfs) 本质: 遍历每一个点。 遍历流程: 从起点开始,在其一条分支上一条路走到黑,走不通了就往回走,只要当前有分支就继续往下走,直到将所有的点遍历一遍。 剪枝&a…

Python外(5)-for-enumerate()-zip()

for循环小技巧技巧1:enumerate()技巧2:打包两个可遍历数据,一起循环-zip()技巧1:enumerate() 在使用pytorch训练网络的过程中,官方教程给出了 for i, data in enumerate(trainloader, 0): 这涉及到enumerate函数的使用…

特征工程总结

目录1 特征工程是什么? 2 数据预处理   2.1 无量纲化     2.1.1 标准化     2.1.2 区间缩放法     2.1.3 标准化与归一化的区别   2.2 对定量特征二值化   2.3 对定性特征哑编码   2.4 缺失值计算   2.5 数据变换 3 特征选择   3.1 Filter …

Jmeter测试并发https请求成功了

Jmeter2.4 如何测试多个并发https请求,终于成功了借此机会分享给大家 首先要安装jmeter2.4版本的,而且不建议大家使用badboy,因为这存在兼容性问题。对于安装,我就不讲了,我就说说如何测试https,想必大家都…

关系数据库——sql基础1定义

关系数据库标准语言SQL 基本概念 SQL语言是一个功能极强的关系数据库语言。同时也是一种介于关系代数与关系演算之间的结构化查询语言(Structured Query Language),其功能包括数据定义、数据查询、数据操纵和数据控制。 SQL的特点&#xff…

libcurl编程

一、curl简介 curl是一个利用URL语法在命令行方式下工作的文件传输工具。它支持的协议有:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP。curl同样支持HTTPS认证,HTTP POST方法, HTTP PUT方法, FTP上传, kerberos认证, HTTP上传, 代理服…

大数据学习(09)--Hadoop2.0介绍

文章目录目录1.Hadoop的发展与优化1.1 Hadoop1.0 的不足与局限1.2 Hadoop2.0 的改进与提升2.HDFS2.0 的新特性2.1 HDFS HA2.2 HDFS Federation3. 新一代的资源管理器YARN3.1 MapReduce1.0 缺陷3.2 YARN的设计思路3.3 YARN 体系结构3.4 YARN工作流程3.5 YARN框架与MapReduce1.0框…

Java多线程常用方法

start()与run() start() 启动线程并执行相应的run()方法 run() 子线程要执行的代码放入run()方法 getName()和setName() getName() 获取此线程的名字 setName() 设置此线程的名字 isAlive() 是判断当前线程是否处于活动状态。活动状态就是已经启动尚未终止。 curren…

MachineLearning(2)-图像分类常用数据集

图像分类常用数据集1 CIFAR-102.MNIST3.STL_104.Imagenet5.L-Sun6.caltech-101在训练神经网络进行图像识别分类时,常会用到一些通用的数据集合。利用这些数据集合可以对比不同模型的性能差异。下文整理常用的图片数据集合(持续更新中)。基本信息对比表格…

Linux网络编程实例详解

本文介绍了在Linux环境下的socket编程常用函数用法及socket编程的一般规则和客户/服务器模型的编程应注意的事项和常遇问题的解决方法,并举了具体代 码实例。要理解本文所谈的技术问题需要读者具有一定C语言的编程经验和TCP/IP方面的基本知识。要实习本文的示例&…

python的命令解析getopt.getopt()函数分析

【转自http://hi.baidu.com/javalang/blog/category/Python】 可以参考http://docs.python.org/lib/module-getopt.html # -*- coding: cp936 -*-import getoptimport sysdef usage():print Help Information:-h: Show help information-xValue:...if __name____main__:#set d…

博弈论基础

博弈论总结 什么是博弈论: 多人进行博弈,假设每个人都采取最优策略,一定有一个人胜出,在知道初态及规则的情况下,求解出 何人胜出的一类问题的理论及方法。 博弈论的一些性质 P点:必败点,N…

矩阵论-范数理论及其应用

范数理论及其应用2.1向量范数及其性质2.2矩阵范数本系列博文主要总结学习矩阵论的心得笔记,参考数目《矩阵论》–张凯院;整个文章的整理体系参照行书过程。范数–非负实数,用于衡量线性空间元素(如:向量,矩…

大数据学习(09)--spark学习

文章目录目录1.spark介绍1.1 spark介绍1.2 scale介绍1.3 spark和Hadoop比较2.spark生态系统3.spark运行框架3.1 基本概念3.2 架构的设计3.3 spark运行基本流程3.4 spark运行原理3.5 RDD运行原理3.5.1 设计背景3.5.2 RDD概念和特性3.5.3 RDD之间的依赖关系3.5.4 stage的划分3.5.…

探索 Pexpect

概述 通过本系列第一部分 《探索 Pexpect,第 1 部分:剖析 Pexpect 》(请参阅参考资料)的介绍,相信大家已经对 Pexpect 的用法已经有了比较全面的了解,知道 Pexpect 是个纯 Python 语言实现的模块&#xff…