多态VI

一、多态VI的概念


图1:一些多态 VI

    LabVIEW 提供的一些 subVI,它们可以用于处理多种不同类型的数据。比如读写INI文件的VI,它们既可以读写数值型的数据,也可以读写字符串、布尔等数据类型。类似的还用声音输出的VI、数据采集的VI等等。
    这种可以处理多种不同数据类型的 VI 被称为“多态VI”。这个多态和 C++ 中的多态可不是一个意思,它更类似于 C++ 中的函数重载。
    多态 VI 根据输入或输出的数据类型,再选择调用一个的针对这种数据类型实现功能的 VI。这些准对某种数据类型实现功能的 VI 被称作“实例VI”。一般一个多态VI调用多个实例VI。

    在这种场合下,比较适合使用多态VI:你帮助用户实现了一个算法,这个算法会应用到几种不同的数据类型上。为了用户使用方便,最好是不是给用户看到一组不同的VI,这样他在使用前,还要根据数据类型的不同先去寻找适合的VI;最好是指停工一个统一的接口VI,这个VI可以接受不同的数据类型,这个接口VI自动的根据输入数据类型的不同,去调用相应的算法VI。

二、如何实现多态VI

    比如说,我们现在需要提供给用户一个加法功能,它支持两种数据类型:整数和字符串。如果输入是两个正整数,输出就是它们的和;如果输入是两个字符串,输出就是把两个字符串连接在一起。
    对于这个需求,我们需要实现一个多态VI:"add.vi",这个VI支持两种数据类型:数值和字符串。这个名为"add.vi"的VI根据输入数据的类型,再去调用两个实例VI:“add numeric.vi”和“add string.vi”来实现具体的加法功能。它们的调用关系如图1所示。


图2:一个实现加法功能的多态VI的调用关系

    我们在实现这样的多态VI之前,一般先实现它的实例VI,就是那些针对每个数据类型完成算法功能的VI。在这里是“add numeric.vi”和“add string.vi”。
    完成了实例VI,就可以开始创建多态VI了。在 LabVIEW 的菜单中选择 File->New,出现 LabVIEW 新建项目的选择对话框,再选择 VI->Polymorphic VI 就会出现一个新的多态VI。
    多态VI和普通的VI看上去不一样,没有前后面板。因为它的功能都是在实例VI中实现的,因此多态VI只要选择一下它的实例VI就可以了。


图3:多态VI

    在多态VI的界面上,右上方是这个多态VI的图标。我们可以在这里画一个图标,让用户在使用多态VI时,程序框图上一直显示此图标。但是,有时候使用实例VI的图标,可以让程序显得更清晰,那么我们可以在多态VI左下方配置此选项。
    多态VI的主体部分是一张列表,通过“Add”按钮,可以把它的实例VI添加进来。在用户的程序框图上,多态VI的数据类型可以自动确定,也可以由用户通过右键菜单或选择栏(图1中多态VI下面那个紫色方框)来选择。实例VI列表中的“Menu Name”和“Selector Name”分别是在选择是代表每种数据类型的在菜单和选择栏中的文字,可以通过“Edit Name”按钮来编辑它们。
    多态VI右下方两个选择框,“Show Selector by Default”表示当多态VI被拖到程序框图上的时候,就把选择框显示出来。否则,用户也可以通过右键菜单选择显示它。
    “Allow Polymorphic VI to Adapt to Data Type”表示有多态VI根据输入数据类型的不同,自动选择调用一个相应的实例VI。如果这项没被选中,编程者必须每次手动选择他想要的实例VI。

三、多态VI的注意事项

    在设计多态VI时,有一些事项需要注意。
    多态VI只能处理有限种数据类型,它只能处理实例VI中处理了的那些数据类型。数据的类型是无限的,比如:包含两个整数的簇(Cluster)是一种数据类型,包含三个整数的簇就变成另一种数据类型了,包含三个字符串的簇又是一种新类型。如果你想做一个多态VI可以像LabVIEW原有的加法函数一样处理无限种数据类型,是做不到的。
    多态VI的每个实例VI可以是完全不同的,前面板,程序框图,使用的子VI等等都可以完全不同。但是,为了便于用户理解,一个多态VI应该就是处理某一种算法的,它的每个实例VI负责一种数据类型。并且,为了便于用户在不同的数据类型之间切换,每个实例VI的接线方块(Connector Pane)的接线方式都应当保持一致。
    多态VI不能嵌套使用,一个多态VI不能作为其他多态VI的实例VI。

