转载声明:感谢原作者分享!如有涉及版权问题,请与我联系。谢谢!
原作者: 向暖
参考链接: https://juejin.cn/post/6844904078858797063


文章目录

  • 常见的4种编程范式比较
    • 1. 过程化编程 / 命令式编程
    • 2. 事件驱动编程
    • 3. 面向对象编程 OOP
    • 4. 函数式编程 Functional Programming
      • 头等函数
      • 高阶函数
    • 5. 函数式编程 VS 面向对象


常见的4种编程范式比较

Programming paradigm(编程范式) 是指某种编程语言典型的编程风格或编程方式。 编程范式是编程语言的一种分类方式,它并不针对某种编程语言。就编程语言而言,一种编程语言也可以适用多种编程范式。

常见的编程范式:

  1. 过程化编程 / 命令式编程
  2. 事件驱动编程
  3. 面向对象编程 OOP
  4. 函数式编程 Functional Programming

1. 过程化编程 / 命令式编程

过程化编程(Procedural Programming)的步骤:

  1. 我们必须将带解决问题的解决方案抽象为一系列概念化的步骤。
  2. 通过编程的方法将这些步骤转化成程序指令集(算法),而这些指令按照一定的顺序排列,用来说明如何执行一个任务或解决一个问题。这意味着,程序员必须要知道程序要完成什么,并且告诉计算机如何进行所需的计算工作,包括每个细节操作。简而言之,就是把计算机看成一个善始善终服从命令的装置。

所以在过程化编程中,把待解问题规范化、抽象为某种算法是解决问题的关键步骤。其次,才是编写具体算法和完成相应的算法实现问题的正确解决。

人们把所有支持过程化编程范式的编程语言都被归纳为过程化编程语言。
例如机器语言、汇编语言、BASIC、COBOL、C 、FORTRAN、语言等等许多第三代编程语言都被归纳为过程化语言。

过程化语言适合解决线性的算法问题,强调“自上而下”、“精益求精”的设计方式。


2. 事件驱动编程

在过程式的程序设计中,代码本身就给出了程序执行的顺序,尽管执行顺序可能会受到程序输入数据的影响。在事件驱动的程序设计中,程序中的许多部分可能在完全不可预料的时刻被执行。往往这些程序的执行是由用户与正在执行的程序的互动激发所致。

事件驱动常常用于用户与程序的交互,通过图形用户接口(鼠标、键盘、触摸板)进行交互式的互动。当然,也可以用于异常的处理和响应用户自定义的事件等等。

事件与轮询的区别:轮询的行为是不断的观察和判断,是一种无休止的行为方式。而事件是静静的等待事情发生。

属于事件驱动的编程语言有:VB、C#、Java(Java Swing的GUI)等。它们所涉及的事件绝大多数都是GUI(图形用户界面)事件。


3. 面向对象编程 OOP

面向对象的程序设计包括三个基本概念:封装性、继承性、多态性。
面向对象的语言通过类、方法、对象和消息传递,来支持面向对象的程序设计范式。

  1. 对象
    面向对象的程序设计的抽象机制是将待解决问题抽象为面向对象的程序中的对象。利用封装是每个对象都拥有个体的身份。程序便是成堆的对象,彼此通过消息的传递,请求其他对象进行工作。

  2. 对象是类的实体。类是相似对象的集合。类中的对象可以接受相同的消息。即,类包含和描述了具有共同特性(数据元素)和共同行为(功能)的一组对象。
  3. 封装
    封装(有时也被称为信息隐藏)就是把数据和行为结合在一个包中,并对对象的使用者隐藏数据的实现过程。信息隐藏是面向对象编程的基本原则,而封装是实现这一原则的一种方式。封装使对象呈现出“黑盒”特性,这是对象再利用和实现可靠性的关键步骤。
  4. 接口
    接口不是类,而是对符合接口需求的类所作的一套规范。接口说明类应该做什么但不指定如何作的方法。一个类可以有一个或多个接口。
  5. 继承
    继承的思想就是允许在已存在类的基础上构建新的类。一个子类能够继承父类的所有成员,包括属性和方法。
    继承的主要作用:通过实现继承完成代码重用。继承是一种规范的技巧,而不是一种实现的技巧。
  6. 多态
    多态提供了“接口与实现分离”。 多态不但能改变程序的组织架构和可读性,更便利与开发出“可扩充”的程序。
    继承是多态的基础,多态是继承的目的。
    合理的运用基于类继承的多态、基于接口继承的多态和基于模版的多态,能增强程序的简洁性、灵活性、可维护性、可重用性和可扩展性。

