LabVIEW 是独特的面向过程的图形式编程语言,LabVIEW编程的核心是数据流。数据流的实质是值的传递过程,也就是说对于一般的数据,LV 采用的是值传递的方式,而不是引用(指针)传递方式。
      目前,流行的编程语言多采用面向对象编程技术,面向过程的编程方法由于其运行效率比较高,在嵌入式和硬件密切相关的编程中,仍然广泛采用,所以在相当长的阶段内,面向过程的编程方法仍然是LV编程的主要方法。
      当然,对于常规的桌面应用和大型综合性的软件开发,面向对象具有无可比拟的优势。自从LV8后续版本后,增加了对面向对象的支持。LV中面向对象虽然具有继承、封装和多态三大特性,但仍然与常规的面向对象的方法有很大不同,比如LV 中的类对象(实例)仍然采用值传递方式,没有明显的构造函数和析构函数,不支持类的的事件等等。

      面向对象编程最为重要的是选择合适的设计模式,有很多专业的书籍介绍了众多的设计模式。所谓设计模式就是编程前辈们总结的各类成型的设计套路,LV 中一般称作框架。随着面向对象技术的引入,LV常规的编程方法不可避免地会做相应的改变。比如NI 的数据库工具包和报表生成工具包都采用的新的面向对象的编程方法。
      在今后的LVOOP系列文章中,我将尝试结合常用的设计模式,看看LV中能否实现和如何实现各类成型的设计模式。


      下面要讨论的是简单工厂设计模式。

      面向对象编程存在两个重要的原则,单一职责原则和开放封闭原则。面向对象编程的最大优点是软件系统已于维护和开放性,客户的要求总是不断在变化,对于面向过程的编程方式,客户不经意间增加的简单功能都可能会导致软件的多处修改。而对于面向对象的编程,只要遵循单一职责原则和开放封闭原则,会使软件的修改达到最小。

      下面我们讨论一个具体的实际问题,以说明如何单一职责原则和开放封闭原则,以及简单工厂模式的运用方法。

      假如我们考虑两个数之间的运算,可能会涉及加、减、乘、除等,甚至还有两个数之间的关系运算,比如大于、不等等等。对于这个具体应用,我们不可能预先设计 所有情况,因为这取决于用户的要求,比如这是计算器的一部分,这个计算器可能是简单的计算器,后来要求改变为高级计算器,这不可避免地涉及到改动和增加功 能的问题。

      首先我们考虑如何把这个问题抽象化,固定不变的是存在两个数,变化的是运算方式问题。所以构造 一个运算类,运算作为虚拟函数(LVOOP没有提供抽象类和虚拟函数的方法,但是我们可以模拟这种方式)。运算类作为所有具体运算的基类,具体的运算方法延迟到子类中实现。

Picture

      运算基类作为所有具体运算类的基类,其私有成员(LVOOP只允许私有数据成员,不允许有保护、公共数据成员)包括A、B 两个操作数。

      运算基类建立四个类属性成员(LVOOP 称作数据成员访问的VI),分别用于读写A、B 两个成员。


Picture
      操作数B的读写属性类似。我们特别要注意下面的运算基类的方法,在真正面向对象的语言中,该方法应该是纯粹的虚方法,但是LVOOP 中没有虚方法的概念,我们我们采用一般的重写VI。
Picture
      该重写VI 不执行任何实际操作,只是返回一个结果,运算基类的运算结果重写VI 返回0.
      在运算基类的基础,具体的运算继承运算基类,继承类中私有数据成员为空,我们需要做的是重写运算结果VI.

Picture
      对于两个数的加法运算,我们构造一个加法类,在加法类中重写了运算结果VI。在运算结果VI 中,通过基类的两个属性,分别读取A和B的值,并执行加法运算,返回具体运算结果。

      减法类与加法类类似,不过是返回A-B的运算结果。

      同理,如果需要计算乘法,则直接建立一个乘法类即可。由于乘法类不需要对加法类和加法类进行任何改变,这就符合了单一职责原则和开放封闭原则。也就是说具体 运算类是开放的,这体现在增加不同的具体运算类,则增加了新的算法。在增加新算法的同时,不需要对原来的算法进行任何改变,这就遵循了封闭原则。

      所谓简单工厂,就是根据不同的要求,返回具体类的实例。对于我们的运算类来说,就是根据具体要求,返回加法、减法等不同的具体实例。

Picture
      需要注意的是,工厂类不包含任何私有数据,仅包括一个操作方法,该方法返回一个具体的实例。返回的类实例必须为基本运算类,只有这样,才能实现多态运算。

      下面通过一个VI测试一下简单运算工厂。
Picture
      使用面向对象的方法,最重要的是封装,封装不仅仅是指封装了具体数据,更为重要的封装了具体的方法。在上面的测试VI中,通过简单工厂类,我们仅仅是通过枚举简单选择一下,就可以返回不同的实例,实现不同的算法。

假如我们需要增加一个新的算法,只需要做如下改动:
一、建立一个新的运算类,继承与运算基类。
二、修改运算工厂,增加一个新的实例选择。

      对于原有的具体算法,不需要任何形式的改动,这就是简单工厂模式的重要作用。

Picture



Leave a Reply.