基于UML状态图的面向方面软件建模

时间:2022-05-17 01:03:06

基于UML状态图的面向方面软件建模

摘要:该文基于UML状态图对缓存并发读写问题进行面向方面的建模,把系统的同步和调度分离出来,建模为方面。该方法有效解决了面向对象中功能和代码混乱的现象,也提高了系统模块的可复用性。

关键词:面向方面;UML;状态图; 同步;调度

中图分类号:TP311文献标识码:A文章编号:1009-3044(2011)09-2087-03

Aspect-oriented Software Modeling Based on UML State Diagram

ZHI Lin-xian

(Computer Department, Lishui College, Lishui 323000, China)

Abstract: This paper analyses the problem of reading and writing buffer concurrently which is modeled by using aspect-oriented based on UML state diagram .The synchrony and scheduling is separated from system and modeled as aspect. This method solves the problem of code-tangling and function-tangling in OOP effectively and also increases the reusability of system module.

Key words: aspect orientation; UML; state diagram; synchrony; scheduling

当前,面向对象编程(OOP)得到了广泛的应用,OOP在开发复杂系统时体现出了其强大的能力[1]。但是OOP无法模块化横切整个系统的单元,如实时约束、安全策略、异常捕捉与处理、日志记录等,因此OOP在解决横切关注点(crosscutting concerns)时造成了代码的分散和混乱。面向方面的编程(Aspect-oriented programming) 则把这些横切关注点封装成单独的模块,称为方面(Aspect)。通过织入(weaving)技术把这些代码和核心模块组合在一起,在不改变原有模块封装性的前提下解决了上述问题[2-4]。

AOP是一种新的编程规范,但它不是对OOP的否定,而是OOP思想的补充和发展[2]。目前OOP发展比较成熟,在建模方面有统一的建模语言(UML)支持[5]。而AOP大都在程序级和执行级实现,在软件开发的早期阶段运用较少,还没有正式的建模技术和统一的建模标准。鉴于AO是OO技术的补充,可以使用UML及其扩展机制对面向方面的软件建模[6-7]。

1 面向方面编程

目前支持面向方面的编程语言有很多,如AspectJ、AspectC++、AspectC等。尽管它们有不同的语言规范,但是理论基础大致相同,模型和实现机制比较类似:采用了连接点模型显式地声明程序的横切结构、通知机制指定在程序执行过程中遇到匹配的切入点时应当采取什么行动等。下面就是一些AOP的核心概念[2,7]:

方面(Aspect):方面是AOP的核心概念,它类同于OOP中类的概念。方面是横切关注点模块化的基本单元,是横切行为的封装体。从代码实现的角度来看,方面是面向方面编程语言的语言结构,它将AOP中实现横切行为所需要的语法元素(切入点、通知体等)都封装在同一个逻辑单元里,并且可以拥有自定义的结构成员(如数据成员和方法等)。

连接点(Joinpoint):连接点是指在程序的结构中或执行流中能够被标识的位置,是可能发生横切行为的位置。方法体的调用或执行,属性赋值或读取等代码都可以看成是连接点。

切点(Pointcut):切点就一个或者多个连接点的逻辑组合,用来捕获或识别程序流中的连接点以及这些连接点相关的上下文值。一个系统通常有多个横切关注点,分别对应不同的横切面,AOP需要为每个横切面定义一个 切点,定义切点的关键在于精确捕获横切面对应的所有连接点。

通知(Advice):通知是预先定义好的在连接点处执行的代码,称为“通知体”,通知体不仅定义了横切行为的内容,还定义了横切关注点和核心关注点的横切关系。横切关系一般有before、after、around三种。,其中before是指在连接点所标识的代码执行之前执行通知体,after是指在连接点所标识的代码执行之后再执行通知体,而around是指由通知体代替连接点所标识的代码。

2 面向方面建模

2.1 面向方面软件建模的框架

面向方面软件建模一般步骤:对问题域进行需求调研,提取系统的不同关注点,即系统的核心关注点和横切关注点,然后对核心关注点和横切关注点分别建立模型,最后通过编织器整合成整个系统[6,9]。图1给出了基于UML面向方面建模的基本框架。

2.2 UML

2.2.1 UML 介绍

UML(United Modeling Language):统一建模语言,是一种定义良好、易于、构建和文档化软件系统产物,是一种普遍适用的可视化建模语言[3]。1997年11月,对象管理组织OMG(Object Management Group)全体成员通过将UML作为面向对象建模的标准语言。UML可以提供一个软件系统多种不同的静态和动态视图。静态视图有类图、对象图、用例图、构件图、部署图。动态视图有状态图、活动图、协作图、时序图。2003年推出UML的新版本UML2.0 。UML2.0提供了扩展机制,允许增加新构造块、创建新特性和描述新语义的机制,能对UML的模型进行定制以适应特定的主题和平台。原型、标记值和约束是UML扩展机制的三种基本途径。

2.2.2 状态图

