具体实施方式
下面结合附图及具体实施例对本发明作进一步详细的说明。
实施例:
首先讲述本发明的原理:本发明中的动态自动适配技术编程技术,体现为XML-Glue编程技术,是嵌入式操作***上一个Rich Client应用的MVC(Model-View-Controller,模型-视图-控制器)开发框架,其核心的技术是基于CAR(Component Assembly Run-Time,零部件运行单元)构件技术发展起来的。XML-Glue的核心思想是使用XML/JavaScript来描述应用的UI(用户界面,User Interface),而由CAR构件来完成应用的逻辑,然后由XML-Glue来完成二者的拼装,并形成一个完整的应用,如图4所示为XML-Glue中的MVC框架模型。它对外提供了XML-Glue应用的运行环境以及多种脚本语言来使开发人员更方便快捷的开发应用,对内则在脚本语言和CAR构件***之间搭起了通信的桥梁,实现了以脚本方式完成构件组装。所谓MVC是Model-View-Controller的缩写,是国外用得比较多的一种设计模式为了获得更好的***结构而推出的一种宏观的设计模式,模式(Model)代表***的模型层,视图(View)是模型的展现层,控制器(Controller)负责业务的流转,使用MVC可以使得***的层次清晰,降低各个部分的耦合。MVC包括三类对象:Model是应用对象是数据与业务逻辑元件,封装的是数据源和所有基于对这些数据的操作;View是表示元件,也称为用户接口元件,封装的是对数据源Model的一种显示,一个模式可以用于多个视图,View是它在屏幕上的表示;Controller定义用户界面对用户输入的响应方式,是响应用户输入的元件,封装的是外界作用于模型的操作,控制器将用户接口转化为模式的变化,并定义用户接口对这些事件的响应方法。用户接口可包括处理多种协议的操作,如HTTP、WAP等。
完整的XML-Glue***架构可以表示为图1,其中:
1)最外层是XML-Glue运行环境(Runtime),负责初始化和释放XML-Glue应用所需资源。
2)内部顶层提供脚本语言及其配套设施,比如脚本语言与CAR构件方法调用之间参数类型的互相转换机制,XML与其它脚本语言之间的数据共享;这一层相当于提供了对MVC中View的支持。它又包括如下几部分:
XML/JavaScript/Other Scripts提供了多种描述XML-Glue应用的形式,让开发人员能够灵活利用各种脚本语言的优势;
Script Adapter是各个脚本语言中实现了ISCIParameterNormalizer接口的构件(称为SCIParamConvertor)的总称,该SCIParamConvertor是参数转换器,负责将其对应脚本语言中的弱类型参数转换为CAR构件方法中的强类型参数,而在构件方法返回的时候将返回值封装成脚本语言可识别的数据类型;
Error Interpreter(错误翻译器)是每种脚本语言中负责翻译调用构件方法的出错信息的翻译器的总称,它将CAR构件中的方法调用发生错误后返回的HRESULT值翻译成文本,并以脚本语言特定的错误机制(如JavaScript中的异常)通知给开发和使用人员。
3)SCI(Script Callable Interface)是脚本语言与CAR构件***通信的桥梁。这一层相当于提供了对MVC中Controller的支持,在组装机制实现一节会详细叙述。
4)CAR构件***,是服务的提供者。这一层相当于提供了对MVC中Model的支持。
在利用上述XML-Glue***进行开发时,Model由CAR构件***支持,View由脚本语言支持,作为Controller的构件组装则是XML-Glue的核心工作。XML-Glue利用脚本语言的众多优点,实现了一种新的适合于嵌入式***的构件组装机制,使得应用开发方便快捷。
图2所示过程描述了XML-Glue中的构件组装机制的实现过程:
a.脚本语言发起调用构件实例的方法;
b.SCI通过SCIModule或者SCIObjectFactory获取相应的构件模块,并创建脚本语言所请求的构件实例,封装成SCIObject,其中,该构件实例为构件实现的实例;
c.SCIObject使用Script Adapter进行脚本语言的弱类型参数向CAR构件的强类型参数的转换;
d.所述SCIObject向实际的构件实例发起调用请求;
e.构件实例的方法运行结束并返回;
f.SCIObject调用所述Script Adapter将返回值进行相应的封装,提供给脚本语言;
g.脚本语言获取返回值,完成调用。
要实现这一机制关键是解决脚本语言与构件间的交互问题。从图1可以看出,SCI处于脚本语言与构件***之间,是脚本语言与构件***通信的桥梁。SCI最主要的功能是调用构件实例的方法,所以其主要工作除了封装构件实例外,就是将脚本语言的参数转换为构件参数。这一转换过程是通过CAR构件技术对元数据的支持来实现的。元数据中存放了所有类、接口、方法和参数的数据,通过对元数据的分析计算,SCI能够找到所需的接口方法的入口点以及参数信息,使得以脚本方式操作构件成为可能。参数转换过程大致分为如下3个步骤:
1)由脚本语言引擎分析脚本语言从而获得原始的参数;
2)将脚本语言对应的SCIParamConvertor作为参数传递给SCIObject的Invoke方法。在执行该Invoke方法的过程中,SCIObject根据内部构件实例方法的元数据,调用SCIParamConvertor的Normalize方法向脚本语言提出转换请求(如果在xml中只有字符型数据<Methodl a=”50”b=”100”/>,而构件中方法的声明为HRESULT Methodl(int a,int b);,则需要将“50”,“100”转换成int类型)。SCIParamConvertor就根据元数据中描述的参数类型要求将脚本语言的弱类型参数转换成CAR构件方法中的强类型参数。称这个阶段为参数正规化;
3)将正规化后的参数转换为机器栈参数压入堆栈,调用内部构件的目标方法,完成方法调用。这一步依赖目标编译器的栈机制,对整个***概念无影响,不做讨论。
SCI由以下几个模块组成,见表1:
模块 |
描述 |
SCIModule |
对构件模块的抽象。封装了构件模块的元数据接口和IModule接口,以便于脚本适配。可以根据构件类名创建一个对具体构件实例封装的SCIObject实例,也可以根据构件类名获取对相应的类厂封装的SCIObjectFactory实例。 |
SCIObjectFactory |
对构件类厂的抽象。封装了元数据接口指针和构件类厂指针,以便于脚本适配。脚本语言获取它的实例后,对于需要创建同类构件多个实例的情况,可以提高运行效率。 |
SCIObject |
对构件实例的抽象。封装了构件实例的元数据接口和IObject接口,以便于脚本适配。脚本语言只能通过它来将操作请求发送给构件实例,由它来完成对构件方法的实际调用 |
表1SCI模块及其描述
通过一个简单的实施例即代码示例来看一看XML-Glue是如何描述一个应用的,具体代码如下:
1<?xml version=″1.0″encoding=″utf-8″?>
2<x:xglue xmlns:x=″http://www.koretide.com/xml-glue″
3xmlns:w=″elaever.dll″>
4<script language=″javascript″>
5<![CDATA[
6function OnBtnClick(){
7hello.text=″hello″;
8}
9]]>
10</script>
11<w:form caption=″Hello World!″left=″10″top=″10″
width=″70″height=″50″>
12<w:label x:id=″hello″left=″0″top=″0″width=″35″
height=″20″/>
13<w:button x:id=″btnl″caption=″Click Me″left=″37″
top=″0″width=″70″height=″20″>
14<x:event type=″Event_Click″
handler=″javascript:OnBtnClick()″/>
15</w:button>
16</w:form>
17</x:xglue>
程序中2-3行通过名字空间(xmlns)指定了所使用的CAR构件;4-10行嵌入了JavaScript脚本语言来添加一个事件处理函数,丰富应用的表现能力;11-17行用XML描述了构件实例之间的关系。
其运行效果可参见图3。左边是程序运行后的初始状态,当用户鼠标点击按钮Click后,程序界面变为右图所示样子,按钮左边打印出hello字样。
可见,XML-Glue描述应用的能力是十分强大且简洁的,大大简化了应用的开发难度、提高了应用开发的效率。
与XUL和XAML相比,XML-Glue技术在基于CAR构件技术的基础上,充分发挥了CAR构件技术的模块化、高效率等特点以及脚本语言的动态、灵活的特点,本发明XML-Glue在嵌入式***中也提供了相应的框架,为嵌入式应用的开发提供了新的选择。
综上所述,本发明能够动态拼装构件,构件只是专注于它自己的业务逻辑,而构件之间的联系则通过脚本语言来完成。本发明在给应用开发具有如下优点:
1)开发人员分工明确,提高开发效率。
简单是XML-Glue的一个主要优点。基于XML-Glue的应用UI和逻辑是分离的,而UI又是XML描述,与传统的界面编程相比,用XML来描述更易于使用。UI设计人员可以像设计HTML一样方便的设计应用程序界面,几行XML可完成原来很多行C/C++代码的工作。而程序开发人员则只需关注于应用业务逻辑的实现,不用再用C/C++来编写繁琐的UI了。这个事实可能最终带来用户界面开发更高的效率和更低成本。
2)易于应用维护、定制。
手机厂商可以为不同型号的手机应用维护一份核心的代码,因为基于XML-Glue的应用UI和逻辑是分离的,如果开发两款不同的手机,可能需要两种不同的UI,但是逻辑是一致的,那么只需将UI部分重新设计就可以了,复杂的逻辑代码(C/C++)则无需任何更改、编译等工作.而传统的应用中,UI和逻辑都用C/C++来实现,而且混杂在一起,一点点界面的更改都需要修改C/C++代码,并且重新编译等工作.可见XML-Glue也为应用的移植降低了很大的成本.
3)继承了CAR构件技术的优秀特性,应用具有很好的扩展能力。
因为XML-Glue基于CAR构件技术,所以,只要符合CAR构件技术标准的构件,都可以在XML-Glue中使用。例如,用户可以编写特定的UI控件,就可以象一种嵌入式图形操作***内置的UI控件一样使用;另外,如果需要,你甚至可以在XML-Glue中使用脚本语言来操作Socket,进行通讯。总之,只要通过CAR构件技术能够完成的工作,XML-Glue都可以很好的完成。