4. 函数式编程 Functional Programming

函数式编程即是在软件开发的工程中避免使用共享状态(Shared State)可变状态(Mutable Data)以及副作用(Side Effects)

函数式编程中整个应用由数据驱动,应用的状态在不同纯函数之间流动。
与偏向命令式编程的面向对象编程而言,函数式编程其更偏向于声明式编程,代码更加简洁明了、更可预测,并且可测试性也更好。

函数式编程本质上也是一种编程范式(Programming Paradigm),其代表了一系列用于构建软件系统的基本定义准则。
核心是函数式编程是只使用纯粹的数学函数编程,函数的结果仅取决于参数,而没有副作用,就像 I/O 或者状态转换这样。程序是通过 组合函数function composition 的方法构建的。

头等函数

First Class Function 头等函数一类函数

在计算机科学中,如果一门编程语言把函数看做头等公民就可以认为这门语言支持头等函数。具体也就是说,函数能像参数那样被传递到另一个函数、从另一个函数那像值一样被返回出来、函数可以赋值给变量或者存在数据结构中。

高阶函数

High Order Function 高阶函数指操作函数的函数,一般地,有以下两种情况:

  1. 函数可以作为参数被传递
  2. 函数可以作为返回值输出

First class functions are functions that are treated like an object (or are assignable to a variable).

Higher order functions are functions that take at least one first class function as a parameter.

函数式编程语言有:Lisp,ML,Haskell,Erlang,Clojure,Elm,F#,OCaml,等等。

在JavaScript中,支持函数式编程的特性有:一类函数,高阶函数,一个函数可以作为另外一个函数的参数或返回值,如闭包。

5. 函数式编程 VS 面向对象

优点 不足
面向对象编程 关于“对象”的一些基础概念理解起来比较容易,方法调用的含义也好解释。面向对象编程通常使用命令式的编码风格,声明式(declarative style)的用得比较少。这样的代码读起来,像是一组直接的、计算机很容易就能遵循的指令。 面向对象编程往往需要共享状态。对象及其行为常常会添加到同一个实体上,这样一来,如果一堆函数都要访问这个实体,而且这些函数的执行顺序不确定的话,很可能就会出乱子了,比如竞争条件(race conditions)这种现象(函数 A 依赖于实体的某个属性,但是在 A 访问属性之前,属性已经被函数 B 修改了,那么函数 A 在使用属性的时候,很可能就得不到预期的结果)。
函数式编程 用函数式范式来编程,就不需要担心共享状态或者副作用了。这样就避免了几个函数在调用同一批资源时可能产生的 bug 了。拥有了“无参风格”(point-free style,也叫隐式编程)之类的特性之后,函数式编程就大大简化了,我们也可以用函数式编程的方式来把代码组合成复用性更强的代码了,面向对象编程可做不到这一点。
函数式编程更偏爱声明式、符号式(denotational style)的编码风格,这样的代码,并不是那种为了实现某种目的而需要按部就班地执行的一大堆指令,而是关注宏观上要做什么。至于具体应该怎么做,就都隐藏在函数内部了。这样一来,要是想重构代码、优化性能,那就大有可为了。
(译者注:以做一道菜为例,就是由 买菜 -> 洗菜 -> 炒菜 这三步组成,每一步都是函数式编程的一个函数,不管做什么菜,这个流程都是不会变的。而想要优化这个过程,自然就是要深入每一步之中了。这样不管内部如何重构、优化,整体的流程并不会变,这就是函数式编程的好处。)甚至可以把一种算法换成另一种更高效的算法,同时还基本不需要修改代码(比如把及早求值策略(eager evaluation)替换为惰性求值策略(lazy evaluation))。利用纯函数进行的计算,可以很方便地扩展到多处理器环境下,或者应用到分布式计算集群上,同时还不用担心线程资源冲突、竞争条件之类的问题。
代码如果过度利用了函数式的编程特性(如无参风格、大量方法的组合),就会影响其可读性,从而简洁度有余、易读性不足。
大部分工程师还是更熟悉面向对象编程、命令式编程,对于刚接触函数式编程的人来说,即使只是这个领域的一些的简单术语,都可能让他怀疑人生。
函数式编程的学习曲线更陡峭,因为面向对象编程太普及了,学习资料太多了。相比而言,函数式编程在学术领域的应用更广泛一些,在工业界的应用稍逊一筹,自然也就不那么“平易近人”了。
在探讨函数式编程时,人们往往用 λ 演算、代数、范畴学等学科的专业术语和专业符号来描述相关的概念,那么其他人想要入门函数式编程的话,就得先把这些领域的基础知识搞明白,能不让人头大么。

