注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

LabATSS

关注自动测试软件

 
 
 

日志

 
 

LabVIEW面向对象编程—初窥门径(1):困惑  

2018-03-22 22:45:04|  分类: LabVIEW |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

引言:在去年年底左右(201711月底),由于单位业务调整,自己工作性质和内容发生较大的改变,由原先的计量参数日常运行检定改为软件维护与开发,遂开始着手对以往前同事开发完成的LabVIEW旧代码(直流电源校准/检定自动测试序列)进行重新梳理与维护,在此过程中开始边实践、边摸索的开发学习方式,应用面向对象技术(Object-Oriented Program)对旧代码进行了完全重新的改写,由于前段时间日常忙于开发工作,周末时间又要承担中年油腻男的上有老、下有小的生活重任,难得在春节及前后期间有一段相对空闲的时间,可以将近日的开发心得(设计思想、开发过程等)总结记录一下,以便日后回顾复习,并秉着互联共享的精神分享给大家,但是由于本人的工作内容为计量校准的测控行业,因此在实际代码开发实践时选用的案例为本行业的电学参数中的直流电源校准为样例,因此有其局限性,较为适合本行业或者是电子测试工程师们在碰到类似的代码开发情况下予以参考借鉴。

另外强烈建议大家在台式电脑上阅读该系列博客文章,缘由是:文章内容篇幅均较长,且图形化编程的截图显示效果要求大屏幕展示为宜,况且手机和平板等便携式设备易受干扰,导致碎片化式的阅读,从而恶化学习吸收效果;还请特别注意,该系列的博文并不讲述任何基础的LabVIEW面向对象概念与技术(基础部分内容将另行撰文编写),初窥门径系列重点是经典的设计原则在重构旧有面向过程代码的应用,实际发布面向对象工程代码中的填坑经验,因此并不适宜LabVIEW初学者学习, 如观看本文有云山雾里般的恶心、头晕、眼花等不适感,请立刻点击操作关闭页面,以免造成严重心理疾病,丧失了对LVOOP学习的浓厚兴趣!


目录:

LabVIEW面向对象编程—初窥门径(1):困惑



正文:图形化编程语言LabVIEW2006年推出的20周年纪念版本8.2版本中,隆重推荐了面向对象编程范型即LabVIEW Object-Oriened Program(以下简称LVOOP),为测量工程师们带来了更为强大的抽象编程方式;LabVIEW 2009版本提供的DVRs(Data Value References)功能更进一步促进了面向对象编程技术的进一步发展,使得对象结构传址(By-Reference)实现更为便捷,减少数据内存拷贝次数,两家第三方公司瑞典AddQ的开源产品G# Framework和美国Endevo的产品GOOP2014年被NI公司收购并开源)开发了底层基于LVOOP技术的高级扩展面向对象编程技术框架,提供了接口(多继承替代)、抽象类、以及代码到UML图的相互转换能力;2011年,NI公司使用面向对象命令模式结合消息队列实现了基于操作者模型(Actor Model)的多线程架构——操作者框架(Actor Framework),使得多线程任务的开发有了本质上的飞越,并进一步的丰富了LabVIEW的面向对象工具箱。

LabVIEW面向对象编程—初窥门径(1):困惑 - labats - LabATSS

 

以前我在博文中多次提到过:学习和使用LabVIEW最好的资料就是系统随机安装自带的帮助文件和演示范例,当你不知道如何使用某个控件(Ctl)或者函数节点(Node)时,查询帮助文件都能够第一时间给予你最清晰的释义解答,特别是范例则往往能够给你一个模仿的起点,以往我自己开发的工程实战代码中很多就是直接从编程范例中模仿摘抄过来的。但是这条规则在遇到LVOOP(LabVIEW Object-Oriented Program)相关疑难问题时却突然失效了。


这也是很多人,包括我自己在开始学习应用LVOOP时遇到的困惑?以往的学习LabVIEW开发经验失效了,那么该如何将自己的待解决领域问题用一个良好的面向对象解决方案来达到最大程度的复用性、灵活性以及扩展性?


那么首先让我们回到起点上来,看看帮助文件和随机范例都有哪些面向对象的相关内容,以及为什么这些内容无法直接帮助到我们去使用LVOOP来解决实际编程问题。

LabVIEW面向对象编程—初窥门径(1):困惑 - labats - LabATSS

  