四、小技巧

    你可以把多态 VI 的右键菜单,选择某个实例 VI 那一项做成有层次的多级菜单。只要 Menu Name 中输入菜单的层次结构,使用冒号:作为层级分隔符就可以了。比如下面这个例子:


图4:有层次结构的快捷菜单

《我和 LabVIEW》目录

《太阳照常升起》观后感

    得益于中国反盗版的不利,我已经看过数不清的电影了。虽然我肯花时间去看的电影都是有一定好评的电影,但是,按照我对它们的喜爱程度,还是可以再把它们分为三类:少数电影我看了之后仍然留在电脑上,过后还会再欣赏几遍;大多数电影虽然也很优秀,但都不值得我重看;还有少一部分是被宣传给骗了,看上几眼觉得没意思,我就开始往后拖进度条,如果全片都没什么亮点,可能几分钟就浏览完全片了。

    除此之外,偶尔会有那么几部影片是我对他们充满期望,不论它们多滥,我都耐着性子看完的。这样的影片都是国产影片。国产片中能跟我电脑上充斥的美国大片一较高下的实在是少得可怜,我是多期望能在国产片找出点亮点来啊。
    《太阳照常升起》就是这样一部影片。前天晚上,我花了一个多小时把它看完。之后心情极其郁闷,这一个小时干点什么不好,浪费在它上面真是太不值了。今天想想,还是写一篇观后感,缅怀一下我的失望,这样我那一个多小时就不算全浪费了。

    两个多月前,我和同事拼车上下班。每天早晚两次,我都坐在锦江出租,司机斜后方那个位置。路上无聊,我就盯着前座的小电视看广告。相当长的一段时间里,《太阳照常升起》的预告片在里面反复的播出。预告片拍的相当不错,有秀美的南部山村、尽情歌舞的人们、奔驰的列车驶过、一块燃着的红布随风飘去……于是我对这部影片也产生了好感和期待。
    谁知看了全片后发现,整个影片值得一看的地方,我原来都已经在预告片中看过了。
    该怎么评价这位导演的,也许是江郎才尽了吧。我至今还记得同为姜文导演的《阳光灿烂的日子》,那里面少年们的痛苦和欢乐、冲动与压抑,都激起了我的共鸣,让我回想起自己的少年时代。《阳光灿烂的日子》我来回看了好几遍;后来的《鬼子来了》就只值得我看一遍了;《寻枪》是拖着进度条看完的。
    《太阳照常升起》,看得出,比前几部拍的都要精致,不论是演员还是景点得选取,都是从前不能比的。恐怕这部影片的投资不在前几部一个数量级。但影片最重要的东西却缺失了,简单地说,影片既没娱乐性,也没思想性,最终成了一个精心制作的垃圾。艺术这东西要高于生活,但却不能脱离生活。有些艺术工作者,搞不出什么有新意的东西,只是一味的把自己每一部作品向着自己认为是艺术的方向再推进一步。最终却是完全脱离现实生活,也失去了观众的支持。
    就以《太阳照常升起》中几个主要人物为例,妈妈是疯子、儿子是傻子、小梁人格分裂、林大夫花痴、老唐夫妇是堕落放荡的一对。这些人的故事如何可以引起普通“正常”观众们的共鸣呢?这就注定了影片不会有好的票房。
    而乏味的故事情节不会因为颠倒一下顺序就变得充实,肤浅的思想也不会因为故弄玄虚就得到提升。这部影片注定也不会赢得多少叫好,就更不要提国际奖项了。

《生活随笔》目录

用户界面设计 3 – 界面元素的关联

    
图1:两个菜单

    上图左边是 LabVIEW 中的一个菜单。右边那个是我自己对它的“改进”。大家觉得那个好一些?
    显然用户更喜欢组织清晰合理的那个菜单。当一个界面上的元素比较多,找到自己想要的信息就要花上一小点时间。用户常常是一眼就看到了一个与自己想要的信息有一点关联的某个元素,他这时候会期望这个元素就有一定的提示信息,帮他加速找到自己想要的东西。因此,我们要在界面上,告诉用户哪些元素是相关的,或不相关的。
    有很多手段可以把界面的元素之间的关联显示给用户,比如通过元素的排布、边框、空白、颜色、字体等等方式。

    我们总是在相关内容的附近去找想要的信息,所以逻辑上相关的控件或项目,应当在屏幕空间上相对临近。比如刚刚看到的菜单,Save, Save As, Save All,等等与保存相关的条目应当排在一块。
    仅仅把相关内用摆在一起还不够,看看下面这个图片。

  
