前言

大多数写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. 通过logger命令记录日志

    通过logger命令记录日志 logger是一个shell命令接口,可以通过该接口使用Syslog的系统日志模块,还可以从命令行直接向系统日志文件写入一行信息. ------------------- ...

  2. [洛谷P5057][CQOI2006]简单题

    题目大意:有一个长度为$n$的$01$串,两个操作: $1\;l\;r:$把区间$[l,r]$翻转($0->1,1->0$) $2\;p:$求第$p$位是什么 题解:维护前缀异或和,树状数 ...

  3. 差点AFO

    差点就AFO了,小伙伴们一定注意护眼啊. 眼睛总算是活过来了. 还有一个月联赛,加油

  4. Indexing GROUP BY

    SQL databases use two entirely different group by algorithms. The first one, the hash algorithm, agg ...

  5. std::string::find() 和 std::string::npos

    npos是一个常数,用来表示不存在的位置,string::npos代表字符串到头了结束了.   int idx = str.find("abc");if (idx == strin ...

  6. Educational Codeforces Round 6 B

    B. Grandfather Dovlet’s calculator time limit per test 1 second memory limit per test 256 megabytes ...

  7. [ZJOI2010]排列计数 (组合计数/dp)

    [ZJOI2010]排列计数 题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有 ...

  8. 洛谷P3178 [HAOI2015]树上操作(dfs序+线段树)

    P3178 [HAOI2015]树上操作 题目链接:https://www.luogu.org/problemnew/show/P3178 题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边 ...

  9. udhcpd源码分析3--IP租赁管理

    1:重要的结构体 全局链表的成员struct dhcpOfferedAddr *leases 记录了当前租赁出去的IP信息 /* leases.h */ struct dhcpOfferedAddr ...

  10. c# MD5盐值加密

    using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptograph ...