谈谈编程范式

几种常见的编程范式

    因为编程范式是某种编程语言典型的编程风格或者说是编程方式。所以为进一步加深对编程范式的认识,同时也是为深入理解和探讨LabVIEW图形化编程语言的编程范式。我们以点到为止的方式,简要介绍几种最常见的编程范式。

    需要再次提醒注意的是:编程范式是编程语言的一种分类方式,它并不针对那种编程语言。就编程语言而言,一种编程语言也可以适用多种编程范式。


1. 过程化(命令式)编程

    过程化编程,也被称为命令式编程。它应该是最原始的、也是我们最熟悉的一种传统的编程方式之一。
    从本质上讲,它是“冯.诺伊曼机”运行机制的一种抽象,它的编程思维方式源于计算机指令的顺序排列。也就是说:过程化语言模拟的是计算机机器的系统结构,而并不是基于语言的使用者的个人能力和倾向。这一点我们应该都很清楚,比如:我们最早曾经使用过的单片机的汇编语言。

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

    正因为如此,所以在过程化编程中,把待解问题规范化、抽象为某种算法是解决问题的关键步骤。其次,才是编写具体算法和完成相应的算法实现问题的正确解决。当然,程序员对待解问题的抽象能力也是非常重要的因素,但这本身已经与编程语言无关了。

    程序流程图是过程化语言进行程序编写的有效辅助手段。

    尽管现存的计算机编程语言种类很多,但是人们把所有支持过程化编程范式的编程语言都被归纳为过程化编程语言。例如,机器语言、汇编语言、BASIC、COBOL、C 、FORTRAN、语言等等许多编程语言都被归纳为过程化语言。

    过程化语言特别适合解决线性(或者说按部就班)的算法问题。它强调“自上而下(自顶向下)”“精益求精”的设计方式。这种方式非常类似我们的工作和生活方式,因为我们的日常活动都是按部就班的顺序进行的。

    过程化语言趋向于开发运行较快且对系统资源利用率较高的程序。过程化语言非常的灵活并强大,同时有许多经典应用范例,这使得程序员可以用它来解决多种问题。

    过程化语言的不足之处就是它不适合某些种类问题的解决,例如那些非结构化的具有复杂算法的问题。问题出现在,过程化语言必须对一个算法加以详尽的说明,并且其中还要包括执行这些指令或语句的顺序。实际上,给那些非结构化的具有复杂算法的问题给出详尽的算法是极其困难的。

    广泛引起争议和讨论的地方是:无条件分支,或goto语句,它是大多数过程式编程语言的组成部分,反对者声称:goto语句可能被无限地滥用;它给程序设计提供了制造混乱的机会。目前达成的共识是将它保留在大多数语言中,对于它所具有的危险性,应该通过程序设计的规定将其最小化。

    这里我们先留下一个思考题:LabVIEW属于过程化编程范式的编程语言吗?


2. 事件驱动编程

    其实,基于事件驱动机制的程序设计在图形用户界面(GUI)出现很久前就已经被应用于程序设计中,可是只有当图形用户界面广泛流行时,它才逐渐形演变为一种广泛使用的程序设计范式。

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

事件

    所谓事件就是通知某个特定的事情已经发生(注意:事件发生具有随机性)。

事件与轮询

    轮询的行为是不断地观察和判断是否有事件在发生,是一种无休止的行为方式,通常会占用CPU资源(甚至遗漏事件发生)。而事件是静静地等待事情的发生。

    事实上,在Windows操作系统出现之前,采用鼠标输入字符模式的PC应用程序必须进行串行轮询,并以这种方式来查询和响应不同的用户操做。

事件处理器

    是对事件做出响应时所执行的一段程序代码。事件处理器使得程序能够对于用户的行为做出反映。

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

    事件的异常处理比用户交互更复杂。

    事件驱动不仅仅局限在GUI编程应用。但是实现事件驱动我们还需要考虑更多的实际问题,如:事件定义、事件触发、事件转化、事件合并、事件排队、事件分派、事件处理、事件连带等等。
    其实,到目前为止,我们还没有找到有关纯事件驱动编程的语言和类似的开发环境。所有关于事件驱动的资料都是基于GUI事件响应的。

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

    同上单元一样,我们还留下一个思考题:LabVIEW属于事件驱动编程范式的编程语言吗?


3. 面向对象编程

    过程化范式要求程序员用按部就班的算法看待每个问题。很显然,并不是每个问题都适合这种过程化的思维方式。这也就导致了其它程序设计范式出现,包括我们现在介绍的面向对象的程序设计范式。

    面向对象的程序设计模式已经出现二十多年,经过这些年的发展,它的设计思想和设计模式已经稳定的进入编程语言的主流。来自TIOBE Programming Community2010年11月份编程语言排名的前三名Java、C、C++中,Java和C++都是面向对象的编程语言。

注意:C++是一种多范式编程语言。

对象

     在面向对象的语言中,世间万事万物都可以看作是对象。

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


    在面向对象语言中,每个对象都是其类中的一个实体。
    物以类聚——就是在说明:类是相似对象的集合。类中的对象可以接受相同的消息。换句话说:类包含和描述了“具有共同特性(数据元素)和共同行为(功能)”的一组对象。
    比如:苹果、梨、橘子等等对象都属于水果类。

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

封装

    封装(有时也被称为信息隐藏)就是把数据和行为结合在一个包中,并对对象的使用者隐藏数据的实现过程。信息隐藏是面向对象编程的基本原则,而封装是实现这一原则的一种方式。
    封装使对象呈现出“黑盒子”特性,这是对象再利用和实现可靠性的关键步骤。

接口

    每个对象都有接口。接口不是类,而是对符合接口需求的类所作的一套规范。接口说明类应该做什么但不指定如何作的方法。一个类可以有一个或多个接口。

方法

    方法决定了某个对象究竟能够接受什么样的消息。面向对象的设计有时也会简单地归纳为“将消息发送给对象”。

继承

    继承的思想就是允许在已存在类的基础上构建新的类。一个子类能够继承父类的所有成员,包括属性和方法。

    继承的主要作用:通过实现继承完成代码重用;通过接口继承完成代码被重用。继承是一种规范的技巧,而不是一种实现的技巧。

多态


    多态提供了“接口与实现分离”。多态不但能改善程序的组织架构及可读性,更利于开发出“可扩充”的程序。
    继承是多态的基础。多态是继承的目的。
    合理的运用基于类继承的多态、基于接口继承的多态和基于模版的多态,能增强程序的简洁性、灵活性、可维护性、可重用性和可扩展性。

    这里,我们还是留下一个思考题:LabVIEW属于面向对象编程范式的编程语言吗?

你可能感兴趣的:(架构与设计,设计模式,组织架构)