前言

大多数写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,导致输出错误,我定位问题也会花费很长时间。


为了达到用户拿到工具包即可使用的要求并且控制其使用方式,减少说明时间和出错的定位时间,我们可以使用VI访问属性来控制外部的调用。

如图所示,在LabVIEW OOP工具包设计过程中,通过访问属性可以控制外部调用规则
1.把希望用户使用的接口放置于Public属性下,在任何程序位置均可以调用,VI上没有任何颜色的钥匙;这样如果调用后出错,可以快速定位出问题的VI模块
2.把不希望用户接触的内容全部放置于Private的属性下,VI上具有红色的钥匙,这样只要外部调用则VI会提示断线,避免用户随意使用VI
3.如果接口需要在子类中继承和修改,则可以将其设置为Protect属性,VI上具有黄色的钥匙
3.还有一种是蓝色的钥匙,属于友元的访问,这里不再细聊



在程序设计过程中,如果你不确定某一个VI是否需要外部访问,那么优先设置为Private属性,避免由于错误调用导致系统问题。

当你的代码和模块这样设计的时候,与你合作的同事将会非常轻松,他可以快速知道哪些内容需要使用,哪些内容简单了解即可。他只看懂PublicVI如何使用即可,出BUG直接找你,由你维护细节即可。在程序配合中,这样操作实现了特定功能的高内聚,低耦合,一旦底层库更新,只要PublicVI不变,文件覆盖即可,代码的维护也局限于一个小模块,避免大面积改动。

面向过程中如何使用封装呢?

如果你不懂LabVIEW OOP,又想要设计一个很好的模块怎么办呢?

你可以使用文件夹分类的方法,将你的模块同样区分为Public,Private

其中顶层的VI为我们提供了常用的操作,底层的VI则通过内部调用的方式,避免用户过多接触;

最外层再放置一些LabVIEW的Demo程序,可以供其他开发人员快速理解程序,这样程序的可读性就大大提高了。

下图是一个德国人写的工具包,其设计就非常规范
 使用库函数而不使用类也可以设置访问的Scope属性
 

后记

软件设计就像修行,既要有外功,懂得各个模块如何使用;也需要有内功,了解一些心法,两者结合才可以让你的程序更加的强大。否则,几招外功就认为天下无敌,总会吃不懂内功的亏。

【LabVIEW技巧】你可以不懂OOP,却不能不懂封装的更多相关文章

  1. 【LabVIEW技巧】LabVIEW OOP怎么学

    前言 有很多人对LabVIEW OOP存在比较极端的看法,大致分为两类: 1. 绝对否定派认为LabVIEW OOP只不过是LabVIEW为了追求时髦,在面向过程的基础上用簇做了一些特性,实际上完全不 ...

  2. 面向对象。OOP三大特征:封装,继承,多态。 这个讲的是【封存】

    class Ren { private $name; private $sex; private $age; //年龄必须在18-50之间 function __constuct($v) { $thi ...

  3. 【LabVIEW技巧】策略模式

    前言 在之前的文章提到了如何学习OOP以及对应的简单工厂模式,由于时间比较长,我们先回顾一下原有内容,然后继续了解新的模式. 为什么学习OOP 在测控系统的软件开发过程中,LabVIEW工程师一直认为 ...

  4. 【LabVIEW技巧】LabVIEW中的错误1

    前言 前几日,小黑充电学习意外的看到了下面的这个东东. 编程许久竟然没有见过这样子的错误枚举,甚为好奇,问刘大后才知道是Error Ring,为此恶补一下LabVIEW中与错误处理相关的内容. 错误的 ...

  5. 【LabVIEW技巧】工厂模式_简单工厂

    前言 上一个文章介绍了如何学习LabVIEW OOP,简要的提及了一些OOP学习中注意的事项,许多文章的读者反映写的太范,后文会逐步缩小范围,讨论在LabVIEW中各个模式的应用. 工厂模式概述 工厂 ...

  6. 【LabVIEW技巧】代码块快速放置

    前言 之前的文章中介绍了如何使用QuickDrop来实现快速代码放置,今天我们来详细的聊一下如何进行代码块的快速放置. 正文 LabVIWE程序设计中,我们在架构层级总是进行重复性的编写.举一个例子: ...

  7. 【LabVIEW技巧】路径依赖解除方法

    前言 LabVIEW程序开发,让我们的程序设计变的简单容易,但是设计过程中也不乏大量的重复性工作,其中最让人头痛的莫过于依赖冲突问题. 事实上,只要你对文件进行了修改或者移动,必不可少的依赖冲突就会产 ...

  8. 【LabVIEW技巧】LabVIEW中的错误2

    前言 通过上一个文章的介绍,我们发现LabVIEW自带的错误管理依旧比较基础,如果需要对错误进行很好的管理,则需要进一步的进行程序编写. 用于在程序设计的过程中,为了保证程序的健壮性,我们需要 1.忽 ...

  9. OOP的三大特性------封装、继承、多态

    封装 1.<1>类背后隐藏的思想是数据抽象和封装 <2>信息隐藏,隐藏对象的实现细节,不让外部直接访问到 将数据成员和成员函数一起包装到一个单元里,单元以类的形式实现 < ...

随机推荐

  1. hadoop中DataNode消失挂掉的原因及解决方法

    昨天在进行Hadoop实验时遇到一个问题,在sbin目录下输入jps命令,查看当前节点的状态时,意外发现DataNode节点不见了!!于是回忆了一下自己之前的操作过程,大概是因为将自己进入文件夹,将某 ...

  2. ocker nginx 配置反向代理和负载均衡

    1. 获取及配置nginx 如果需要全站通过docker部署,那么nginx或许是不可或缺的.通过配置nginx,可以迅速实现负载均衡和反向代理服务.值得一提的是,docker官网恰好也有nginx镜 ...

  3. LOJ2587:[APIO2018]铁人两项——题解

    https://loj.ac/problem/2587#submit_code (题面来自LOJ) 考试时候发觉树很可做,并且写了一个dp骗到了树的分. 苦于不会圆方树……现在回来发现这题还是很可做的 ...

  4. 阿里云遇到的坑:CentOS7防火墙(Firewalld),你关了吗?

    阿里云官方教程: https://help.aliyun.com/knowledge_detail/41317.html 百度参考的牛人教程(推荐): http://www.111cn.net/sys ...

  5. linux 文件检索操作

    linux命令太多了,作为一个后端开发人员,常用的也就这几个 uname -a 查看版本 tail tail -f /data/wealth-consignment-service/logs/stat ...

  6. maven打包jar源码至私服

    1. setting文件 配置私服中设置的用户和密码 <servers> <server> <id>releases</id> <username ...

  7. STL之七:STL各种容器的使用时机详解

    转载于:http://blog.csdn.net/longshengguoji/article/details/8550235 C++标准程序库提供了各具特长的不同容器.现在的问题是:该如何选择最佳的 ...

  8. *和&的使用

    给变量起一个别名: int a = 2; int &b = a; 取a的地址,实参是一个指针: void chage(int *data) { } void main() { int a = ...

  9. [技巧篇]04.使用PowerDesigner逆向生成

  10. poj 2541 Binary Witch

    Binary Witch http://poj.org/problem?id=2541 Time Limit: 1000MS   Memory Limit: 65536K       Descript ...