状态图(State diagram)是UML动态行为建模的图形之一[8]。UML状态图描述了一个对象在生命周期内响应事件所经历的状态序列以及对事件的响应,它强调一个对象从状态到另一状态的转换。状态图的基本元素:状态(State)、事件(Event)、转换(Transition)、动作(Action)、活动(Activity)。在UML图中,状态用圆角矩形来表示,转换用一条从源状态到目的状态的有向实线来表示。事件是这条实线上的一个标签,动作紧跟在事件的后面,用一个“/”与事件隔开。遵循的基本格式为:Event [Condition]/Action。

3 并发缓存读写实例分析

3.1 并发缓存读写需求描述

并发读写缓存问题是OS中常见的问题,缓存具有有限的容量,可以并发处理读请求,并将所有的写请求排队。写请求将阻塞所有的其他服务,被阻塞的请求被排队一直到写操作完成。可见同步和调度问题横切了读写核心模块。可以把上述问题的需求具体概括为以下几点:

R1 缓存具有有限的容量

R2 可以通过read()和write()方法读写缓存内容;

R3 在某一个时间内只允许一个写操作;

R4 在同一时间内允许多个读操作;

R5 当执行写操作时,缓存将阻塞所有请求;

R6 当缓存为空时,缓存将阻塞读请求;

R7 当缓存为满时,缓存将阻塞写请求。

并发缓存读写主要对象的状态图(图2)。

3.2 方面模块

3.2.1 方面模块描述

从状态图中的看出:同步和调度是横切了并发读写系统的主要功能,因此可以标识出系统的横切关注点:同步方面和调度方面 。图中S1、 S2、S3主要标识了同步方面,并与缓存的状态(Full、Partial 、Empty)相关联。调度方面与缓存状态关联可以表示成如表1的关联。

3.2.2 方面建模

图2(a)模型没有把同步和调度分离出来,形成方面,造成了混乱的现象。现在根据同步方面和调度方面与缓存状态的关联,分别建立相应的模型。同步方面状态图(图3)、调度方面状态图(图4)、缓存状态图(图5)。

图3 同步方面状态图 图4 调度方面状态图 图5缓存状态图

3.3 方面织入

3.2节中对同步和调度方面建立了相应的模型,下面通过广播机制把方面模块织入系统[4]。举例说明:假设一种情况,当缓存中没有数据时,同步方面处于Empty状态,当Writer产生一个Write()事件,下面的情况会发生:

同步方面拦截Write()事件,如图6(a),同步方面将:

1)改变状态到Partial。

2)将数据条目的数据增加1。

3)广播write事件。

对于write事件,如图6(b),调度方面将:

1)改变状态到Have_Writers(假设原先处于Idle状态)。

2)写数据者的数量加1;

3)向缓存广播ev_Write事件。

对于ev_Write事件,当缓存接收到ev_Write事件时,如图6(c),它将:

1)改变状态到Writing状态。

2)当Write()操作完成时,缓存广播一个ev_done事件给调度方面。

注:上述的write区别与Write;图6中a、b、c是事件处理顺序。

4 结论

本文基于UML 对面向方面的软件建模进行研究,并使用UML的状态图对缓存的并发读写问题进行分析,利用面向方面的思想把系统中的同步和调度两方面分离出来,建模为方面。最后使用广播编织机制织入系统,从而解决了面向对象方法中容易出现的混乱现象。目前面向方面的软件建模大都基于UML及其UML的扩展机制,但是还没有统一的建模技术和建模标准 。下一步的工作要进一步完善UML和AOP的结合,逐步形成统一的规范,增强UML对面向方面的支持。

参考文献

[1] 陈涵生,郑明华.基于UML的面向对象的建模技术[M].北京:科学出版社,2006:150-195.

[2] Filman R E.面向方面的软件开发[M].莫倩,译.北京:机械工业出版社,2006:245-320.

[3] 王小花.基于扩展UML活动图的工作流过程建模[D].重庆:重庆大学硕士论文,2005.

[4] 韩晓英,虞慧群.一种基于UML的面向方面模块动态特性编织方法[J].华东理工大学学报:自然科学版,2007(6):394-399.

[5] Rumbaugh J,Jacobson I,Booch G.The Unified Modeling Language Reference Manual[M].USA: Addison Wesley Professional,2004:60-120..

[6] Yu H,Liu D,Shao Z,et al.Modeling complex software systems using an aspect extension of Object-Z[C]//Proceedings of 18th International Conference on Software Engineering and Knowledge Engineering.San Francisco,CA USA:Knowledge Systems Institute,2006:11-16.

[7] Kiczales G,Lamping J,Mendhekar A,et al.Aspect-oriented programming[C]//Proceedings of European Conference on Object-Oriented Programming.Berlin: Springer-Verlag,1997:220-242.

[8] Emerson E.A Temporal Logic and Modal Logic [M].Cambridge MA USA: MIT press,1990:995-1072.

[9] Clarke S,Baniassad E.Aspect-Oriented Analysis and Design-Theme Approach[M].USA:Addison Wesley Professional,2006:99-155.

上一篇:信息化背景下的混合式学习的发展和应用研究 下一篇:基于S3C2440的嵌入式Linux内核设计