常见的4种编程范式比较 您所在的位置:网站首页 声明式函数式 常见的4种编程范式比较

常见的4种编程范式比较

#常见的4种编程范式比较| 来源: 网络整理| 查看: 265

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

常见的编程范式:

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

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

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

所以在过程化编程中,把待解问题规范化、抽象为某种算法是解决问题的关键步骤。其次,才是编写具体算法和完成相应的算法实现问题的正确解决。 人们把所有支持过程化编程范式的编程语言都被归纳为过程化编程语言。例如机器语言、汇编语言、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 高阶函数指操作函数的函数,一般地,有以下两种情况:

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

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中,支持函数式编程的特性有:一类函数,高阶函数,一个函数可以作为另外一个函数的参数或返回值,如闭包。

3. 函数式编程 VS 面向对象 面向对象编程的优点:

关于“对象”的一些基础概念理解起来比较容易,方法调用的含义也好解释。面向对象编程通常使用命令式的编码风格,声明式(declarative style)的用得比较少。这样的代码读起来,像是一组直接的、计算机很容易就能遵循的指令。

面向对象编程的不足:

面向对象编程往往需要共享状态。对象及其行为常常会添加到同一个实体上,这样一来,如果一堆函数都要访问这个实体,而且这些函数的执行顺序不确定的话,很可能就会出乱子了,比如竞争条件(race conditions)这种现象(函数 A 依赖于实体的某个属性,但是在 A 访问属性之前,属性已经被函数 B 修改了,那么函数 A 在使用属性的时候,很可能就得不到预期的结果)。

函数式编程的优点

用函数式范式来编程,就不需要担心共享状态或者副作用了。这样就避免了几个函数在调用同一批资源时可能产生的 bug 了。 拥有了“无参风格”(point-free style,也叫隐式编程)之类的特性之后,函数式编程就大大简化了,我们也可以用函数式编程的方式来把代码组合成复用性更强的代码了,面向对象编程可做不到这一点。

函数式编程更偏爱声明式、符号式(denotational style)的编码风格,这样的代码,并不是那种为了实现某种目的而需要按部就班地执行的一大堆指令,而是关注宏观上要做什么。至于具体应该怎么做,就都隐藏在函数内部了。这样一来,要是想重构代码、优化性能,那就大有可为了。(译者注:以做一道菜为例,就是由 买菜 -> 洗菜 -> 炒菜 这三步组成,每一步都是函数式编程的一个函数,不管做什么菜,这个流程都是不会变的。而想要优化这个过程,自然就是要深入每一步之中了。这样不管内部如何重构、优化,整体的流程并不会变,这就是函数式编程的好处。)甚至可以把一种算法换成另一种更高效的算法,同时还基本不需要修改代码(比如把及早求值策略(eager evaluation)替换为惰性求值策略(lazy evaluation))。

利用纯函数进行的计算,可以很方便地扩展到多处理器环境下,或者应用到分布式计算集群上,同时还不用担心线程资源冲突、竞争条件之类的问题。

函数式编程的不足

代码如果过度利用了函数式的编程特性(如无参风格、大量方法的组合),就会影响其可读性,从而简洁度有余、易读性不足。

大部分工程师还是更熟悉面向对象编程、命令式编程,对于刚接触函数式编程的人来说,即使只是这个领域的一些的简单术语,都可能让他怀疑人生。 函数式编程的学习曲线更陡峭,因为面向对象编程太普及了,学习资料太多了。相比而言,函数式编程在学术领域的应用更广泛一些,在工业界的应用稍逊一筹,自然也就不那么“平易近人”了。在探讨函数式编程时,人们往往用 λ 演算、代数、范畴学等学科的专业术语和专业符号来描述相关的概念,那么其他人想要入门函数式编程的话,就得先把这些领域的基础知识搞明白,能不让人头大么。

4. JS应用开发常用的两种编程范式: 原型继承(js的OOP是通过原型继承实现的) 函数式编程(closures,First Class Functions, Lambdas)


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有