1、计算机研究与发展I S S N1 0 0 0 1 2 3 9 C N1 1 1 7 7 7 T PJ o u r n a lo fC o m p u t e rR e s e a r c ha n dD e v e l o p m e n t4 5(8):1 4 0 8 1 4 1 6,2 0 0 8横切侵入性和横切不变性吕嘉1应晶1 2吴明晖1 2蒋涛11(浙江大学计算机科学与技术学院杭州3 1 0 0 2 7)2(浙江大学城市学院计算机与计算科学学院杭州3 1 0 0 1 5)(s a m l v 2 0 0 0 16 3 c o r n)C r o s s c u t t i n gI
2、n v a s i o na n dC r o s s c u t t i n gI n v a r i a n tL uJ i a l,Y i n gJ i n 9 1”,W uM i n g h u i l”,a n dJ i a n gT a 0 11(C o l l e g eo fC o m p u t e rS c i e n c ea n dT e c h n o l o g y,Z h e j i a n gU n i v e r s i t y,H a n g z h o u3 1 0 0 2 7)2(S c h o o lo fC o m p u t e ra n dC o
3、 m p u t i n gS c i e n c e。C i t yC o l l e g eo fZ h e j i a n gU n i v e r s i t y,H a n g z h o u3 1 0 0 1 5)A b s t r a c tO w i n gt Ot h ec h a r a c t e r i s t i c so fq u a n t i f i c a t i o na n do b l i v i o u s n e s so fa s p e c t o r i e n t e dl a n g u a g e,m o d u l a rb e h a
4、 v i o r a la n a l y s i sa n dm o d u l a rr e a s o n i n ga r em o r ed i f f i c u l tt h a nt h a to ft h et r a d i t i o n a lp a r a d i g m s T od e a lw i t hc r o s s c u t t i n gs a f e t ya n dc r o s s c u t t i n gq u a l i t yi na s p e c t o r i e n t e dl a n g u a g e,c r o s s
5、c u t t i n gm o d u l e sa n da f f e c t e dm o d u l e sarec o n s t r a i n e dw i t hp r e-c o n d i t i o n sa n dp o s t c o n d i t i o n s,b u ta s s i g n i n gb l a m ef o rp r e-c o n d i t i o na n dp o s t c o n d i t i o nf a i l u r e sd u r i n gt h ep r o c e s so fc r o s s c u t
6、t i n gp o s e ss u b t l ea n dc o m p l e xp r o b l e m s T oa n a l y z eb e h a v i o r a le f f e c t o fac r o s s c u t t i n gc o n c e r n,t h ep r o g r a m m e rs h o u l dc o n s i d e rt h ea s p e c ti t s e l fa n dt h ep a r to ft h es y s t e mi ta f f e c t s F u r t h e r m o r e
7、w h e ns e v e r a la s p e c t sa r ew o v e na tas a m ep o i n t c u t,t h ea n a l y s i so fp o s s i b l ed a n g e r o u si n t e r f e r e n c e sb e c o m e sm o r ec o m p l e x S i m i l a rt ot h en o t i o no fb e h a v i o r a ls u b t y p i n gi no b j e c t o r i e n t e dl a n g u
8、a g e,an o t i o no fc r o s s c u t t i n gi n v a r i a n ti sp r o p o s e d I no r d e rt Oc h e c kt h eb e h a v i o r a le r r o r so fv i o l a t i n gc r o s s c u t t i n gi n v a r i a b i l i t ya n df o u ro t h e rs i m p l eb e h a v i o r a le r r o r s,a na l g o r i t h mb a s e do
9、 ns o f t w a r eb e h a v i o r a lc o n t r a c t si sp r o p o s e d T of o r m a l i z et h i sa l g o r i t h m,c r o s s c u t t i n gc o n t r a c tc a l c u l u sa n das e to fc o n t r a c te l a b o r a t i o nr u l e sarep r e s e n t e d T h ec o n t r a c ts o u n d n e s st h e o r e m
10、w h i c he n s u r e st h ec o r r e c t n e s so ft h ec o n t r a c te l a b o r a t i o np r o c e s si ss t a t e da n dp r o v e d A ne x a m p l ei sa l s or e p r e s e n t e dt os h o wh o wt ouset h e s ec o n t r a c te l a b o r a t i o nr u l e st oc h e c ka n da n a l y z et h eb e h a
11、 v i o r a le r r o r s K e yw o r d sa s p e c t o r i e n t e dl a n g u a g e;c r o s s c u t t i n gs a f e t y;c r o s s c u t t i n gq u a l i t y;c r o s s c u t t i n gi n t e r f e r e n c e;m o d u l a ra n a l y s i s摘要由于面向方面语言的不知觉性和多量化特点,模块分析和模块推理比传统方法学更加困难为了解决面向方面语言的横切安全和横切质量问题,使用前提条件和后
12、验条件约束横切模块和被横切模块,然而在横切过程中寻找前提条件和后验条件的失败原因十分微妙和复杂为了分析一个横切关注点的行为影响,程序员需要考虑方面本身和这个方面影响的系统其他部分当几个方面编织在同一个切入点,危险干扰分析变得更加复杂类似面向对象语言中的行为子类型概念,引入横切不变性概念为了检查由于破坏横切不变性引起的行为错误和其他4 种简单行为错误,基于软件行为契约提出一个横切不变性检测算法为了形式化这个算法,提出C r o s s c u t t i n gC o n t r a c t 演算和一组契约求解规则,并通过定义和证明契约完备性来保证契约求解过程的正确性还使用一个例子说明如何使用这
13、些契约求解规则检测和分析行为错误收稿日期:2 0 0 7-0 6 0 4;修回日期:2 0 0 8 0 1 1 5基金项目:霍英东教育基金会资助项目(9 4 0 3 0)万方数据吕嘉等:横切侵人性和横切不变性1 4 0 9关键词面向方面语言;横切安全;横切质量;横切干扰;模块分析中图法分类号T P 3 1 1 1面向方面语言 1 的出现,有效地模块化了横切关注点,解决了由于关注点分离引起的代码分散和代码混杂问题由于横切不知觉性和多量化 2 ,面向方面语言的模块行为分析和模块推理比传统语言更加复杂当程序员实现一个横切关注点,必须保证其余程序部分不受这个横切关注点的干扰,目前的主流面向方面语言还没
14、有机制有效支持这个要求,引起横切关注点实现与系统其他部分紧耦合,从而降低面向方面软件系统的质量和安全性许多学者研究在保持面向方面语言基本特性的前提下,通过维护传统的模块封装和信息隐藏原则来解决横切安全和横切质量问题文献 3 5 通过扩展被横切模块的封装机制来保证被横切模块的封装性;文献 6 7 通过改进切人点语言避免或者约束横切关注点的侵入特性,面向方面语言的基本特性和传统的模块封装和信息隐藏原则存在着矛盾;文献 8 认为面向方面语言存在着是似而非的胜利:面向方面语言总是在模块化和结构化代码的同时又违反代码模块化和结构化原则对于一种语言仅仅强调独立模块的封装性和质量是不够的,模块组合能力和质量
15、同样重要,而模块组合能力的上升往往导致模块局部性和封装性的下降面向方面语言引入更加强大的模块组合能力,同时也引入复杂的模块行为干扰问题,为了片面追求传统的模块封装和信息隐藏原则,过度牺牲语言的模块组合能力是得不偿失的本文借鉴面向对象语言中行为子类型概念 9。1 0 及其相关度量和检测方法 1 1-1 2 ,给横切模块和被横切模块附加行为契约 13|,基于横切不变性概念对方面横切过程进行约束,从而解决面向方面语言的横切安全和横切质量问题1 横切侵入性图1 的例子使用A s p e c t J 1 4 1 进行描述程序由类A、方面C r o s s c u t l,C r o s s c u t
16、2 和客户程序M 组成方面C r o s s c u t l 和C r o s s c u t 2 定义相同的切入点s e t l 和相应的通知;客户程序M 声明句柄n 使用参数z=5,y=O 调用构造函数实例化类A,然后使用参数工=1 0 调用方法s e t X 由于方面C r o s s c u t 2 中声明横切优先级C r o s s c u t l C r o s s c u t 2,程序先触发方面C r o s s c u t l 的执行前通知,此时满足通知的先验条件函数参数z=1 0 5,通知调用s e t Y 方法将Y赋值为1 0;然后再触发方面C r o s s c u t
17、2 的执行前通知,此时满足通知先验条件n g e t Y()5;最后执行类的方法s e t X(),此时无法满足方法的先验条件g e t Y()5,即方面C r o s s c u t 2 的正确执行依赖于方面C r o s s c u t l 的执行2)由于方面C r o s s c u t l 的方法执行前通知将y 赋值为1 0,使得类A 的方法s e t X()的先验条件g e t Y()9 无法满足而发生行为错误,万方数据14 1 0计算机研究与发展2 0 0 8,4 5(8)即s e t X()方法的行为正确性受到方面C r o s s c u t l 的影响从上面的例子可以看出,横
18、切模块和被横切模块之间会发生相互干扰,横切模块之间也会发生相互干扰,为了把这一类行为问题和其他行为问题区别开来,本文把这一类行为问题称为横切侵入性2 横切不变性和横切不变性判定算法为了解决横切侵人性问题,本文引人横切不变性概念对横切行为进行约束定义1 当一个软件模块受到几个横切关注点的影响,如果每一个横切关注点保持原有软件模块的行为约束,则横切过程满足横切不变性如果程序在执行过程中违反横切不变性约束,则程序发生横切不变性错误由于某些横切关注点的行为错误被其他横切关注点的执行所掩盖,发生这一类错误的原因十分复杂这一类行为错误直接违反面向方面语言的横切不知觉性和横切多量化,属于系统的核心行为错误同
19、时由于横切不知觉性和横切多量化,这种行为错误具有很大的不确定性和扩散性,严重影响面向方面软件系统的可靠性和质量由于涉及与横切相关的所有模块,这种行为错误的检查和分析比较复杂,不但要检测和分析与横切相关的所有模块,而且还要考虑横切发生的整个过程除了检测和分析横切不变性错误,还需要检测和分析4 种简单的行为错误:被横切模块先验错误、被横切模块后验错误、横切模块先验错误和横切模块后验错误这些行为错误与传统的模块行为错误是一致的,属于系统的枝节性行为错误这些行为错误的查找和分析仅仅涉及独立的软件模块及其部分程序上下文为了检查以上5 种行为错误,本文给出一种横切不变性检测算法(本算法不考虑行为子类型约束
20、),如图2 所示要保证横切不变性,对于多个横切同一个切入点的方法执行前通知,优先级高的通知先验条件必须蕴含优先级低的通知先验条件,后验条件必须蕴含方法的先验条件;对于多个横切同一个切人点的方法执行后通知,优先级低的通知先验条件必须蕴含优先级高的通知先验条件,后验条件必须蕴含方法的后验条件,否则引起横切不变性错误W h e nam e t h o de x e c u t e s,i ft h ep r e-c o n d i t i o no ft h i sm e t h o di sf a l s e,t h e ng ot os e t p l9 S t e p 2 I ft h ep
21、r e-c o n d i t i o no ft h i sm e t h o di St r u e t h e nt h eb e f o r ea d v i c ew h i c hi sw a i t i n gf o re x e c u t i o n a n dh a s1 7 i g h e s tp r e c e d e n c ei st Oe x e c u t e S t e p 3 I ft h ep r e-c o n d i t i o no ft h es e l e c t e db e f o r ea d v i c ei sf a l s e,t
22、h e ng ot oS t e p 2 1 S t e p 4 I ft h ep r e-e o n d i t i o no ft h es e l e c t e db e f o r ea d v i c ei St r u ea n da n yp r e-e o n d i t i o no fo t h e rb e f o r ea d v i c ew h i c hi sw a i t i n gf o re x e c u t i o ni sf a l s e,t h e ng ot OS t e p 2 3S t e p 5 T h es e l e c t e d
23、b e f o r e a d v i c ee x e c u t e s S t e p 6 I ft h ep o s t c o n d i t i o no fs e l e c t e db e f o r e a d v i c ei sf a l s e t h e ng ot oS t e p 2 2 S t e p 7 I ft h ep o s t c o n d i t i o no fs e l e c t e db e f o r ea d v i c ei st r u ea n dt h ep r e-c o n d i t i o no ft h em e t
24、 h o di sf a l s e,t h e ng ot OS t e p 2 3 S t e p 8 I ft h e r ea r es t i l lo t h e rb e f o r ea d v i c e sw h i c hh a v en o te x e c u t e d,t h e ng ot oS t e p 2 S t e p 9 T h ea f f e c t e dm e t h o de x e c u t e s S t e p l O I ft h ep o s t c o n d i t i o no ft h em e t h o di sf a
25、 l s e t h e ng ot OS t e p 2 0 S t e p l l I ft h ep o s t c o n d i t i o no ft h em e t h o di st r u e,t h e nt h ea f t e ra d v i c ew h i c hi sw a i t i n gf o re x e c u t i o na n dh a sl o w e s tp r e c e d e n c ei st oe x e c u t e S t e p l 2 I ft h ep r e-c o n d i t i o no ft h es e
26、 l e c t e da f t e ra d v i c ei sf a l s e tt h e ng ot oS t e p 2 1 S t e p l 3 I ft h ep r e-e o n d i t i o no ft h es e l e c t e da f t e ra d v i c ei st r u ea n da n yp r e-c o n d i t i o no fo t h e ra f t e ra d v i c ew h i c hi sw a i t i n gf o re x e c u t i o ni sf a l s e,t h e ng
27、 ot oS t e p 2 3 S t e p l 4 T h es e l e c t e da f t e ra d v i c ee x e c u t e s S t e p l 5 I ft h ep o s tc o n d i t i o no fs e l e c t e da f t e ra d v i c ei sf a l s e。t h e ng ot oS t e p 2 2 S t e p l6 I ft h ep o s t c o n d i t i o no fs e l e c t e da f t e ra d v i c ei st r u ea n
28、 dt h ep o s t c o n d i t i o no ft h em e t h o di sf a l s e t h e ng ot OS t e p 2 3 S t e p l 7 I ft h e r ea r es t i l lo t h e ra f t e ra d v i c e sw h i c hh a v en o te x e c u t e d,t h e ng ot oS t e p l l S t e p l 8 T h ep r o g r a mc o n t i n u e st Oe x e c u t e S t e p l9 T h r
29、 o wap r e-c o n d i t i o ne r r o ro ft h em e t h o d S t e p 2 0 T h r o wap o s t c o n d i t i o ne r r o ro ft h em e t h o d S t e p 21 T h r o wap r e c o n d i t i o ne r r o ro ft h ea d v i c e s e t p 2 2 T h r o wap o s t c o n d i t i o ne r r o ro ft h ea d v i c e S t e p 2 3 T h r
30、o waerroro fv i o l a t i n gc r o s s c u t t i n gi n v a r i a n t F i g 2C r o s s c u t t i n gi n v a r i a n td e t e c t i n ga l g o r i t h m 图2 横切不变性检测算法3C r o s s c u t t i n gC o n t r a c t 演算为了给横切不变性检测算法建立一个形式化基础,定义基于A s p e c t J 核心语法的形式化模型C r o s s c u t t i n gC o n t r a c t 演算C r
31、 o s s c u t t i n gC o n t r a c t演算由C o n t r a c tJ a v a 演算m 1 和C l a s s i cJ a v a 演算 1 5 扩展而来,C l a s s i cJ a v a 演算以类型系统理论 1 6。7 3 为基础3 1 语法和类型求解C r o s s c u t t i n gC o n t r a c t 演算(见附录A)忽略复杂的A s p e c t J 语法要素,仅讨论在成员方法的执行 万方数据吕嘉等:横切侵入性和横切不变性1 4 1 1前后附加通知主要语法包括程序P 由一组类、接口、方面定义和程序主方法组成类
32、由一组成员变量和成员方法组成,接口由一组成员方法声明组成,方面由一组静态横切、动态横切组成。静态横切可以认为是类的外部分类方式 18|,动态横切包括切人点和通知定义,切入点在程序执行过程中选择特定的联结点进行横切,通知在特定的切入点附加行为方法体和通知体是一个任意表达式,结果是方法或者通知的返回值(通知的返回值为空)方法体和通知体可以附加先验条件或者后验条件,先验条件和后验条件是任意布尔类型的表达式,返回值是t r u e 或者f a l s e n e w 操作符表示实例化类C r o s s c u t t i n gC o n t r a c t 演算在C o n t r a c tJ
33、a v a 演算的谓词和关系 1 2 1 基础上扩展了以下谓词和关系定义2 口dB e 如,P P :在程序P 中,通知a d 是方面a 中类c 的方法m 执行前通知定义3 a dA f t e r P :在程序P 中,通知a d 是方面a 中类c 的方法m 执行后通知定义4 eP r e P :在程序P 中,表达式e 是类c 的方法优的先验条件定义S e P o s t P :在程序P 中,表达式P是类c 的方法m 的后验条件定义6 eP r e P(口,a d):在程序P 中,表达式e是方面a 的通知口d 的先验条件定义7 eP o s t P 口,a d):在程序P 中,表达式e是方面a
34、 的通知n d 的后验条件定义8 口;P a,:在程序P 中,方面a;的横切优先级高于方面a i 一个C r o s s c u t t i n gC o n t r a c t 程序是良类型的当且仅当类定义、方面定义和最终表达式是良类型,C r o s s c u t t i n gC o n t r a c t 演算的类型求解与C o n t r a c tJ a v a 演算的类型求解 12 类似,本文不再论述3 2 契约求解和契约求值要定义契约求解规则,首先定义一组前提性判定 1 2 (如图3 所示)根据图3 的前提性判定,C r o s s c u t t i n gC o n t
35、r a c t演算的契约求解规则包括(见附录B):一r 规则改写整个程序P 一a 规则调用一。规则、一。规则、一。,。规则、一规则和一。规则改写方法和通知一。规则去除方法和通知的先验条件和后验条件一。规则根据方法的先验条件和后验条件生成新的包装方法,包装方法检查方法的先验错误和后验错误;对于通知,根据通知先验条件和后验条件生成新的包装通知,包装通知直接检查通知先验错误和后验错误,同时调用一。规则和一州规则检测横切不变性错误一。规则和一,。规则根据方法和通知的行为契约的隐含关系检查横切不变性错误一。规则改写表达式,将对原方法的调用转变为对包装方法的调用bP 卜PP P r o g r a mPi
36、 sc o m p i l e dt Op r o g r a mP7 P 卜a e f n Pd e f n D e f i n i t i o nd e f ni np r o g r a mPi sc o m p i l e dt od e f n7 P,C ,孢P 矗。m e t h7M e t h o dm e t hi nc l a s sci sc o m p i l e dt Om e t h7 P,a 卜+口d。a d 7A d v i c ea di na d v i c eai sc o m p i l e dt O 口d 7 P,C ,z P 。w r a p m e
37、t h7w r a p m e t h 7c h e c kp r e-c o n d i t i o na n dp o s t c o n d i t i o no fm e t h o dm e t h P,a 卜口d。w r a p a d 7w r a p a d 7c h e c kp r e-c o n d i t i o na n dp o s t c o n d i t i o no fa d v i c ea d 7 P,aL+口d”a d p r ea d p r ec h e c ke r r o ro fv i o l a t i n gc r o s s c u t
38、 t i n gi n v a r i a n t P,a +a d p o。t 口d p 0 3 t口d p o s tc h e c ke r r o ro fv i o l a t i n gc r o s s c u t t i n gi n v a r i a n t P,c 卜e-。e 7E x p r e s s i o nPi sc o m p i l e dt oP 7 F i g 3P r e d i c a t e so fC r o s s c u t t i n gC o n t r a c tc a l c u l u s 图3C r o s s c u t t i
39、 n gC o n t r a c t 演算的前提性判定C r o s s c u t t i n gC o n t r a c t 演算的操作语义是基于表达式和存储器二元组的上下文重写系统H5|,每个求值规则的形式是PF-一(P,S ,s t o r e(5)表示从类对象到(包含类标记)成员记录的映射,成员记录r e c o r d(F)表示从成员名称到值的映射,表达式中的自由变量由存储器中的变量绑定C r o s s c u t t i n gC o n t r a c t 演算的求值规则与C o n t r a c tJ a v a 演算的求值规则 1 胡类似,本文不再论述3 3 契约完
40、备性对于原有的去除行为契约的A s p e c t J 程序,C r o s s c u t t i n gC o n t r a c t 程序的行为契约是附加的程序检查,由于契约表达式可以是任意的布尔表达式,它可能引起副作用(引起错误或者影响原有A s p e c t J 程序的行为),因此必须限定行为契约是无副作用的定义9 E”对于任意的存储器S,表达式e 是无副作用当且仅当表达式e 的自由变量包含在d o m(S)中,并且存在一个值口使得 一。使用K l e e n e 等价性定义程序等价性:等价的可终止程序产生相同的结果或者相同的错误,所有非终止程序都是等价的为了保证契约求解过程 万方
41、数据1 4 1 2计算机研究与发展2 0 0 8,4 5(8)保持原有程序的语义,同时满足各种行为约束,需要定义求解一致性求解一致性使用平凡运算E r a s e,E r a s e 运算仅仅去除行为契约定义1 0 】2|C r o s s c u t t i n gC o n t r a c t 的程序P的求解丁是一致的当且仅当契约表达式是无副作用的,同时满足以下条件之一:1)T(P)与E r a s e(P)是K l e e n e 等价的;2)。C r o s s c u t t i n gC o n t r a c t 演算的契约求解除了方法调用和通知执行不改变任何原有表达式:如果契约
42、表达式没有任何副作用同时求值为t r u e,包装方法也不会产生副作用;如果某个契约表达式求值为f a l s e,则契约求解必定产生5 种行为错误的一种定义l l 12|契约求解T 是契约完备的当且仅当对于任意的C r o s s c u t t i n gC o n t r a c t 程序P,它的契约表达式是无副作用的,同时满足以下条件之一:1)对于 一。的每一个状态,对于C r o s s c u t t i n gC o n t r a c t程序P 而言是局部契约完备的;2)一。局部契约完备性要求对于任意的契约求解状态,e 不但保持自身的行为契约,而且必须满足横切不变性检测算法规定
43、的特定隐含关系 1 引定理1 C o n t r a c tC r o s s c u t 演算的求解过程是契约完备的定理1 证明的大概思路 12|:对于C r o s s c u t t i n gC o n t r a c t 程序P,假定求解T(P)不产生任何契约错误,如果E r a s e(P)的每一个规约步骤都是局部完备的,则求解丁(P)是契约完备的引理1 1 2 对于任意的C r o s s c u t t i n gC o n t r a c t程序P,T(P)的每一个契约求解步骤与E r a s e(P)同步引理正确性分3 种情况进行论述 12|:首先考虑没有方法调用(通知触发
44、)和方法返回(通知返回),契约求解不改变任何表达式,E r a s e(P)和T(P)是同步的其次考虑求解过程遇到第1 次方法调用(通知触发),E r a s e(P)形式是 一一 EE o m:t(v l,u,),S)-,由于是第1 次方法调用(通知触发),不再包含其他方法调用,E r a s e(P)与T(P)是相同的,求解过程要调用包装方法(包装通知),如果T(P)产生任何行为错误,E r a s e(P)是同步的违反行为错误;如果T(P)不产生任何行为错误,因为契约表达式是无副作用的,因此包装方法不产生任何副作用再考虑方法返回(通知返回),分析与第2 种情况类似因此这个引理成立最后使用
45、这个引理证明契约完备性定理 12 1:如果T(P)发生行为错误,从引理可以知道E r a s e(P)必定发生行为错误如果T(P)不发生任何行为错误,假设(P,s 是从E r a s e(P)开始的规约序列的某个状态,如果e 不能分解成某些求解上下文和方法调用(通知触发),或者某些求解上下文和方法返回(通知返回),显然是局部完备的假定e 分解成某些求解上下文和方法调用(通知触发),求解过程调用包装方法(包装通知),从一。规则可以知道方法(通知)的先验条件满足,满足横切不变性检测算法规定的特定隐含关系,因此这一步求解是局部契约完备的假定e 分解成某些求解上下文和方法返回(通知返回),分析与第2
46、种情况类似通过上面3 种情况可证明契约完备性定理成立4 实例分析根据上面的契约求解规则转换图1 的例子根据 d e f n 和E w r a p 规则,类A 的s e t X 方法去除先验条件,生成新的包装方法s e t X A,包装方法判断s e t X 的先验条件g e t Y()9,如果满足则调用原来的s e t X 方法,否则触发方法先验条件错误,如图4 所示:F i g 4S e t Xa n dw r a p p e rm e t h o do fs e t Xa f t e rt r a n s f o r m a t i o r L图4 转换后的s e t X 方法和s e t
47、 X 包装方法根据 d e f n 4 ,E w r a p 4 和-p r e 4 规则,将方面C r o s s c u t l 和C r o s s c u t 2 的通知生成新的包装通知和行为检查类C h e c k C r o s s c u t l p r e 和C h e c k C r o s s(u t 2 一p r e 方面C r o s s c u t l 转换后代码如图5 所示,新的通知先判断通知的先验条件,如果不满足则触发通知先验条件错误,如果满足则初始化通知行为检查类C h e c k C r o s s c u t l p r e,同时调用类C h P f kC
48、r o s s c u t l p r e 的s e t l()函数,s e t ()函数先检查方 万方数据吕嘉等:横切侵人性和横切不变性1 4 1 3面C r o s s c u t l 的通知先验条件,不满足直接返回f a l s e,满足则检查方面C r o s s c u t 2 的通知先验条件是否满足,如果不满足则触发横切不变性错误,满足则返回t r u e F i g 5A s p e c tC r o s s c u t la n db e h a v i o r a lc h e c k i n gc l a s sC h e c k C r o s s c u t l p r
49、 e 图5 转换后的方面C r o s s c u t l 和行为检查类C h e c k C r o s s c u t l p r e根据 P 规则改写客户程序M,将对方法s e t X的调用转换为对包装方法s e t X A 的调用,代码如图6 所示:F i g 6C l i e n tp r o g r a mMa f t e rt r a n s f o r m a t i o n 图6 转换后的客户程序M运行程序,当程序运行到检查到行为检查类C h e c k C r o s s c u t l p r e 的横切不变性检查方法C h e c kC r o s s c u t l
50、p r e,方面C r o s s c u t l 的通知先验条件满足,但是方面C r o s s c u t 2 的通知先验条件不满足,即方面C r o s s c u t l 的通知先验条件不蕴含方面C r o s s c u t 2 的通知先验条件,发生横切不变性错误5 相关研究文献 1 9 1 定义一组扩展规则约束不同的方面组合,这些扩展规则主要针对m i x i n 和M i x J u i e e 的语言的模块组合本文使用行为子类型来定义这些扩展规则,如果组合后的类是组合前的类的行为子类型,则方面或者模块组合是安全的我们认为如果要保持面向方面语言的基本特性,仅仅考虑横切的结果是不行