LabVIEW帮助文件有关面向对象编程的内容分为两个大的章节:分别是概念和详解,在概念章节中首先是定义了类和对象,随后详细的表述了如何创建LabVIEW类(封装、成员函数、继承、动态分配),在开发LabVIEW类条目中表明了基于数据流概念的G语言与其他文本语言在面向对象技术的典型差异,特别强调了LabVIEW中的对象由值(By-Value)来传递,而不是由引用来传递。LabVIEW按照簇和数组的操作规则创建对象的副本。,并由此进而引发继承层次体系中对象的比较问题。

LabVIEW面向对象编程—初窥门径(1):困惑 - labats - LabATSS


在概念章节的最后,讲解了在编写应用程序中如何使用LabVIW类以及注意事项。而帮助文件中LabVIEW面向对象编程详解章节则以详细的引导步骤(Step By Step)讲解了主要面向对象的技术功能性实现。

LabVIEW面向对象编程—初窥门径(1):困惑 - labats - LabATSS

 

配套的LabVIEW的面向对象编程范例主要演示功能如下表汇总所示:

 

LabVIEW 2012中文版本说明为例

名称(以项目名称字母顺序排列)

说明信息

Access Scope.lvproj

演示LabVIEW类的公有、私有和保护访问范围,封装概念的具体体现。

Board Testing.lvproj

该范例是一个完整的OOP演示LabVIEW面向对象编程用于编写和维护测试测量程序的优势。

Data Encapsulation.lvproj

LabVIEW类封装数据的方法。

Dynamic Dispatching.lvproj

演示LabVIEW类动态分配和定制探针的方法

Dynamic Terminals.lvproj

多态概念在LVOOP中的核心演示应用。通过对比演示动态分配和静态分配接线端的差异。

动态输入接线端允许在衍生类中对成员VI进行重写。当成员VI对某个对象进行修改(或传递)时,应采用一个或多个动态输出接线端。动态输出接线端必须将动态输入接线端作为数据源,贯穿程序框图的全部连线路径。

FriendshipAndCommunityScope.lvproj

类和XControl范例可用于演示友元和库内范围的使用方式,封装概念的高级应用。

Global Class Data.lvproj

LabVIEW类实现类变量(也称为静态数据成员或类数据)的方法即由对象可以共享访问的变量。

Graphics.lvproj

类的传统层次结构。线集合类继承了图形类,并且递归调用组合类中各自实现(也是设计模式中的组合模式)。

Navigation.lvproj

演示了LabVIEW面向对象编程的各个方面,。该演示代码也是由Eyes on Vi的博主Christina重构LabVIEW启动界面编写完成的。

Read Write Class Data To File.lvproj

演示了如何记录和获取类数据至文件,以及类私有数据改变后LabVIEW如何处理数据突变。

ReferenceObject.lvproj

LabVIEW类应用队列技术来实现的传址(By-Ref)对象。

Singleton.lvproj

说明了如何通过LabVIEW类应用单例设计模式。单例模式可用于定义一个类并确保内存中始终只包括类的一个副本。表示必须保护该副本,当两个程序框图尝试同时更改值时,可确保每次仅有一个程序执行操作。

保留运行类演示.Vi

说明通过子VI传递类时保留对象类型的两种方式。第一种情况为相同对象将从子VI的输入传递至输出。其它情况下将使用新的保留运行类函数。

演示递归

本范例演示了在LabVIEW 8.5和更高版本中使用递归的方式。当VI调用VI本身时将发生递归。在以下情况时递归功能将十分有用,例如解决类似F(n) = F(n-1) + G()的问题,其中函数可能为随机复杂并且无法使用直接循环的方式解决。

 

当你准备使用面向对象技术来解决实际编程问题的时候,学习以上内容并不能立刻让你开发出良好的面向对象的解决方案;而与之形成鲜明对比的是:在以往面向过程编程的大背景环境下,例如当你在编程时想知道如何使用配置文件(以.INI为结尾的文本段、键、值配置文件)功能函数节点时,只需要打开读取配置设置文件范例(如下图所示)即可将样例代码片段直接拷贝到自己的工程代码中即刻模仿使用,非常的直观高效。这就引出一个面向对象编程范型与面向过程编程范型的巨大差异鸿沟。


LabVIEW面向对象编程—初窥门径(1):困惑 - labats - LabATSS

 

LabVIEW虽然是基于数据流的图形化编程语言,但是在编程范型上还是属于传统强调函数调用的过程式编程范型,因此当你在开发常规的结构化过程式解决方案时,帮助系统和样例都是以该范型为默认背景,以字典索引形式提供细节的实现帮助,使得问题和解决方案可以较为简单一一映射,便于已掌握功能逐步分解、函数过程、封装细节控制的测控工程师直接模仿使用,而面向对象编程则强调用抽象概念的类型(Type)与接口(Interface)编程,需要构建必要的概念角色抽象层进行封装,因此进行面向对象编程时更加强调预先必要的设计阶段,使用类概念抽象封装出其事物的核心本质。