图2:小朋友的名字

    这是我在网上看到的一个经典笑话:老师发作业本的时候,念小朋友们写在本子上的名字:“黄肚皮”,“鱼是虫”。但是没人答应,最后有两个小朋友没拿到本子,他们的名字分别是“黄月坡”和“鲁蛋”。小朋友们虽然把界面元素按照顺序排列了,但却没有合理的组合它们。
    我们上面看到的菜单,有二十多个条目,单纯的把他们排在一起还是不利于用户查看。可以把它们按功能分成几个不同的区域,比如保存文件与Project的操作在功能上相对独立一些,就可以用分隔线,帮它们的项目划分开。对于面板上的控件,功能相关的几个控件可以通过被边框围住、使用分割线、采用不同的间隙等等方法,让用户直观的感觉到他们在功能上的紧密关联。

    还有一种表示控件间关联性的方法值得多叙述几句,就是利用不同的颜色。球场上的两组队员,开始分列于球场两端,很容易区分他们是哪一伙的。而一旦比赛开始,这种空间上的提示就不存在了,这时大家主要靠队员衣服的颜色来区分它们属于哪支队伍。在界面设计上当然也可以使用这种方式,为不同功能的控件设置不同的颜色。
    需要注意的是,颜色只能作为辅助方式,前几种方法不适用的时候,才需要用颜色来表示关联。颜色与前面提到的几种方式不同:大多数人喜欢排列整齐,布局合理的界面,但喜欢界面颜色丰富的人就不那么多了。相反,颜色艳丽、对比度高的界面会使人视觉疲劳,让人觉得反感。


图3:LabVIEW 颜色配置

    LabVIEW 配置颜色的面板上分了几类不同的颜色区域。设计系统风格的时候,需要使用系统颜色。其他情况下,尽量使用柔和颜色,避免使用靓丽鲜艳的颜色。还要考虑到色盲、色弱的发病率也是蛮高的,界面设计时要照顾到这些用户。
    所以,界面内容不多时,就尽量不要使用颜色了。只有当界面上信息量特别大的时候,颜色才会派上用场。需要使用图片的情况就不用说了,除此之外信息量较大的情况是有大量文字的时候。需要把不同的文字区分开来的时候,比如标注所有拼写错误的单词等等,就可以利用颜色来区分。当然,这时候也可以利用字体,字号等的不同来达到同样的目的。

    界面设计中的很多原则,与艺术创作的原则一样,是以心理学中对人脑视觉认知的研究为理论依据的。心理学中与界面元素关联相关了一些理论可以参考《形状知觉中的分组》

《我和 LabVIEW》目录

噩梦成真

    我比较常见的一种噩梦是与牙齿有关的梦。有时候梦见吃东西,吃着吃着,牙齿就松动了,或者碎裂甚至脱落下来。每每这时,我都会极其痛苦。好在梦醒后,可以长出一口气,庆幸这只是个梦。

    上个周末,我正趴在正大百货的栏杆上看风景呢,突然就觉得右边的牙齿不太舒服,用舌头一舔,居然添到几个小骨头茬。一种不祥的预感马上袭来。果然,再添了几下之后,又掉下了一些更大的碎片,左上方第三颗大牙出现了一个裂口。怎么会又有一颗蛀牙呢?
    我当时在陪客人,只好先不去管它了。而第二天星期一,我又一早动身去了西安。在到了西安后又有一块更大的碎片掉了下来。好不容易熬到星期五,早上坐飞机回到上海,下午我就去了医院补牙。
    这是我的第四颗蛀牙。我的牙齿也许是因为小时候缺钙,或者别的原因,长得不是特别结实,比较容易坏。而且我的蛀牙也生的特别讨厌,我的虫牙都是从内部开始蛀的。在牙齿没碎裂之前,从外面根本看不出任何毛病。我曾经找医生检查过我的牙们,都看不出有什么已成。但是某一天,某颗牙齿突然就会碎裂,这才发现原来里面已经被蛀掉很大一个洞了。

    我现在左上方一连三颗大牙都是被补过的,吃锅巴、肉干一类的东西就只能靠右侧腮帮子了。看着嘴里其它还完好无损的牙齿,真担心它们也会在某一天突然碎掉。

