软插件模式在W indow s语音助手中的应用*

2011-12-08 00:23孙淑娟牟德昆
潍坊学院学报 2011年4期
关键词:插件文档对象

孙淑娟,牟德昆

(烟台职业学院,山东 烟台 264001)

通过开发W indow s语音助手软件,从软件设计分析中得出该软件分为三个核心模块:语音引擎、语义分析、辅助操作。辅助操作模块的设定目的是用程序替代人完成日常的手工操作,在研究实现中发现功能需要进行Window s基本操作、常用软件的操作,如果要实现之,辅助操作的范围将是一个很大的范畴,特别是其中常用软件随着时间的变化而有可能增加,所涉及的范围不容易界定,这样给软件的开发带来扩展的要求。需要一种模式,不影响并可复用前期开发的软件成果,而且能够与前期开发无缝衔接,最好不用对前期开发重新编译便可使前期开发使用到的新技术,又可最大限度的利用前期开发中的成果。

软插件作为软件的一种集成机制,具有以下特征:①模块性好,独立性强;②可靠性好;③内部功能的高效实现;④连接简单,使用方便;⑤有封装功能;⑥清晰、简明的说明。

使用软插件模式的例子有很多,如著名的Java开发环境Eclipse就是一个最典型的使用软插件模式的软件,各种插件集中在Eclipse的一个名称为p lugins的文件夹中,以*.jar形式打包,通常还都配有相应配置文件p lugin.xm l用于提供插件的配置参数信息。Eclipse在启动时自动扫描此文件夹,并装入各种组件。又如图像处理软件Pho toshop用于实现图像特效的滤镜,也是软插件技术装载的。

通过分析,决定使用软插件模式来开发辅助操作部分,使系统可以承受辅助操作的功能变化。在实现的过程中模仿了Eclipse的插件体系,使用的核心技术是反射。

1 关键技术:C#中的反射

1.1 反射

反射是面向对象技术的一个重要发展,技术特点是允许一个对象的类型到程序运行时才确定,这样源代码中部分代码所要创建的对象类型是动态可变的。在动态创建对象之后,使用反射技术还可以动态地调用对象的方法。

在C#中,通过反射可以在运行时获得.Net中每一个类型的成员,包括方法、属性、事件以及构造函数等,还可以获得每个成员的名称、参数等。如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道。

程序代码在编译后生成可执行的应用程序,.Net的应用程序结构分为程序域—程序集—模块—类型—成员几个层次。程序集包含模块,而模块包含类型,类型又包含成员。反射提供了封装程序集、模块和类型的对象。可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。

(1)使用A ssembly类的静态方法Load From()创建A ssembly对象。用于加载指定的程序集,并得到一个程序集对象,可从此程序集中查找类型并创建该类型的实例。

(2)使用A ssembly对象的Create Instance()方法创建指定类型的对象Obj。Create Instance方法在创建一个具有无参数默认构造函数的对象时比较方便,其定义:Public object Create Instance(string typename)。当然待创建对象的类必须包含在该程序集中。

(3)使用Obj.Get Type()获取类型对象_type。

(4)使用_type.GetM ethod()得到M ethod Info对象m td。根据已知方法的名称、返回类型、访问修饰符(p rivate、public)等特征找到指定方法,并得到可发现指定方法的属性和访问方法元数据的对象m td。

(5)使用m td.Invoke()方法调用方法。调用由M ethod Info实例m td反射的方法。

1.2 关键类说明

1.2.1 Type类

Type类是C#中一种特殊的类型,是用于表达数据类型信息的数据类型,也是访问元数据的主要方式。使用 Type的成员获取关于类型声明的信息,如构造函数、方法、字段、属性 (Property)和类的事件。

1.2.2 创建Type对象

.Net Framework所有的类都派生于Object类,Object类提供的 GetType()方法,可以通过对象调用GetType()获取其类的信息。

1.2.3 查询类的方法

Type类 GetM ethods()方法可以用于获取类型所有方法的清单,返回值是M ethod Info类型数组。也可以按给定方法名,获得该方法的M ethod Info对象,例子:

2 软插件模式的应用

2.1 类的设计

Window s语音助手是根据用户的语音,用辅助操作来代替用户应该进行的手工操作,而这些辅助操作的实现将以程序方法实现,需要调用方法的个数可能是一个也可能是多个,可以说语音助手进行辅助操作时就是调用相应功能实现的方法。

2.2 具体实现

辅助操作模块的核心是动态代理中心(Proxy类),该类集中所有与动态调用方法相关的模块程序。

2.2.1 初始化运行环境

(1)读取项目运行所需的所有配置文档。配置文档是在项目文件夹下的p lugins文件夹中所有XML文档,配置文档有两类。

●程序集的配置文档,文件后缀统一为-p lugins.xm l,内容样例如下:

●辅助操作的动作说明文档,文件后缀统一为-actions.xm l,内容样例如下:

在.Net中,DataSet类拥有非常完善的对XML文档进行操作的方法,如ReadXm l方法,可以将XML架构和数据读入到DataSet对象中,并转换为数据表的形式。在项目启动时,程序使用数据集DataSet对象读取XML文档,完成XML数据到表数据的转换,并根据类之间的关系,建立DataRelation对象以确立表之间的父/子关系,为后续工作中读取和查找配置文档中的信息做准备。

(2)根据数据集DataSet中的配置信息加载所有程序集

在开发辅助操作所涉及替代手工操作方法的时候,根据方法功能相近的原则,将方法模块分类后集中成为类库。类库的文件扩展名为DLL文件,项目启动后,通过加载的配置信息找到对应的DLL文件,并加载后形成A ssem bly类的对象集合。

2.2.2 查找对应的动作信息

项目的语义分析模块会根据语音引擎提供的用户语句进行分析,得出需要的关键字,例如用户语句为“最大化记事本”,可得出动作关键字“最大化”,参数关键字“记事本”。根据分析结果,在数据集DataSet对象中的Action表里,使用动作关键字“最大化”在动作描述信息字段descrip tion中进行比对,查找出对应记录,再通过已经建立好的表之间的父/子关系,找到完成该动作所需的方法信息,以及执行方法所需的参数信息,并将信息汇集到Action对象中,这样执行用户语句命令所需的配置信息准备完毕。

2.2.3 参数值的修正

语义分析得出的参数,由于是从文本语句中得来,所以参数值的类型是String类型,而方法执行时参数的要求不是String类型所能满足的,修正的目的是让参数能最大限度地符合程序运行的要求。

(1)类型修正

某些方法在运行时需要的类型可能是如Int32、DateTime等其他类型,所以在传递参数之前要将分析得到的参数值转换成参数信息中规定的类型。做法是如Int32、DateTime等常用类型中都有Parse方法,该方法的功能将指定字符串转换成规定类型。可以使用反射技术生成指定类型,并在该类型的Type对象中查找到Parse方法的说明—M ethod Info对象,回调该方法完成参数值的类型转换。类型修正是整个参数修正的基础。

(2)参数修正

参数修正是根据语义分析所得的用户命令、该方法的参数说明信息、参数初值、要完成动作所需所有方法的返回值进行修正的,主要分3种情况。

●该参数值使用的是前面方法的返回值。在文档中,这种情况使用“#”开头的数字标记,例如:〈Parameter name="w in Title"type="System.String"Value="#0"/〉

这个参数使用的是第一个方法的返回值,处理时直接进行赋值。

●该参数有初值。例如:〈Parameter name="w in Title"type="System.Int32"Value="2"/〉,将初值进行类型转换后使用

●没有初值的,使用命令中所含有的参数值,并按所需类型转换。

2.2.4 执行完成动作所需的方法

TransferMethod方法是Proxy类的核心方法,它的任务是根据分析得到的用户命令执行对应的辅助操作中规定所有方法。具体的步骤是首先依据用户命令中的关键字查找动作说明信息Action,提取方法的说明信息以及其参数的说明信息。然后通过比对名称空间namespace,在程序集集合中找到对应A ssembly对象,修正参数值后,使用反射执行该方法。

3 结束语

在整个开发过程中软插件模式体现出很多优点,它使辅助操作部分和主程序之间彻底分离开来,功能方法可独立开发,项目组间的影响减少。在后期的升级中辅助操作上的变化,只要改动XM L配置文档和配属新的对应DLL类库,程序重新启动后即可拥有新的功能,升级简便。它使系统拥有了一个开放的组件识别和装载体系,在这种体系下,实现了将用户常用的连续命令记录成XML配置信息保存下来,合成一个新的动作命令,这样做可以允许用户按自己的需要组合新的功能,方便了用户的操作。

[1]金旭亮.Net2.0面向对象编程揭秘[M].北京:电子工业出版社,2007.

[2]李丰,陈英,邬延风.基于领域复用的软插件库应用研究[J].北京理工大学学报,1998,18(6):771-774.

[3]石美红,毛江辉,延伟伟,等.在Window s平台下开发 Ethereal插件的方法与实现[J].计算机应用研究,2006,(10):234 -237.

猜你喜欢
插件文档对象
浅谈Matlab与Word文档的应用接口
涉税刑事诉讼中的举证责任——以纳税人举证责任为考察对象
有人一声不吭向你扔了个文档
自编插件完善App Inventor与乐高机器人通信
攻略对象的心思好难猜
基于jQUerY的自定义插件开发
基于RI码计算的Word复制文档鉴别
基于熵的快速扫描法的FNEA初始对象的生成方法
区间对象族的可镇定性分析
Persistence of the reproductive toxicity of chlorpiryphos-ethyl in male Wistar rat