常见的4种编程范式比较相关推荐

  1. 架构 - 关于三种编程范式

    世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程. 三种编程范式包括 : 1. 结构化编程 2. 面向对象编程 3. 函数式编程 三种编程范式的特点 : 1. 结构 ...

  2. C++的四种编程范式

    C++的 四种编程范式有: 1.面向过程 2.面向对象 3.泛型编程 4.函数式编程 面向过程 int add1(int a,int b) {return a+b; } 面向对象 这里我选择运算符重载 ...

  3. 一种编程范式:对拍编程

    在GAN中,有生成器和鉴别器两种组件,这两种组件可以互相促进,共同进步. 在ACM比赛中,为了验证程序的正确性,一面使用暴力方法(容易验证正确性),一面使用快速方法(效率较高).当快速方法无法通过时, ...

  4. 整洁架构之道--三种经典的编程范式

    本文是<Clean Architecture>--整洁架构之道中关于编程范式相关章节的笔记,首发于公众号「Go 招聘」 前言 之前整理了整洁架构之道这本书前两章节的读书笔记:<cle ...

  5. java范式_【java编程】三种非主流的编程范式?

    原标题:[java编程]三种非主流的编程范式? [Java培训]:的小编在一些平台上看到的高端的编程技巧,今天给大家介绍相应的三种编程范式,在编程中就提到了提到了不少小众语言,在这里小编希望借此让大家 ...

  6. 再谈编程范式-程序语言背后的思想

    link link 编程范式 托马斯.库尔提出"科学的革命"的范式论后,Robert Floyd在1979年图灵奖的颁奖演说中使用了编程范式一词.编程范式一般包括三个方面,以OOP ...

  7. 再谈编程范式—程序语言背后的思想

    编程范式 托马斯.库尔提出"科学的革命"的范式论后,Robert Floyd在1979年图灵奖的颁奖演说中使用了编程范式一词.编程范式一般包括三个方面,以OOP为例: 1,学科的逻 ...

  8. 炒菜模型——各种编程范式

    炒菜模型--各种编程范式 过程式编程 生活的经验告诉我们以下的物理现实,事情是按照时间的顺序一个步骤接一个步骤的发展.编程里有一个范式就模拟了这样的经验,就是过程式编程. 如果现在有一些刚从超市买回来 ...

  9. [编程范式]以炒菜为例,讲解各种编程范式

    过程式编程 生活的经验告诉我们以下的物理现实,事情是按照时间的顺序一个步骤接一个步骤的发展.编程里有一个范式就模拟了这样的经验,就是过程式编程. 如果现在有一些刚从超市买回来的菜,要吃进肚子,按照过程 ...

最新文章

  1. 腾讯8篇AI医疗论文入选国际学术顶会,涵盖癌症图像分类、CT病灶检测等领域...
  2. 传清华应届生获Facebook offer
  3. Java线程池:ThreadPoolExecutor运行原理
  4. datagrid 完整dom结构
  5. 软件架构引言之项目管理的问题
  6. jquery的选择器之-表单对象属性过滤选择器
  7. python爬虫怎么挣钱_2019如何学Python?这里有你需要的答案
  8. DEVONthink Pro作为浏览器插件脚本,如何使用
  9. silverlight异常
  10. android手机debian 编译nodejs
  11. 12个有趣的HTML5实例(转)
  12. 简单的Map集合练习题
  13. 双十一、不如买一本书吧
  14. oracle rebuild online,rebuild online 请慎用
  15. 统计遗传学:第三章,群体遗传
  16. css 单行、两行 或 多行显示不下 省略号...表示实现
  17. 【聚水潭SDK使用说明】
  18. 【计算机毕业设计】018实习记录
  19. 小组取什么名字好_好消息!这座天桥今年年底完工!取什么名字,等你出主意...
  20. 树莓派 摄像头安装配置

热门文章

  1. 【stata】基础指令——学习教程全记录(01)
  2. ExecutorService的submit()方法
  3. 爱尚实训html入门基础篇,爱尚实训网页设计与网页制作的区别
  4. 十一月的Kemin,不是萧邦 2005
  5. 解决硬盘/U盘乱码的问题
  6. halcon算子——highpass_image--从图像中提取高频分量((过滤--图像边缘处理))
  7. Kali Linux - 嗅探和欺骗及密码破解工具
  8. Matlab·Simulink的使用—【Simulink仿真基础】
  9. 【模版】背包问题汇总
  10. 数据结构与算法(陈越版)第五讲 (树下)树的应用——集合及其运算