【LabVIEW技巧】你可以不懂OOP,却不能不懂封装
前言
大多数写LabVIEW程序的工程师都不是一个纯软的工程师,很多做硬件的、做机械的、甚至学化学的也会学习LabVIEW。
由于主要重心不在软件,所以LabVIEW程序基本上能用行,也就得到入门容易的称号。
然而,当程序规模逐渐扩大时,没有软件设计思想的辅佐,采用画框图方式写程序便慢慢显得力不从心,甚至有的人称LabVIEW程序画不出来或干脆断言LabVIEW做不了大程序。
其实,对于我们大多数非软件工程师而言,所认为的大程序在软件行业基本属于中型或者更小的程序。满足测量测试领域的非大型平台类软件,LabVIEW是有能力胜任的。
今天小编聊一些虚的东西,虽没有专业软件工程师的水准,但是解决测控领域的集成软件,还是非常实用的。
正文
今天接触的内容与LabVIEW中的OOP思想相关。
如果你深入调查,LabVIEW OOP在众多的编程语言中并不是特别出色,但是存在皆有道理,我们也当抱着兼容并济,吸收各家所长的态度去了解其中的一些设计思想。
本文只接触OOP的三大特性(封装,继承,多态)之封装,简单介绍一下LabVIEW程序设计中,如何利用封装规范软件。
我一直认为:你可以不懂LabVIEW OOP,可以在程序中不使用OOP的相关内容,却不能不懂OOP设计的思想。
什么是封装
在百度百科中,封装这样解释:
封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。
实际上,封装不是面向对象中的特有概念,面向过程程序设计中也普遍存在封装特性。
在传统LabVIEW程序设计中,初学者常将子VI的编写称为封装,这种级别的封装层级相对较低,其复用度也比较低。在程序函数量较少时可以满足设计需求,稍微编写多个模块配合的中型程序已经出现结构组织问题。
相对而言,如果想要更多的复用,则必须在库函数或模块的层级上做出努力。
为什么进行封装
LabVIEW已经集成设计了大量的工具包,但如何设计工具包或者一些封装的注意事项你可能从没有了解过。
函数库层级设计时,设计一个方便有用的库除了VI设计技巧,还有一些软因素需要注意,封装即是关键内容之一。
百度百科对为什么使用封装这样解释:
封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。
通过对函数和方法的访问属性设置,我们可以避免用户在不知情的情况下错误的使用一些私有的方法,从而导致程序运行逻辑错误,产生一些意外情况
而且好的库函数封装,可以让用户简单易用,不需要过多的说明也可以快速实现特定功能。
怎么进行封装
在LabVIEW工具包或者库中,我们通常会有Public和Private属性,设计程序中,这两个属性起到关键的封装作用。
工具包设计中,如果我们准许用户利用的VI,则将其设置为Public,如果只是工具包内部使用的工具,则将其设置为Private。这样即可通过属性设置轻松控制哪些可以给外部调用,哪些只需要内部调用。
在我程序设计的初期,由于不了解封装思想,一直无法区分Public Protect Private的区别,所以我的程序大都全部使用Public属性。这样在给别人使用工具包的时候,大家都会困惑:“这么多的函数,我只想用工具包还需要全部读懂吗?"。另外,由于访问全部公有,如果一旦乱用我的VI,导致输出错误,我定位问题也会花费很长时间。
![](https://images2015.cnblogs.com/blog/841277/201701/841277-20170118073031546-395382913.png)
为了达到用户拿到工具包即可使用的要求并且控制其使用方式,减少说明时间和出错的定位时间,我们可以使用VI访问属性来控制外部的调用。
如图所示,在LabVIEW OOP工具包设计过程中,通过访问属性可以控制外部调用规则
1.把希望用户使用的接口放置于Public属性下,在任何程序位置均可以调用,VI上没有任何颜色的钥匙;这样如果调用后出错,可以快速定位出问题的VI模块
2.把不希望用户接触的内容全部放置于Private的属性下,VI上具有红色的钥匙,这样只要外部调用则VI会提示断线,避免用户随意使用VI
3.如果接口需要在子类中继承和修改,则可以将其设置为Protect属性,VI上具有黄色的钥匙
3.还有一种是蓝色的钥匙,属于友元的访问,这里不再细聊
![](https://images2015.cnblogs.com/blog/841277/201701/841277-20170118073032390-1258919518.png)
在程序设计过程中,如果你不确定某一个VI是否需要外部访问,那么优先设置为Private属性,避免由于错误调用导致系统问题。
当你的代码和模块这样设计的时候,与你合作的同事将会非常轻松,他可以快速知道哪些内容需要使用,哪些内容简单了解即可。他只看懂PublicVI如何使用即可,出BUG直接找你,由你维护细节即可。在程序配合中,这样操作实现了特定功能的高内聚,低耦合,一旦底层库更新,只要PublicVI不变,文件覆盖即可,代码的维护也局限于一个小模块,避免大面积改动。
面向过程中如何使用封装呢?
如果你不懂LabVIEW OOP,又想要设计一个很好的模块怎么办呢?
你可以使用文件夹分类的方法,将你的模块同样区分为Public,Private
最外层再放置一些LabVIEW的Demo程序,可以供其他开发人员快速理解程序,这样程序的可读性就大大提高了。
下图是一个德国人写的工具包,其设计就非常规范
![](https://images2015.cnblogs.com/blog/841277/201701/841277-20170118073035843-530807383.png)
使用库函数而不使用类也可以设置访问的Scope属性
![](https://images2015.cnblogs.com/blog/841277/201701/841277-20170118073037093-418508986.png)
后记
软件设计就像修行,既要有外功,懂得各个模块如何使用;也需要有内功,了解一些心法,两者结合才可以让你的程序更加的强大。否则,几招外功就认为天下无敌,总会吃不懂内功的亏。