首页 理论教育 基于本体的应用软件移植研究成果

基于本体的应用软件移植研究成果

时间:2023-11-17 理论教育 版权反馈
【摘要】:接口之间的引发关系如图6 所示。接下来,将详细阐述引发关系的转换过程。步骤1:分解第三个元组步骤2:对于,即,在status下,接口a的调用会引发接口bn的调用,这种引发关系如果用Cause来表示。接下来,根据定义8 来证明引发关系在用二元关系替换中是否保持语义的一致性。∴可以说二元关系集对于三元引发关系而言在语义上是全覆盖的。

基于本体的应用软件移植研究成果

接口之间的引发关系有两种,一种是业务逻辑导致的引发关系,例如,在成功调用接口a后,根据业务逻辑,接口b 将会被调用,如图5(a)所示;另一种是内部嵌套调用导致的引发关系,例如,b1是接口a中所包含的函数,而函数b1中又调用了接口d,那么调用的接口a、b1就会导致接口d 被调用,接口d 多为公共函数暴露出来的接口,如图5(b)所示。

图5 接口与接口之间的引发关系

事实上,在图5(a)中,接口a的成功执行可能引发多个接口的调用,同样,在图5(b)中,函数中调用的接口也可以为多个。因此可以用如下公式来表示图5。

这样,可以用一个三元组来定义这两种接口与接口之间的引发关系。

定义7 (引发关系Cause-and-Effect,简写为CER)CER =(api_Name,status,{apiSet})。其中,

(1)api_Name表示接口的名称;

(2)status表示接口当前所处的状态,接口有三种状态,分别为OK,Fail,Run。OK表示接口正常执行,Fail表示接口调用出现异常,Run 表示接口正在执行中;

(3)apiSet表示因接口调用引发的后续接口的集合。

以一个外卖下单、餐厅接单的流程为例。用户选中菜品后通多接口PlaceOrder成功下单后,餐厅会收到用户的下单请求,之后,餐厅通过接口CheckMaterial检查厨房是否还有足够的食材,如果食材足够,餐厅通过接口ReduceInventory来减少厨房食材的持有量,同时调用接口PrepareOrder来准备菜品,在接口Prepare-Order的实现中,会分别调用另外两个公共模块接口,一个是打印接口PrintOrder,用来打印订单,另一个是打包接口PackFood,用来为订单中的每个菜品打包。接口之间的引发关系如图6 所示。

图6 外卖下单接单接口调用示例

根据定义7,图6 中接口之间的引发关系可以描述为:

(PlaceOrder,OK,CheckMaterial);

(CheckMaterial,OK,{ReduceInventory,PrepareOrder});

(PrepareOrder,Run,{PrintOrder,PackFood});

我们知道,本体的逻辑基础是描述逻辑,描述逻辑就是一种建立在一阶谓词逻辑之上的用于描述概念数学性质的形式化工具,但是它的表达能力有局限性,只能表示一元关系和二元关系。然而本节中定义的引发关系是个多元关系,要想用本体来表示,就需要用多个二元关系来替换,替换的同时还要保证替换前后语义的一致性。

二元关系替换三元关系有三种方式:横向转换,如图7(a)所示;纵向转换,如图7(b)所示;和混合转换方式,如图7(c)所示。

图7 三种关系替换方式

横向转换的情况较少,适用于将三元关系转换为二元关系。例如本节中阐述的引发关系,因为其中status元组仅有三个值,因此可以考虑根据status的值将关系分为三类,结合api_Name元组与{apiSet}元组之间的关系,重新构成三种新的关系。接下来,将详细阐述引发关系的转换过程。

步骤1:分解第三个元组(www.xing528.com)

步骤2:对于,即,在status下,接口a的调用会引发接口bn的调用,这种引发关系如果用Cause来表示。则可以将三元的引发关系拆分为三个二元关系,分别是:OK_Cause;Fail_Cause;Run_Cause。这样引发关系就可以用如下方式来替换。

纵向转换和混合转换较为常见,实质上是分别建立两个元组之间的映射关系。因为不是本书的重点,限于篇幅,此处便不再赘述。

定义8 (语义一致性)设本体的解释域为△,n 元组中概念的解释域△1,△2…△n⊆△,n 元关系R⊆△1 ×△2 ×… ×△n,转换后的二元关系集为{R1,…,Rn},若它们满足

(1)语义无冗余。对于二元关系中的任意两个关系Ri和Rj,它们的交集为空,即Ri∩Rj=Ø;

(2)语义全覆盖。对于n 元关系中的任何一个满足R关系的元组<C1,C2,… ,Cn >,其中任意两个元组之间的关系都能在二元关系集中找到;

则称转换前的多元关系R与转换后的二元关系集{R1,…,Rn}之间无语义损失,即转换仍保持语义的一致性。

接下来,根据定义8 来证明引发关系在用二元关系替换中是否保持语义的一致性。

证明:

(1)无冗余证明:

∵对于转换后的三个二元关系,其中任意两个二元关系之间的交集为空,

∴转换后的二元关系语义上无冗余。

(2)全覆盖证明:

∵对于任意满足引发关系的三元组<C1,C2,C3 >而言,其中C2 ∈{OK,Fail,Run},如果C2 =="OK",则该三元组用二元关系OK_Cause(C1,C3)来表示;如果C2 =="Fail",则该三元组用二元关系Fail_Cause(C1,C3)来表示;同样,如果C2 =="Run ",则该三元组用二元关系Run_Cause(C1,C3)来表示。由此可知,对于任意的三元组<C1,C2,C3 >,其中C1与C3之间的关系都可以在二元关系集{OK_Cause,Fail_Cause,Run_Cause}中找到。

∴可以说二元关系集对于三元引发关系而言在语义上是全覆盖的。

证毕。

举例说明接口之间引发关系在接口定位中的应用,如在Windows API中,函数FindFirstVolume在成功获取(OK_Cause)第一个驱动器的GUID后,会将返回的句柄传给函数FindNextVolume,以继续查找下一个驱动器。因此它们之间存在OK_Cause的引发关系,可以表示为:

OK_Cause(FindFirstVolume,FindNextVolume)

当在一段代码中定位到函数FindFirstVolume,那么在距离该函数不远处定位到函数FindNextVolume的概率就比较大。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