(备注:请特别需要注意的是面向对象编程和面向过程编程并不是完全对立的,在面向对象编程中,具体类封装公共接口的内部实现细节还是面向过程的。)


其实LVOOP帮助文档的首页就已经明确指出了进行OOP编程需要进行相关范型的背景知识再学习教育,无形当中,这也大大提高了使用面向对象技术开发测控类软件的门槛,使其(LVOOP)变得曲高众寡。

LabVIEW面向对象编程—初窥门径(1):困惑 - labats - LabATSS


其实,在NI公司自己研制开发的面向对象编程技术培训课程的大纲中所罗列的知识主题里,也可以明确看到对面对象设计阶段及设计模式(即设计套路)的重视。并清晰地对照出随机帮助文件系统和样例只能够对应LVOOP部分知识点(即下列标注为红色的字体内容),而必要的面向对象设计、设计模式及软件工程方面的内容并没有进行系统性阐述,因此也就不奇怪大家为什么学完帮助文件的知识点后,却还是无法系统性的构建面向对象整体解决方案。

 

LabVIEW 面向对象编程技术课程大纲

课程

概述

主题

介绍

对于一个即将开发的软件项目,学习者将能够有能力评估面向对象方式是否适用于程序的设计与实现。

  • 什么是类(类的概念)
  • 什么是对象(对象的概念)
  • 什么是面向对象设计(面向对象设计概念)
  • 什么是面向对象编程(面向对象编程概念)

面向对象程序的设计

对于一个即将开发的软件项目,学习者能够应用面向对象设计原则构建合理的类层次关系。

  • 面向对象设计
  • 鉴别类
  • 甄别类和方法
  • 类间关系
  • 通用的设计错误

LabVIEW面向对象编程

对于一个即将开发的软件项目和类层级模型,学习者应有能力使用LabVIEW类来开发具备可读性、可扩展性、可维护性以及可重用的应用程序。

  • 介绍G语言中的面向对象编程技术
  • LabVIEW Classes
  • 封装
  • 继承
  • 动态分配
  • 工具
  • 通用用例

面向对象工具及设计模式

对于一个即将开发的软件项目和类层级模型,学习者将有能力应用现存工具或设计模式来开发面向对象的LabVIEW程序,

  • 对象参考和构建保障
  • 对象数据前面板显示
  • 设计模式:介绍
  • 通道模式
  • 聚合模式
  • 工厂模式
  • 设计模式:结论

面向对象程序移植

对于一个已完成的LabVIEW程序,学习者应该具备使用良好的面向对象设计和编程实践复查,重构,部署原先代码的能力。

  

  • 代码复查
  • 迁移到LabVIEW
  • 部署
  • 附加的资源

 

实际上,随着工程测试程序的复杂多样性及柔性生产灵活扩展性的高要求,越来越多的测控软件程序需要应用到面向对象的编程技术提供的依赖抽象、封装细节、灵活扩展的技术特性,美国NI公司工程师们自己本身在LVOOP技术基础上,结合为众多行业用户开发相关案例的实战背景下,演进开发了HALHardware Abstraction Layer)、MALMeasurement Abstraction Layer)、面向对象插件结构(Object Factory)等良好方案,并在NI的面向对象开发社区中提供了大量的相关优秀讲解和资料、以及代码样例,另外也可以从其他成熟的面向对象文本语言如Java C#社区里优秀资料进行对比学习与借鉴,而这些内容的学习并吸收后应用就是解决面向对象开发的核心所在,从而弥补上了相关面向对象设计(OOD)知识缺失环节,特别是与硬件测控程序相关的开发程序,可以充分利用HALMAL概念对旧有代码进行循序渐进的改进演化式开发。

因此,要想完成一个基于面向对象技术的解决方案,除了要学习关键的面向对象技术基础知识点如封装、继承、多态等,更为重要的是关于面向对象的设计概念及设计原则的掌握,并且这些概念在不同的语言实践中(LabVIEW ,C# ,Ruby)都是相通的,这也是下一篇博文要主要讲解的问题。

 

参考文件

LabVIEW 2012 帮助文件》,National Instruments Corporation2012年。

Object-Oriented Design and Programming in LabVIEW Course Overview》,National Instruments Corporation2012年。

 

  评论这张
 
阅读(152)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018