《生活随笔》目录

西安之行的照片

    虽然在西安的工作计划安排的蛮紧张的,但我还是抽出了一上午的时间,和同事一起去了一趟兵马俑。来西安不去看看兵马俑就太遗憾了。虽然在电视上看过无数次了,但是真的看到两千年前的陶像站在眼前,还是被他们一下子震撼住了。对于两千年前的科技而言,这是项多么浩大的工程啊。而且居然史料中没有记载。
    我给兵马俑们拍了些照片,出门的时候才注意到,这里不须使用闪光灯,我拍照的时候都没注意,真是不好意思。游客们大多开着闪光灯,工作人员也不说提醒一下。

    西安有我几个亲戚,这次去,见到了一个我以前从未见过的远房表妹。临走的前一天晚上,她和她男朋友还特意带我参观的西安的大雁塔。他俩对西安的文化景点了解也不多,说不清大雁塔的历史,不过据我观察,这个塔大概是跟唐僧玄奘有点联系。
    真正吸引我的还是大雁塔北广场的音乐喷泉,据说这是世界最大的音乐喷泉广场。我本来没计划晚上出来逛的,所以穿的比较少。而西安的晚上还是相当冷的,我们七点多就到了,一直熬到八点半喷泉表演才开始。
    第一支乐曲《重返心灵花园》,是我最喜欢的曲目之一。看来喷泉的设计师还是比较有品位的。为此我觉得冻了一个多小时还是值得的。在喷泉广场也拍了两张照片,但是当时只有手机,效果差了些。

2007.11 西安之行的相册

西安的出租车

    上个星期没有更新 blog,我出差到西安去了。

    一出西安机场,就看到一个司机热情地招呼我们上他的出租。我也没多想就上去了,不过当时瞟了一眼它窗上贴的单价,是每公里2.4元。当时我想西安的出租居然比上海贵了这么多啊。
    汽车是一辆红旗,以前都没做过这么高档的的出租车,果然是比桑塔纳舒适多了。而且车内是没有驾驶员防护栏的,车厢显得格外宽敞。咸阳机场离西安市区还真是不近,高速上跑了好久才进市区。
    到市区我才发现,原来西安的出租车不都是这样啊。满大街跑的也都是捷达、富康一类的车,每公里收费只有1.5元。再跟司机详细打听了一下才弄明白,西安的出租车不是统一定价的。我们坐的这种是“高档车”,价格也高。一般专门在机场和五星级酒店门口排队。等到了我们的酒店一看表,180元,加上路桥费,有两百了。真是够“高档”的啊。

    后来跟有经验的人了解了之后,才知道,在机场打的是非常不合算的。比较经济的办法是,找一个出租司机建立固定的业务来往。到西安之前,跟他约好,然他去接你,那么只要100元就够了。如果是送机,只需80元。难怪我们后来打的的时候,司机的手机响了一路,都是跟他预订出车的老客户。
    跟据我短暂几天的片面观察,西安的出租司机似乎倾向于做自己擅长的两项不同的业务。
    一般的业务自然是满大街转,遇到客人,让去哪就去哪。我坐过的几辆这样的车,它们的司机都是操着一口浓重的陕西话。虽然我也能听懂,但是比较费劲。他们开车的技术让我胆战心惊,车速特快,而且喜欢在车流里转来转去,有一点小缝都可以挤进去。以前觉得上海的出租司机很疯狂,但是跟西安的一比,他们简直就是遵守交规的好模范啊。
    还有一类司机,是专门在酒店门口排队的,他们倾向于拉游客去风景点。一般是一大早就在固定的酒店门口排队了,然后拉客人去转一天。如果去风景点,就不能打表了,一定要和司机讲价,120一天是比较合理的价格。千万不要担心司机会赔了,做这种生意的司机主要是靠收风景点、商铺的回扣赚钱的。
《生活随笔》目录