法律状态公告日
法律状态信息
法律状态
2017-02-15
未缴年费专利权终止 IPC(主分类):G06F9/44 授权公告日:20110525 终止日期:20151226 申请日:20071226
专利权的终止
2011-05-25
授权
授权
2008-09-03
实质审查的生效
实质审查的生效
2008-07-09
公开
公开
技术领域
本发明涉及计算机软件技术领域,特别涉及计算机构件化软件系统领域,具体是指一种计算机软件系统中实现构件对象在语境对象中自动具备语境特征功能的方法。
背景技术
随着现代构件化计算机软件技术的进一步发展,CAR(Component Assembly Runtime)构件技术是一种面向构件编程(Component Oriented Programming, 简称COP)技术,它定义了一套网络编程时代的构件编程模型和编程规范,规定了一组构件间相互调用的标准,使得二进制构件能够自描述,能够在运行时动态链接。
目前,CAR构件技术已在某些先进的嵌入式操作系统上实现, 在该嵌入式操作系统的SDK(Software Development Kit)下,用户很容易编写出自己的构件。
CAR构件技术的基础思想来源于微软的COM,但它对微软的COM进行了拓展,并且二者不兼容。CAR构件技术由CAR语言(构件描述语言,描述构件的元数据信息)、CAR编译器、自动代码生成工具以及CAR构件基础库支持。CAR构件技术体现了网络编程时代的特性,编程界面简单。
方面(aspect)构件对象模型是一种特殊的构件类实现,aspect对象的特征是可以被其它构件对象聚合,该构件类必须实现IAspect接口,aspect对象就是实现了IAspect接口的构件对象。关于方面构件对象模型以及构件动态聚合的具体技术细节信息,请参阅发明专利申请:“实现计算机软件系统中的构件动态聚合的方法”(申请号:200610027124.4,公开号:CN1851643,公开日:2006年10月25日)。
其中,动态聚合是通过IObject的Aggregate方法来完成的,因此构件编写者定义的每个构件对象都具有聚合其他aspect对象的能力。一般实现动态聚合都通过方面构件类提供的静态方法Attach(IObject*pObj)和Detach(IObject*pObj)方法来完成。
在现有技术的COM+中,当COM+激活对象时,它创建对象的环境(context),对象的环境与对象通过COM+紧紧附在一起。当COM+为对象创建环境时,它检查组件的目录项以便决定哪些属性需要被放到环境中。COM+的对象语境(context)紧密依赖对象,这样语境就失去了独立性。
但是在现实世界里,一个构件对象往往会随着环境改变而表现出(或拥有)不同的特征。当一个CChild对象被创建时,他是一个“小孩”,具有小孩的行为“玩”(Play),而把“小孩”送到学校,他就变成了学生,具有了学生的行为“学习”(Study),而当他从学校毕业,在进入新的环境(语境context)前他又变成了“小孩”。再比如宠物店的猫(构件对象),具有宠物和商品两方面的特征(aspect)。但猫刚生下来时却未必是宠物,更不会是商品;而一旦被售出,就不再是商品,但宠物特征却保留了下来。显而易见,让猫进入宠物店就拥有宠物和商品两方面特征,而离开宠物店后就丢弃商品特征,使用COM+是无法实现这种现实模型的,因为COM+本身不是一种随时聚合、随时拆卸的动态聚合模型,这样就制约了现代计算机软件技术的进一步发展。
发明内容
本发明的目的是克服了上述现有技术中的缺点,提供一种能够使得构件对象在不同的语境里具有不同特征、有效提高构件应用的灵活性、降低程序设计的复杂度、更好地描述现实世界模型、使用快捷方便、工作性能稳定可靠、适用范围较为广泛的计算机软件系统中实现构件对象在语境对象中自动具备语境特征功能的方法。
为了实现上述的目的,本发明的计算机软件系统中实现构件对象在语境对象中自动具备语境特征功能的方法如下:
该计算机软件系统中实现构件对象在语境对象中自动具备语境特征功能的方法,其主要特点是,所述的方法包括以下步骤:
(1)系统进行初始化操作;
(2)系统实例化语境构件类得到语境构件对象实例;
(3)系统实例化外部构件类得到外部构件对象实例;
(4)系统根据用户操作,对该外部构件对象实例进行进入所述的语境构件对象实例的处理操作;
(5)系统根据调用者的需要,调用所述的语境特征对象实例的构件接口;
(6)系统根据用户操作,对该外部构件对象实例进行离开所述的语境构件对象实例的处理操作。
该计算机软件系统中实现构件对象在语境对象中自动具备语境特征功能的方法中的语境构件类内包含有语境特征方面构件类属性,所述的对该外部构件对象实例进行进入所述的语境构件对象实例的处理操作,包括以下步骤:
(41)所述的语境构件对象实例创建语境特征方面构件类的对象实例;
(42)所述的外部构件对象实例动态聚合所述的语境特征方面构件类的对象实例;
(43)系统判断所述的外部构件对象实例是否已经动态聚合了所述的语境构件对象实例中所有的语境特征方面构件类的对象实例;
(44)如果否,则重复上述步骤(41)。
该计算机软件系统中实现构件对象在语境对象中自动具备语境特征功能的方法中的对该外部构件对象实例进行进入所述的语境构件对象实例的处理操作中的步骤(41)之前还包括以下步骤:
(40)所述的外部构件对象实例进行进入所述的语境构件对象实例前的制约处理。
4、根据权利要求2所述的计算机软件系统中实现构件对象在语境对象中自动具备语境特征功能的方法,其特征在于,所述的对该外部构件对象实例进行进入所述的语境构件对象实例的处理操作中的步骤(44)之前还包括以下步骤:
(45)所述的外部构件对象实例已经动态聚合了所述的语境构件对象实例中所有的语境特征方面构件类的对象实例后的制约处理。
该计算机软件系统中实现构件对象在语境对象中自动具备语境特征功能的方法中的语境特征方面构件类为所述的语境构件类内的静态属性。
该计算机软件系统中实现构件对象在语境对象中自动具备语境特征功能的方法中的对该外部构件对象实例进行离开所述的语境构件对象实例的处理操作,包括以下步骤:
(61)所述的外部构件对象实例动态拆卸聚合所述的语境特征方面构件类的对象实例;
(62)销毁所述的语境特征方面构件类的对象实例;
(63)系统判断所述的外部构件对象实例是否已经动态拆卸聚合了所述的语境构件对象实例中所有的语境特征方面构件类的对象实例;
(64)如果否,则重复上述步骤(61)。
该计算机软件系统中实现构件对象在语境对象中自动具备语境特征功能的方法中的对该外部构件对象实例进行离开所述的语境构件对象实例的处理操作中的步骤(61)之前还包括以下步骤:
(60)所述的外部构件对象实例进行离开所述的语境构件对象实例前的制约处理。
该计算机软件系统中实现构件对象在语境对象中自动具备语境特征功能的方法中的对该外部构件对象实例进行离开所述的语境构件对象实例的处理操作中的步骤(64)之前还包括以下步骤:
(65)所述的外部构件对象实例已经动态拆卸聚合了所述的语境构件对象实例中所有的语境特征方面构件类的对象实例后的制约处理。
采用了该发明的计算机软件系统中实现构件对象在语境对象中自动具备语境特征功能的方法,由于其基于方面构件类模型和动态聚合技术实现了外部构件对象实例在进入不同的语境时能够具有不同的语境特征,也就是说可以使不同的外部构件对象实例不用各自编码就能够具备相应的环境特征,从而突破了COM+的对象语境(context)紧密依赖对象的限制,提高了构件应用的灵活性,在CAR构件的面向方面编程领域是一次重大的进步;同时降低了程序设计的复杂度,为构件面向方面编程提供了更宽广的空间,为软件工厂化提供了一条更简便的途径;而且提高了软件的可扩展性,能够更好地描述现实世界模型,方便了用户对不同需求的扩展,为计算机构件化软件技术的进一步发展奠定了坚实的基础。
附图说明
图1为本发明的计算机软件系统中实现构件对象在语境对象中自动具备语境特征功能的方法中外部构件对象实例进入语境构件对象实例的流程图。
图2为本发明的计算机软件系统中实现构件对象在语境对象中自动具备语境特征功能的方法中外部构件对象实例离开语境构件对象实例的流程图。
图3a、3b、3c和3d为本发明的计算机软件系统中实现构件对象在语境对象中自动具备语境特征功能的方法具体实现过程的原理示意图。
具体实施方式
为了能够更清楚地理解本发明的技术内容,特举以下实施例详细说明。
请参阅图1和图2所示,该计算机软件系统中实现构件对象在语境对象中自动具备语境特征功能的方法,包括以下步骤:
(1)系统进行初始化操作;
(2)系统实例化语境构件类得到语境构件对象实例;
(3)系统实例化外部构件类得到外部构件对象实例;
(4)系统根据用户操作,对该外部构件对象实例进行进入所述的语境构件对象实例的处理操作,其中,语境构件类内包含有语境特征方面构件类属性,该语境特征方面构件类为所述的语境构件类内的静态属性,所述的处理操作包括以下步骤:
(a)所述的外部构件对象实例进行进入所述的语境构件对象实例前的制约处理;
(b)所述的语境构件对象实例创建语境特征方面构件类的对象实例;
(c)所述的外部构件对象实例动态聚合所述的语境特征方面构件类的对象实例;
(d)系统判断所述的外部构件对象实例是否已经动态聚合了所述的语境构件对象实例中所有的语境特征方面构件类的对象实例;
(e)如果否,则重复上述步骤(b);
(f)所述的外部构件对象实例已经动态聚合了所述的语境构件对象实例中所有的语境特征方面构件类的对象实例后的制约处理;
(5)系统根据调用者的需要,调用所述的语境特征对象实例的构件接口;
(6)系统根据用户操作,对该外部构件对象实例进行离开所述的语境构件对象实例的处理操作,包括以下步骤:
(a)所述的外部构件对象实例进行离开所述的语境构件对象实例前的制约处理;
(b)所述的外部构件对象实例动态拆卸聚合所述的语境特征方面构件类的对象实例;
(c)销毁所述的语境特征方面构件类的对象实例;
(d)系统判断所述的外部构件对象实例是否已经动态拆卸聚合了所述的语境构件对象实例中所有的语境特征方面构件类的对象实例;
(e)如果否,则重复上述步骤(b);
(f)所述的外部构件对象实例已经动态拆卸聚合了所述的语境构件对象实例中所有的语境特征方面构件类的对象实例后的制约处理。
在实际应用当中,语境是对象运行时的环境,一个对象如果进入了语境,那么该对象将具有此语境的特征,一旦对象离开了语境,环境特征就会失去(但该对象很有可能又进入了另外一个语境,拥有新的环境特征)。CAR构件的语境特征实现的技术利用了aspect。
CAR构件语境是基于动态聚合实现的一种技术,所谓的具有语境特征或失去语境特征,就是语境会为对象动态的聚合或拆卸聚合一个或多个aspect对象。这些aspect对象是语境在car文件中定义时指定的。
Aspect只能作为一个主语(某个构件对象)的谓词存在。那么它通过什么和主语产生从属关系呢?一个对象如果进入了语境,那么该对象将具有此语境的特征,一旦对象离开了语境,环境特征就会失去。但该对象很有可能又进入了另外一个语境,拥有新的环境特征。这里环境特征就是方面aspect。当作为主语的构件对象进入了语境,那么这个语境中的Aspect构件对象就会与之聚合,就签订了主从的契约。当作为主语的构件对象离开了语境,那么这个语境中的Aspect构件对象就会与之拆离,就注销了主从的契约。
而动态聚合是通过IObject的Aggregate方法来完成的,因此构件编写者定义的每个构件对象都具有聚合其他aspect对象的能力。
在此,引入CAR文件中的Context关键字:
在CAR中,语境技术通过系统语境构件类CContext来实现普通类对象CClass进出普通语境类对象KContext,以及对已经进入KContext的多个普通类对象进行管理,并实现了一些通用的接口。用户定义的KContext也是一个构件类,它所具有的语境特征由其属性aspect来决定,并且context一般情况下要带属性aspect。在编写CAR文件时,context作为关键字用来定义一个普通语境构件类。例如:
module
{
interface IAspect{
Foo();
}
interface IHello{
Hello();
}
aspect AAspect{
interface IAspect;
}
[aspect(AAspect)]
context KContext{
interface IHello;
}
}
上述的示例中定义了一个名为KContext语境构件类,类中定义了一个普通的接口。
具有context关键字的Aspect只作为一个属性而存在,Aspect的功能只是静态存在context中,而不对context起作用。当其他构件进入这个context时,aspect就会动态聚合到这个构件中。
对于Context操作,通常包含了以下步骤:
· 系统进行初始化操作;
· 系统实例化Context构件;
· 实例化普通构件;
· 构件进入context;
·客户代码调用构件接口;
·构件离开context;
下面将详细说明Context构件对象语境的进入和离开:
如果一个构件对象进入了一语境,那么该对象会聚合语境的特征,也就是聚合了语境属性里的aspect对象,从而使该对象拥有了语境特征;如果该对象离开此语境,那么会拆卸聚合该语境属性里的aspect对象。
CAR构件库提供如下两个函数分别完成语境的进入和离开:
ECode CObject::EnterContext(PObject pObject,PContext pContext);
ECode CObject::LeaveContext(PObject pObject,PContext pContext);
EnterContext函数完成的功能是:由语境对象创建其特征实例(aspect对象),而构件对象进入语境时动态聚合这些aspect对象。包含了以下步骤:
(1)语境对象调用消息函数OnObjectEntering通知构件对象正在进入语境;
(2)语境对象创建语境特征Aspect;
(3)构件对象动态聚合语境特征Aspect;
(4)循环运行上述步骤(2)、(3),把context所有的语境特征aspect与构件对象聚合;
(5)语境对象调用消息函数OnObjectEntered通知构件对象已进入语境。
LeaveContext实现的功能是对象进入者pObj拆卸聚合语境pContext的特征,包括以下步骤:
(1)语境对象调用消息函数OhObjectLeaving通知构件对象正在退出语境;
(2)构件对象拆卸语境特征Aspect;
(3)销毁语境特征Aspect;
(4)循环上述步骤(2)、(3),把pObj所有的语境特征aspect拆卸;
(5)语境对象调用消息函数OnObjectLeft(pObj)通知构件对象已退出语境。
关于语境进入者、语境以及语境特征三者的关系有如下几点:
(1)构件对象进入语境后,构件对象并不聚合语境本身所实现的接口功能,对象只是聚合语境的特征(aspect对象)。
(2)语境的特征只是语境的属性,在实现上是aspect对象,但语境本身并不具有这些aspect对象的功能。如宠物店语境并不具有宠物和商品对象实例的功能。
(3)语境的特征只是语境的静态属性。
(4)一个对象可以进入多个语境,每个语境可被多个对象进入。
(5)在实际上不是所有的对象都可进入某个语境的,语境可对进入者设置条件,只有条件满足者才可进入。
(6)也不是所有的对象都可随便离开某个语境,语境可对对象设置条件,只有条件满足者才可离开。
对于每个context构件类,可重载如下几个函数来满足构件对象的进入和离开时的制约处理:
virtual CARAPI OnObj ectEntering(PObject pObj);
//对象进入前调用,可以在这里检查对象是否满足要求。
virtual CARAPI OnObjectEntered(PObject pObj);
//对象进入后(已经聚合上context定义的aspects)调用。
virtual CARAPI OnObj ectLeaving(PObj ect pObj);
//对象离开前调用,context可以在这里控制是否允许对象离开。
virtual CARAPI OnObjectLeft(PObject pObj);
//对象离开后调用,在这里做善后工作。
再请参阅图3a至图3d所示,其中本发明的方法的具体实现原理如下:
(1)请参阅图3a所示,客户程序创建构件对象pObject并调用其接口方法。
(2)请参阅图3b所示,客户程序创建语境对象pContext。
(3)客户程序调用CObject::EnterContext(pObject,pContext)使构件对象pObject进入语境对象pContext。其中CObject::EnterContext函数直接调用pContext->ObjectEnter(pObject)。ObjectEnter是由CAR编译器直接根据CAR文件信息直接生成的函数。
(4)请参阅图3c所示,客户程序调用语境特征的接口函数。
(5)请参阅图3d所示,新的构建对象进入语境环境,重复上面的(1)至(4)。
(6)客户程序调用CObject::LeaveContext(pObject,pContext)使构件对象pObject离开语境对象pContext。其中CObject::LeaveContext函数直接调用pContext->ObjectLeft(pObject)。ObjectEnter是由CAR编译器直接根据CAR文件信息直接生成的函数。
在下面的代码示例中,其描述的是一个child(构件)进入school(语境)变成student(语境特征)的例子。
module car.elastos.com/native/Go2SchoolDemo.dll
{
interface IChild{
Play();
}
class CChild{
interface IChild;
}
interface IStudent{
Study();
GetID([out]Int32*pId);
}
aspect AStudent{
interface IStudent;
}
interface ISchool{
Open();
}
[aspect(AStudent)]
context KSchool{
interface ISchool;
}
}
在该示例中定义了一个方面构件类(AStudent)和一个语境构件类(KSchool)。KSchool语境拥有特征AStudent。
当一个CChild对象被创建时,他是一个“小孩”,具有小孩的行为“玩”(Play),而把“小孩”送到学校,他就变成了学生,具有了学生的行为“学习”(Study),而当他从学校毕业,在进入新的环境(语境context)前他又变成了“小孩”。
换成代码描述就是:一个构件对象(CChild)被创建,它只具有Play()方法,在它进入了一个语境(KSchool),那么该对象会聚合语境的特征(AStudent),也就是聚合了语境属性里的aspect对象(AStudent),从而具有了Study()方法;如果该对象离开此语境,那么会拆卸聚合该语境属性里的aspect对象。
对于服务端:
对于每个context构件类,可重载如下几个函数在对象进入和离开时做一些事情:
(1)OnObjectEntering在对象准备进入语境时发生,可以用来检查对象是否达到入学成绩或年龄。
(2)OnObjectEntered在对象已经进入语境时发生,可以用来为学生分班级和学号。
(3)OnObjectLeaving在对象准备离开语境时发生,可以用来控制是否允许对象离开,比如判断其是否毕业成绩达标。
(4)OnObjectLeft在对象已经离开语境时发生,可以用来做善后工作。比如要张榜公告一下毕业名单之类的。
继续上面的“小孩”“学生”和“学校”的例子:
KSchool.cpp对应语境(context)KSchool的实现代码如下:
#include″KSchool.h″
#include″-KSchool.cpp″
ECode KSchool::OnObj ectEntering(
/*[in]*/PObject pObject)
{
CConsole::WriteLine(L″->KSchool::OnObj ectEntering()…″);
//这里检查对象是否达到入学成绩或年龄
}
ECode KSchool::OnObj ectEntered(
/*[in]*/PObject pObject)
{
CConsole::WriteLine(L″->KSchool::OnObj ectEntered()...″);
//这里可以用来为学生分班级和学号
}
ECode KSchool::OnObj ectLeaving(
/*[in]*/PObject pObject)
{
CConsole::WriteLine(L″->KSchool::OnObj ectLeaving()...″);
//这里控制是否允许对象离开,比如判断其是否毕业成绩达标。
}
ECode KSchool::OnObjectLeft(
/* [in] */PObject pObject)
{
CConsole::WriteLine(L″->KSchool::OnObjectLeft()…″);
//这里可以用来做善后工作。比如要张榜公告一下毕业名单之类的
}
ECode KSchool::Open()
{
CConsole::WriteLine(L″The school opens.″);
return NOERROR;
}
对于aspect方面对象AStudent,我们希望在它被自动聚合时也能够做一些相应的工作,编写AStudent.cpp如下:
#include″AStudent.h″
#include″_AStudent.cpp″
ECode AStudent::OnAspectAttaching(
/* [in] */PObject pObject)
{
CConsole::WriteLine(L″->AStudent::OnAspectAttaching()...″);
}
ECode AStudent::OnAspectDetaching(
/* [in] */PObject pObject)
{
CConsole::WriteLine(L″->AStudent::OnAspectDetaching()...″);
}
ECode AStudent::Study()
{
//打印″谁s studying.″);
}
ECode AStudent::GetID(
/*[out]*/Int32*pId)
{
//取学号.
}
最后,实现一个普通的构件对象CChild,希望这个构件对象进入KSchool这个context的时候能够自动的聚合AStudent这个方面对象,并在聚合了这个对象之后打印出一些信息:
#include″CChild.h″
#include″_CChild.cpp″
ECode CChild::OnAspectAttaching(
/* [in] */PObject pAspect)
{
CConsole::WriteLine(L″->CChild::OnAspectAttaching()...″);
}
ECode CChild::OnAspectDetaching(
/*[in]*/PObject pAspect)
{
CConsole::WriteLine(L″->CChild::OnAspectDetaching()...″);
}
ECode CChild::Play()
{
//打印″谁s playing.
}
对于客户端,具体客户端的代码实现如下:
#import″Go2SchoolDemo.dll″
ECode ElastosMain(const WStringArray&args)
{
IChild*pChild=NULL;
ISchool*pSchool=NULL;
//创建一个名字为Sophie的CChild对象
//
ECode ec=CChild::New(L″Sophie″,&pChild);
pChild1->Play();
//判读pChild是否为一个学生
IStudent*pStudent;
ec=IStudent::WeakQuery(pChild,&pStudent);
if(FAILED(ec)){
//打印″Sophie′s not a student yet.″;
}
//创建一个KSchool对象
ec=KSchool::New(&pSchool);
pSchool->Open();
//对象pChild进入学校
ec=CObj ect::EnterContext(pChild,pSchool);
if(FAILED(ec)){
//不符合条件;
}
//判读pChild是否为一个学生
ec=IStudent::WeakQuery(pChild,&pStudent);
if(SUCCEEDED(ec)){
//调用Study()函数
pStudent->Study();
//调用GetID函数
pStudent->GetID(&id);
}
//毕业了现在要离开学校
ec=CObject::LeaveContext(pChild,pSchool);
if(FAILED(ec)){
//没达到毕业要求
}
///判读pChild是否为一个学生
ec=IStudent::WeakQuery(pChildl,&pStudent);
if(FAILED(ec)){
//打印″Sophie′s not a student anymore.″
}
}
编译后运行的结果为:
Sophie′s playing.
Sophie′s not astudent yet.
The school opens.
->KSchool::OnObj ectEntering()...
->CChild::OnAspectAttaching()...
->AStudent::OnAspectAttacning()...
->KSchool::OnObj ectEntered()...
Sophie′s studying.
Sophie′s studentID is 101
->KSchool::OnObj ectLeaving()...
->CChild::OnAspectDetaching()...
->AStudent::OnAspectDetaching()...
->KSchool::OnObjectLeft()...
Sophie′s not a student anymore.
采用了上述的计算机软件系统中实现构件对象在语境对象中自动具备语境特征功能的方法,由于其基于方面构件类模型和动态聚合技术实现了外部构件对象实例在进入不同的语境时能够具有不同的语境特征,也就是说可以使不同的外部构件对象实例不用各自编码就能够具备相应的环境特征,从而突破了COM+的对象语境(context)紧密依赖对象的限制,提高了构件应用的灵活性,在CAR构件的面向方面编程领域是一次重大的进步;同时降低了程序设计的复杂度,为构件面向方面编程提供了更宽广的空间,为软件工厂化提供了一条更简便的途径;而且提高了软件的可扩展性,能够更好地描述现实世界模型,方便了用户对不同需求的扩展,为计算机构件化软件技术的进一步发展奠定了坚实的基础。
在此说明书中,本发明已参照其特定的实施例作了描述。但是,很显然仍可以作出各种修改和变换而不背离本发明的精神和范围。因此,说明书和附图应被认为是说明性的而非限制性的。
机译: 融合了语境相关的说话人识别和语境独立的说话人识别的人工智慧秘书服务中的说话人识别方法,并使用语音识别设备
机译: 评估方法在凝聚态电话中测量材料结构形态特征的方法学中的系统误差,由图像分析实现的计算机系统以及实现该方法的标准模型
机译: 基于语境基于的感知方法和系统在计算环境中管理环境安全