具体实施方式
本发明是采用XML(Extensible Markup Language,即可扩展标记语言)、或者使用WSDL(Web Services Description Language,网络服务描述语言)或UDDI(Universal DescriptionDiscovery and Integration,统一描述、发现和集成协议)对函数库或构件的对外接口进行描述,然后进行封装处理为含有描述信息的构件或函数库,使用户能够方便的从函数库或构件中得到相应的描述信息和如何使用的指导信息,从而在软件中使用该函数库或构件。
如图1所示,本发明采用如下方式来实现:
步骤S101、读取构件或函数库的源码中用户添加的接口注释信息,或在构建构件或函数库时由用户输入有关构件或函数库的对外接口的注释信息。
步骤S102、将注释信息转换处理,按预定的格式生成构件或函数库的对外接口的描述信息。
构件或函数库的对外接口的描述信息包括但不限于如下信息:函数库或构件名字、函数库及构件描述、版权所有者信息、厂家信息、创建者信息、使用的编译器及基于的操作系统、使用平台、发布日期、版本、修订历史记录、对外接口描述和注释信息等。
步骤S103、封装处理:将构件或函数库的对外接口的描述信息、构件或函数库的源码编译的结果一并封装成含有描述信息的软件构件或函数库;当然,构件或函数库的对外接口的描述信息也可以编码封装,也可以原封不动的封装到函数库或构件之中。
实施例1
本实施例采用XML语言对函数库或构件的对外接口进行描述。
借助工具从构件或函数库源码中读取必要的注释信息,或者由用户输入必要的注释信息。这时就要求构件或函数库的源码中对接口的注释采用标准的注释规格以及一致的关键词词条,比如,也使用以上描述相仿的XML格式进行描述。
XML对源码的描述包括两部分注释信息,一部分为基本注释信息描述,一部分为对外接口注释描述信息,都由XML语言进行描述。
基本注释信息描述如下:
/**********************************************************
<?xml version=″1.0″encoding=″GBK″?>
<lib name=″mygui″>
<Description>gui库对外接口的描述</Description>
<Copyright name=″skyworth″address=”shenzhen”/>
<Corporation name=″skyworth″address=″shenzhen″/>
<Creator name=″王五″address=″shenzhen″/>
<Compiler name=”gcc3.4”/>
<OS name=”linux2.6”/>
<Platform name=”ST7101”/>
<issue date=″2009-7-21″/>
<Version value=″1.0″/>
<Revise history>
<Item revise No=”1”Author=”张三”review=”李四”description=”问题描述1”Issue_date=″2008-01-20″/>
<Item revise No=”2”Author=”张三”review=”李四”description=”问题描述2”Issue_date=″2008-02-20″/>
</Revise history>
/lib>
**********************************************************/
基本信息注释中注释了该库的库名字、版权人信息、厂家信息、创建者信息等信息,以及得到所使用的编译器为gcc3.4,运行的操作系统为linux2.6,平台为ST7101,发布日期为2009-7-21,版本为1.0,该库的修订记录有两条等信息。
而构件或函数库的对外接口的注释信息也采用XML语言描述如下:
/*****************************************************
<?xml version=″1.0″encoding=″GBK″?>
<Interface>
<Type>
<element name=″result″type=”int”>
<element name=″rect″type=”RECT”>
<element name=″x″type=″int″/>
<element name=″y″type=″int″/>
<element name=″dx″type=″int″/>
<element name=″dy″type=″int″/>
</element>
<element name=″bm″type=”BITMAP”>
<element name=″r″type=″RECT″/>
…
</element>
</Type>
<Message name=″draw_rect_msg″>
<Part name=″rect″/>
<Part name=″bm″/>
</Message>
<Operation name=″Draw_Rect_Cmd″>
<input message=″draw_rect_msg″/>
</Operation>
</Interface>
*********************************************************/
从上述接口XML注释信息中注释了接口的用法信息,包括三个部分:Operation部分定义构件或函数库的对外接口名称及要传递的参数;传递的参数在Message部分定义,其中每一个part对应一个参数;参数的数据类型在Type部分定义。
从源码注释信息中通过获取上述对外接口的注释信息后,生成如下所示由XML语言描述的构件或函数库的接口描述信息,并打包到构件或函数库中。当然如果源码中没有相应的XML注释信息,可以根据用户输入的上述信息进行构件或函数库的打包。
/**********************************************
<?xml version=″1.0″encoding=″GBK″?>
<lib name=″mygui″>
<BaseInfo>
<Description>gui函数库对外接口的描述</Description>
<Copyright name=″skyworth″address=”shenzhen”/>
<Corporation name=″skyworth″address=″shenzhen″/>
<Creator name=″王五″address=″shenzhen″/>
<Compiler name=”gcc3.4”/>
<OS name=”linux2.6”/>
<Platform name=”ST7101”/>
<issue date=″2009-7-21″/>
<Version value=″1.0″/>
<Revise history>
<Item revise No=”1”Author=”张三”review=”李四”description=”问题描述1”Issue_date=″2008-01-20″/>
<Item revise No=”2”Author=”张三”review=”李四”description=”问题描述2”Issue_date=″2008-02-20″/>
</Revise history>
/BaseInfo>
<Interface>
<Type>
<element name=″Rect″type=”RECT”>
<element name=″x″type=″int″/>
<element name=″y″type=″int″/>
<element name=″dx″type=″int″/>
<element name=″dy″type=″int″/>
</element>
<element name=″color″type=”RGB”>
<element name=″r″type=″unsigned char″/>
<element name=″g″type=″unsigned char″/>
<element name=″b″type=″unsigned char″/>
</element>
<element name=″bm″type=”BITMAP”>
<element name=″r″type=″RECT″/>
</element>
<element name=″result″type=int>
</Type>
<Message name=″draw_rect_msg″>
<Part name=″Rect″/>
<Part name=″color″/>
</Message>
<Message name=″result_msg″>
<Part name=″result″/>
</Message>
<PortType name=″GuiQuotePortType″>
<Operation name=″Send_Draw_Rect_Request″>
<input message=″draw_rect_msg″/>
</Operation>
<Operation name=″Draw_Rect_Cmd″>
<input message=″draw_rect_msg″/>
<output message=″result_msg″/>
</Operation>
/PortType>
</Interface>
</lib>
**********************************************************/
从上述XML描述代码可以看出,构件或函数库的描述信息包括两部分信息:一部分为基本描述信息,一部分为对外接口描述信息。
基本描述信息中我们可以得到:函数库的库名字(对应代码lib name)为“mygui”、版权人(对应代码为Copyright name)信息为“skyworth”、厂家(对应代码为Corporation name)信息为“skyworth”、创建者(对应代码为Creator name)信息为“王五”等信息,以及得到所使用的编译器(对应代码为Compiler name)为gcc3.4.6,运行的操作系统(对应代码为OSname)为linux2.6,平台(对应代码为Platform name)为ST7101,发布日期(对应代码为issuedate)为2009-7-21,版本(对应代码为Version value)为1.0,该函数库的修订记录(对应代码为Revise history)有两条等信息。
而从函数库的对外接口描述信息中,可以看出该函数库的对外接口包括两个操作:一个发送一条消息,没有返回结果的操作;一个发送一条消息,并返回结果的操作。
而函数库的对外接口的操作在代码PortType中定义,PortType是对外接口的容器,由一个个操作operation构成,接口操作中传递的参数采用消息Message进行封装,Message又是元素element的容器,Message由一个个元素element构成,元素element对应要传递的具体参数,消息Message中有几个元素,就对应操作中要传递几个参数,元素element的类型可以由基本数据类型定义,也可以由复杂数据类型定义,复杂数据类型采用递归定义,即复杂数据类型可以由基本数据类型定义,也可以由复杂数据类型进一步构成更复杂的数据类型。
用户使用打包后的构件或函数库时,就可以从中得到构件件或函数库的如上描述信息,从而可以正确使用。
实施例2
可以独立使用WSDL或UDDI语言对函数库或构件的描述进行描述,而函数库或构件中只封装指向由WSDL或UDDI语言对该函数库或构件的接口描述的URL(UniformResource Locator,统一资源定位符,又称为网页地址)。比如如下描述代码:
由于WSDL或UDDI语言是开放标准,因此具体格式不再陈述。
/**********************************************************
<?xml version=″1.0″encoding=″GBK″?>
<lib name=″mygui″>
<Wsdl>
<wsdl:address location=″http://example.com/guilib.wsdl″/>
</Wsdl>
<UDDI>
<uddi:address location=″http://example.com/guilib.uddi″/>
</UDDI>
/lib>
**********************************************************/
综上,本发明提出了使用XML,或者使用WSDL或UDDI语言对构件或函数库的自描述方法,以及相应的源码接口的注释方法,采用本发明可以方便的从源码中构建构件或函数库的描述信息,并与构件或函数库打包封装到一起,使用户方便的从构件或函数库中得到相应的描述信息和如何使用的指导信息,从而能够在软件中使用该构件或函数库,不会造成可能丢失或没有公开源码的构件或函数库的资源和智力的浪费,有利于推进构件或函数库在软件开发中的更广泛使用。