面向方面的实时系统开发方法_郭东亮毕业论文最终稿.doc_第1页
面向方面的实时系统开发方法_郭东亮毕业论文最终稿.doc_第2页
面向方面的实时系统开发方法_郭东亮毕业论文最终稿.doc_第3页
面向方面的实时系统开发方法_郭东亮毕业论文最终稿.doc_第4页
面向方面的实时系统开发方法_郭东亮毕业论文最终稿.doc_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

广东工业大学工学硕士学位论文面向方面的实时系统开发方法郭东亮二零零五年四月三十日分类号: 学校代码:11911udc: 密级: 学 号:2110205159广东工业大学学位论文面向方面的实时系统开发方法郭东亮指 导 教 师: 张立臣 教授 广东工业大学计算机学院学 科 门 类: 工学 专 业 名 称: 计算机软件与理论 申请学位级别: 硕 士 论文提交日期: 2005 年 4 月 论文答辩日期: 2005 年 5 月 学位授予单位: 广东工业大学 摘要摘要现代软件开发都要把整个系统按功能分解为小的单元,然后开发这些小单元,这些小的单元隐藏内部实现,对外提供接口,最后组合这些单元为整个系统,实现整个系统的功能。但是系统中有的方面是横切整个系统的非功能关注点,无法很好地封装在单个模块中。如日志、性能问题、安全、上下文相关错误处理、qos监测等等,这些方面分散在整个系统中,并且与系统的功能代码纠缠在一起,这样降低了模块的可追踪性、模块的可重用性、系统的可维护性等一系列问题,所以需要分离并模块化这些非功能关注点。面向方面编程在实现上分离和模块化横切关注点,面向方面建模在软件开发的其它阶段用一致的方法来详述、可视化、构造和文档化方面相关制品,这样在整个软件开发过程可以使用面向方面技术。实时系统是面向方面技术很好的应用场所,因为在实时系统中,有很多非功能需求,且这些非功能需求往往横切整个系统。在实时系统中关键的就是时间要求了,这些时间要求散布在整个系统的功能部件里,带来了代码混乱和代码分散问题。本文分析介绍了aspectj、组合过滤器、多维关注点分离和自适应编程等典型的分离关注点的方法。比较完整的介绍了面向方面建模领域的研究。阐述了实时系统中的主要实时需求,以及与实时系统有关的uml框架集。提出了一个新的扩展uml进行面向方面建模的方法,它以合适的语义表达了aspectj和aspectc+的元素和织入机制。在这个方法中,方面继承自类,切入点和通知继承自特征,这样切入点和通知是方面的一部分,方面与基本类的关系用横切依赖表示。切入点的图符可以表达多个方面在相同连接点的横切行为,通知以一致的方式建模结构横切和行为横切,通过在顺序图上新加一个通知发出焦点,并将通知表示为消息,这样可以清晰建模通知在何时何处怎样影响系统的行为。并分析了如何将这个方法应用于实时系统开发。关键词:面向方面编程;面向方面软件开发;实时系统;umlabstractusing modern software development methodology, developers first decompose system into small units, which hide the internal implementation and provide only external interfaces, then implement these units, at last compose these units to get a full system and realize required functions. but there are some non-functional concerns which crosscut whole system and cant be well encapsulated into a single module, such as logging, performance analysis, security, context related error handling, qos monitoring, etc. these aspects are scattered and tangled in whole system, decreasing software traceability, reusability, adaptability. so these non-functional concerns should be separated and modularized.aspect-oriented programming (aop) separates and modularizes crosscutting concerns at implementation stage. aspect-oriented modeling (aom) specifies, visualizes, constructs and documents aspect related artifacts in a consistent way at other stage of software development. thus whole software development process can use aspect-oriented technique.real-time systems are well places to apply aspect-oriented technique, for there are lots of non-functional requirements in real-time system, which scattering in whole system. the codes related with timing are mixed with other codes, resulting in code scattering and tangling.this article considers various techniques to separate crosscutting concerns, namely aspectj, aspectc+, composition filters, hyperspace and adaptive programming; summarizes the researches in aom domain; analyses real-time systems timing requirements and uml profiles for real-time systems.this article proposes a new technique to modeling aspect-oriented constructs and mechanisms by extending uml, which can represent constructs and weaving mechanism of aspectj and aspectc+ with appropriate semantics. in this method, aspect is subclass of class; pointcut and advice are derived from feature, thus pointcut and advice are parts of aspect; relationship between aspects and base class is represented by special crosscut dependency. the notation of pointcut can express crosscutting behavior of many aspects at same join point. advice can model structural crosscutting and behavior crosscutting in a uniform way. by adding a new block, advice sending focus, in sequence diagram and regard advice as message, this method can clearly model where and when and how advices affect system behavior. the article also examines how this technique can be practiced in real-time systems development.keywords: aop;aosd;real-time systems;umlvii目录目录摘要iabstractii目录vcontentsvii第一章 绪论11.1 研究背景11.2研究意义21.3面向方面技术在实时系统中的应用31.4 研究内容4第二章 分离关注点的方法52.1 aspectj52.2 aspectc+72.3 组合过滤器82.4 hyperspace132.4.1 多维关注点分离132.4.2 hyperspace152.4.3 hyper/j162.5自适应编程17第三章 实时系统软件设计213.1 实时系统概念213.2 实时需求213.3 实时uml扩展233.3.1 通用资源建模253.3.2 通用时间建模303.4 实时系统建模工具34第四章 面向方面建模354.1 uml的扩展机制354.2 表示连接点364.3用况实现模块化364.4用uml进行面向方面建模37第五章 实时方面建模395.1 aop元素表示395.1.1表示切入点395.1.2表示通知与引入405.1.3 表示方面415.2 举例415.3 用况实现模块化445.4 在类图中加入方面455.5在顺序图中加入方面475.6 其它50结论51参考文献53攻读硕士学位期间发表的论文58独创性声明59致谢61contentscontentsabstractiicontentsviichapter1 introduction11.1 background11.2 necessity21.3 aspect-oriented technique in real-time systems31.4 structure of this thesis4chapter2 approaches to separate concerns52.1 aspectj52.2 aspectc+72.3 composition filters82.4 hyperspace132.4.1 mdsoc132.4.2 hyperspace152.4.3 hyper/j162.5 adaptive programming17chapter3 real-time systems software design213.1 concepts of real-time system213.2 timing requirements213.3 uml extension for real-time system233.3.1 general resource modeling253.3.2 general timing modeling303.4 tools for real-time system modeling34chapter4 aspect-oriented modeling354.1 uml extension mechanism354.2 join point representation364.3 use case modularity using aosd364.4 aspect-oriented modeling using uml37chapter5 real-time aspect modeling395.1 modeling constructs of aop395.1.1 modeling pointcut395.1.2 modeling advice and introduction405.1.3 modeling aspect415.2 example415.3 modularizing implementation of use case445.4 adding aspect to class diagram455.5 adding aspect to sequence diagram475.6 others50summary and future work51bibliography53publications during masters studies58statement of originality59acknowledgments61第一章 绪论第一章 绪论1.1 研究背景软件开发思想就是抽象与分解,从过程化、结构化分解编程,到现在主流的面向对象编程,开发典范(paradigm)发生了很大变化,唯一不变的就是抽象与分解的思想,只是抽象的种类和质量、分解的方法发生了变化。当前,面向对象编程(oop)1和基于组件的软件开发得到了广泛的使用,面向对象技术能够很好地将现实世界领域中的实体和它的行为建模为抽象的对象。系统变成一系列相互协作的对象,类的封装性隐藏了实现的细节;类的继承性实现了重用;多态性使得不同对象接收到相同消息时产生不同的动作。确实,oop表明了它处理复杂问题的能力,但是oop无法模块化横切(crosscut)整个系统的关注点(concern),这些关注点称为横切关注点(crosscutting concerns),如时间要求、安全、qos监测、日志等等。这些非功能单元弥散在整个系统中,导致了代码分散(code scattering);并且与功能单元混杂在一起,导致了代码纠缠(code tangling)。这样降低了程序的可理解性、适应性、可维护性和可复用性。oop中用混入类来处理横切,但是基本类需要显式调用混入对象的方法,即操作的逻辑由基本类控制,且好的系统设计师要考虑当前和将来可能的需求以避免打补丁,但是预知将来的需求是困难的,这样系统设计师陷入了“应该宁可设计不足还是宁可过分设计”的两难境地。其它解决方法如行为型设计模式也是由基本类控制操作逻辑,面向特定领域的解决方式(如框架)仅提供这个领域的处理关注点的方式,所以属于这个领域外的关注点需要特殊处理。解决问题需要分离关注点,将不同的关注点分离成模块,而这些模块可以单独实现。这样开发功能模块时无需要考虑非功能需求,在功能模块里不出现非功能代码;各个非功能模块也单独实现。系统有信息描述如何将这些模块可控地组合起来形成结构和行为明确的系统。系统信息主要描述了在何处非功能模块影响其他模块的结构和行为,有的方法将这些信息包含在非功能模块里,有的方法将这些信息放在配置文件内。通过分离关注点,开发人员可以只关注感兴趣的部分。并且当需求改变后,只需修改受影响的模块,而这些模块往往只在一处出现,这样避免了在整个程序内修改。已经有很多分离关注点的方法,这些方法可以统称为面向方面编程(aop, aspect oriented programming)2,虽然在这个概念提出之前,已经有很多这方面的研究。面向方面编程将关注点实现为分离的方面,然而实现仅仅是软件开发过程中的一个阶段。现在已经开始研究在需求、设计等其他开发阶段如何有效地分离关注点,目标是要在整个软件开发过程应用面向方面技术,从而形成面向方面的软件开发(aosd, aspect oriented software development)。这些研究主要集中在如何扩展uml3使其支持面向方面技术。现在面向方面编程还在研究过程中,面向方面的软件开发方法的研究也刚刚起步,但是它们代表了未了软件开发的方向,grady booch预言aop将崛起4。1.2研究意义实时嵌入式设备被广泛使用在现代生活中,实时控制系统是现代化生产的保证,复杂的实时系统在国防现代化建设中发挥越来越重要的作用。这些系统广泛应用在对时间有较高要求的环境中,如汽车,飞机,核反应堆等的控制中,这些系统的失败轻则导致经济财产损失,重则生命丢失。实时系统是面向方面很好的应用场所,因为在实时系统中,有很多非功能需求,且这些非功能需求往往横切整个系统。在实时系统中关键的就是时间要求了,如果系统没有在给定的时间里完成任务,任务是失败的,这些时间要求散布在整个系统的功能部件里,带来了前述的代码混乱和代码分散问题,导致系统代码不易读,不易修改,易产生不一致,重用性差,不易修改和升级等一系列问题。实时系统的一个重要特点就是要求系统具有可预报性,要判断是否调度是可行的,这需要收集系统当前信息和qos信息,追踪系统执行情况,这些代码也混在功能部件里。实时系统是高可靠性的系统,软实时系统(soft real-time system)任务的失败会使系统性能降低,但是有些安全关键(safety-critical)的硬实时系统(hard real-time system)的失败将会带来灾难性的后果,如核反应堆控制系统,武器控制系统等,这些系统的失败将会有生命的代价。但是系统故障是不可避免的,因为硬件和软件不可能设计的完全正确,所以实时系统需要容错,这样一个系统里的容错代码也弥漫在整个系统中,导致前述问题。实时嵌入式系统也有安全上的需求,以防止非授权用户的进入,同样这些非功能性代码也会弥漫在整个系统中。为了提高性能和达到可预报性,实时系统需要特别的资源管理策略,如为了可预报性,不使用缓存和虚存机制,因为缺页会导致时间不可预报。另外为了提高系统性能,需要对内存进行管理,这些管理策略会弥漫在整个功能部件里。所以有必要把这些非功能代码从功能部件里分离出来。分别编写功能部件和非功能方面,然后把它们组合在一起。实时系统在社会和国家生活中应用越来越广泛,影响也越来越大,系统也越来越复杂。根据上述实时系统特点和面向方面开发的特点,可以得出把面向方面技术应用到实时系统开发中很有必要。1.3面向方面技术在实时系统中的应用研究者已经开始探索如何将面向方面技术应用在实时系统中。在实时系统和嵌入式系统中建立了一些模型5,6。5提出了accord(aspectual component-based real-time system development)设计方法,也提出了一个rtcom(real-time component model)模型。使用accord开发实时系统的过程是:第一阶段把把实时系统按功能和低耦合高内聚的要求分解为一系列的组件;第二阶段把实时系统分解为一系列的方面,方面横切组件和整个系统,这个阶段处理非功能需求和横切关注点;最后按rtcom实现组件和方面。rtcom允许把方面编织到组件里,包括三部分:(1)功能部分;(2)运行时系统依赖部分;(3)组合部分。另外把方面分为三类:(1)应用程序方面;(2)运行时方面;(3)组合方面。嵌入式系统的一个重要特征是依赖环境。6提出了一个对嵌入式系统进行面向方面的环境建模方法。7把面向方面编程技术应用到实时操作系统开发上。因为在实时操作系统里有许多横切的特征,为了满足日益增长的对实时操作系统快速定制的要求,需要面向方面编程技术,这里把函数看成一系列的基本块,基本块的功能代码可由不同的方面提供,这样横切了函数,且这些基本块可视,提供了图形表示的开发框架;支持类的组装,不同方面里的相同的类可以组成一个大类。8展示了如何把面向方面技术应用的分布式实时系统上。分布式实时系统中的非功能需求可以用方面来表达,这篇文章给出了一个把分布性、时间要求和容错方面加入到一个简单的日志组件里的方法。9,10把面向方面应用到disco(distributed co-operation)系统中,disco 是描述反应式系统的形式化规格说明方法。1.4 研究内容本文比较完整地分析介绍了分离和模块化关注点的方法,以及面向方面社区对面向方面建模的研究;阐述了实时系统中实时需求的主要概念和建模方法;提出了一个新的通过扩展uml进行面向方面建模的方法,并将这个方法应用于实时系统开发。论文结构安排如下:第一章介绍了面向方面编程可以模块化非功能关注点;分析了实时系统中的非功能关注点以及实时系统中使用面向方面技术的现状。第二章介绍了典型的分离关注点的方法。第三章阐述了实时系统中的实时需求,以及用uml建模实时系统的方法。第四章分析介绍了面向方面社区对面向方面建模的研究。第五章提出了一个新的扩展uml来表达面向方面中的元素和机制,阐述如何将这种方法应用于实时系统开发中。59第二章 分离关注点的方法第二章 分离关注点的方法系统中的非功能需求往往横切整个系统,传统的结构化方法以及现代流行的面向对象方法无法很好地模块化这些非功能需求,导致了实现非功能需求代码的分散和与功能代码纠缠在一起,造成代码量急剧增加,开发效率低,可读性差,极易引起不一致等问题,所以需要分离这些非功能关注点。对于如何有效的分离关注点,人们已经提出了很多方法。如aspectj、组合过滤器、多维关注点分离和自适应编程等。2.1 aspectjgregor kiczales等人于1997年提出了面向方面编程(aop, aspect-oriented programming)概念2,开发出了第一个基于java的aop实现aspectj11。aspectj引入了连接点(join point)这个概念,以及切入点(pointcut)、通知(advice)、类型间声明(inter-type declaration)和方面(aspect)的构造块。连接点为程序流中的一些特殊点,包括方法调用与执行,构造函数调用与执行,类或对象初始化,成员变量的访问和修改,异常处理执行,通知执行等。方面可以在这些点改变系统的行为。切入点组合了连接点,并可以提供连接点处执行上下文的信息。切入点主要用于通知,通知在切入点改变系统行为。aspectj定义了原子切入点(primitive pointcut),如“call(void point.setx(int)”;也定义了与(&)、或(|)、非(!)来组合切入点。可以用通配符来收集多种连接点,如“call(void point.set*(.)”,表示调用point的以set开头且返回值为void的函数,不论这些函数的参数类型和个数。通知在切入点影响系统的行为。通知有多种类型,before通知在指定连接点抵达但与该连接点相连的程序运行前执行;after returning通知在指定连接点处的程序成功返回后执行;after throwing通知在指定连接点处程序抛出throwable对象后执行;after通知在指定连接点程序执行后执行,不论成功返回还是抛出异常;around通知在指定连接点处执行,只有在around通知体里显式调用proceed,该连接点处的程序才能执行。类型间声明改变程序的结构。在方面里可以声明其他类型拥有的成员(成员变量、成员函数、构造函数),也可以声明一些类型实现一个新的接口或继承一个新的类。方面将这些切入点、通知、类型间声明封装起来,形成一个关注点,与类一样,方面也可有成员变量和成员函数。同一个连接点可以被多个方面或一个方面里的多个通知影响,aspectj定义了这些方面和通知的优先关系。这些概念以及构造块的详细内容可以参考12。图2-1是一个电信模拟的计时方面。public aspect timing public long customer.totalconnecttime = 0;public long gettotalconnecttime(customer cust) return cust.totalconnecttime;private timer connection.timer = new timer();public timer gettimer(connection conn) return conn.timer; after (connection c): target(c) & call(void cplete() gettimer(c).start();pointcut endtiming(connection c): target(c) &call(void connection.drop();after(connection c): endtiming(c) gettimer(c).stop();c.getcaller().totalconnecttime += gettimer(c).gettime();c.getreceiver().totalconnecttime += gettimer(c).gettime();图2-1 timing方面12它给每个连接引入一个计时器,给每个用户引入一个保存全部连接时间的变量。在连接建立完成时开始计时,在连接断开后,停止计时,并计算连接时间和增加通话用户的全部连接时间值。aspectj编译器是一个编织器(weaver),它可以将方面织入到它所影响的其他方面或类里,以改变系统的结构和行为。这样,系统的关注点可以分别编写,从而有效分离了关注点,然后将这些模块化的关注点通过编织器组合在一起,形成满足需求的系统。2.2 aspectc+aspectc+13,14对c+进行扩展以支持面向方面编程,它参考aspectj所使用的方法来对另一种编程语言进行扩展,所以它们的模型基本相同,语法上有些不同。在aspectj中“*”,表示通配符,但是在c+中“*”用来声明指针,为避免二义性,在aspectc+中以“%”表示通配符。在aspectc+中以“:”代替aspectj中的“.”来表示作用域解析。以“”来匹配函数签名的任意数量形参。在aspectc+中,有两种切入点:名字切入点(name pointcut)和代码切入点(code pointcut)。名字切入点是类型、属性、函数、变量和名字空间的名字,如“%array”表示任何以“array”结尾的class、struct或union;“void draw()”匹配有任意数量形参和返回类型为“void”的函数draw。代码切入点要调用aspectc+定义的函数且以名字切入点为参数来形成,如:call(“void draw()”)描述了一系列的函数draw调用。另外,为了重用切入点,可以用pointcut(pointcut为关键字)表达式对切入点命名,即命名切入点(named pointcut),如pointcut arrays()=derived(“array”),这样arrays能用在表示derived(“array”)切入点表达式可用的任何地方。在aspectc+中也有两类连接点,名字连接点用来形成名字切入点,如程序中的类名;代码连接点用来形成代码切入点,如程序中的函数调用和执行。对于名字切入点,通知可以扩展程序代码和数据结构,即引入(与aspectj中类型间声明一样)。对于代码切入点,通知在切入点影响系统的行为。与aspectj一样,方面以模块化的方式收集横切关注点的advice代码和引入。图2-2显示了traceshape 方面来记录shape类型的对象的构造和析构。aspect traceshapepublic:static int m_created,m_destroyed;pointcut shapes()=derived(shape);advice shapes(): class helperpublic:helper()traceshape:m_created+;helper()traceshape:m_destroyed+;m_counter;advice execution(% main(.) : after()printf(shape created:%d,destroyed:%d,m_created,m_destroyed);int traceshape:m_created=0;int traceshape:m_destroyed=0;图2-2 traceshape方面2.3 组合过滤器(composition filters,cf)cf是语言独立的模型,它以模块化和正交化(orthogonal)的方式扩展了面向对象模型。 模块化的扩展意味着过滤器可以附贴在对象上而不改变对象的定义,这样过滤器与实现独立;正交化的扩展即过滤器之间的语义互相独立,这样过滤器可以组合15。因为对象之间的通信的机制是消息,这个模型通过过滤器来操控进入或出去的消息来改变对象的行为,图2-3 描述了这个模型的组成部分。图2-3 cf模型的组件16上图描述了一个cf模型中的对象,这个对象包括接口和实现两部分。接口部分包括接口对象i声明(被封装了的内部对象和被引用了的外部对象),状态s(state, condition)声明,类方法m声明和过滤器f;实现部分包括实例变量声明,类方法和状态的实现,以及初始化方法。对象可以用四元组表示17。接口对象的申明方式是为objectname:classname;状态s表示为: 。状态可以看成一个用proposition表示布尔函数,用id可以引用这个状态。对象的所有方法u0包括对象内部定义的方法m0和接口对象定义的方法(满足递归规则): 过滤器定义为:handler(f)即过滤器处理器(filter-handler),它定义了当消息到达过滤器时如何操控这个消息。a(f)被称为接受集合(accept set function),是一个有序的集合a。a定义了状态方法对集合,状态s决定了消息(方法)m是否被接受。消息必须被过滤器集合检查,检查的算法如图2-4:1) algorithm pass_filters(m, f)2) forall f in f = f1, ., fn do3) accept := false;4) forall in a(f) = , ., do5) if (m = mj)sj then6) begin7) accept := true;8) dest := target(mj);9) break;10) end;11) endfor;12) if accept13) then handler(f).acceptmessage(m)14) else handler(f).rejectmessage(m);15) endfor;16) dispatch(m, dest);17) end pass_filters;图2-4 检查接受的消息算法17消息要被所有的过滤器检查,过滤器用它的接受集合检查消息,如果满足接受集合里的一个元素,那么通过当前过滤器的检查,然后转到下一个过滤器。如果消息不满足当前过滤器的接受集合所有元素,消息根据过滤器处理器的类别拒绝消息。当通过最后的过滤器后,消息被分发。预定义的过滤器类:dispatch 过滤器:如果接受消息,消息分发到消息的当前目标对象;否则消息传递到下一个过滤器(如果没有了过滤器,会产生异常)。error过滤器:如果拒绝消息,产生异常;否则传递到下一个过滤器。wait过滤器:如果接受消息,消息传递到下一个过滤器;否则排队等待接受。meta过滤器:如果拒绝消息,消息传递到下一个过滤器;否则根据这个消息生成一个对象,并把这个对象作为参数传到新的消息(接受集合元素的第二部分)中。接受到这个新消息对象可以操控这个消息。在实时系统中,继承以前经过验证的模块很重要,但是实时需求的改变往往会导致过多的重新设计,这种情况称为实时需求继承反常,即子类时间需求改变导致在子类里出现过多的重新设计而不是继承父类的已有实现。下面用18中的例子介绍实时需求继承反常以及用cf模型解决的方法。类distributionnode代表一个电力分配网中的一个结点。这个节点有一条电力产生线和多条电力消费线。结点控制电流从生产线流向消费线。当生产线断开时,所有的消费线都要在预定义的时间内断开。结点可以看成时一个电磁开关,用elmagneticswitches定义,这个类里为每条线定义了连接和断开方法。假定有一个fastdistributionnode,它是distributionnode的子类,fastdistributionnode定义消费线断开的截至时间比它的父类更紧迫。但是由于实时需求与应用代码混和在一起,子类需要重新定义消费线的断开方法,以使用新的时间约束,这样父类的断开方法无法重用,出现了第一种反常。用cf解决的方法是把时间约束放到过滤器中,过滤器把时间约束加到接受的消息上,如图2-5。当子类的时间约束改变后,新的时间约束放到子类的过滤器中,当调用子类的方法时(继承自父类),子类过滤器给接受的消息加上新的时间约束,如图2-6。 (1) class distributionnode interface(2) begin(3) internals(4) myswitch: elmagneticswitches;(5) methods(6) productionlinedisconnected returns nil;(7) disconnectconsumerline(integer) returns nil;(8) inputfilters(9) givetimespec: realtime = true = self.* | time.minend( tconsumer ) | ;(10) settimeforproduction: realtime = true = ductionlinedisconnected(11) | time.setend( numberoflines * time.getend ) | ;(12) invoke: dispatch = true = myswitch.*, true = inner.* ;(13) end;图2-5 distributionnode的接口定义18过滤器类realtime的输入过滤器用来影响与过滤器匹配消息的时间属性。消息将接受“|”里的时间约束。消息的时间属性用time对象表示,time有start(消息的最早开始时间)和end(消息的截至时间)属性。time定义了一些方法来操作这两个属性:如minend()给消息设置最早的截至时间(如果time point的值小于消息当前的截至时间,则消息截至时间为,否则不变);setend()设置end属性为参数;getend:返回end属性。givetimespec过滤器的接受集合只有一个元素,“”左边是状态(条件),右边是方法的名字,是的另一种写法。这里条件为“tue”。如果消息与distributionnode提供的方法匹配,则接受该消息,如果新的时间属性小于消息的当前截至时间,则过滤器为消息设置新的截至时间。如果到来的消息是productionlinedisconnected,它会通过第一个过滤器,在那里设置其最早截至时间,然后会传到第二个过滤器,在这里设置其截至时间为numberoflines * time.getend,其中numberoflines是消费线跳数,time.getend返回第一个过滤器设置的最早截至时间。 最后添加了时间约束的消息由invoke分发过滤器分发。(1) class fastdistributionnode interface(2) begin(3) internals(4) mynode: distributionnode;(5) filters(6) fasttimespec: realtime = true = self.* | time.minend (tconsumernew) | (7) invoke: dispatch = true = mynode.* ;(8) end;图2-6 fastdistributionnode的接口定义fasttimespec过滤器给fastdistributionnode的消息设置最早截至时间tconsumernew,然后消息分发到其内部对象mynode(这是cf模型实现继承的方法,称为基于委托的继承)。被分发的消息还要接受父类的过滤器检查,但是由于新的截至时间小于父类过滤器里的截至时间,所以父类的givetimespec过滤器不会改变截至时间,settimeforproduction会用消费线条数乘上新的截至时间设置productionlinedisconnected消息的截至时间。这样满足了新的时间约束,并且重用了父类代码,消除了时间需求与应用代码混杂在一起时带来的继承反常。当同样的实时需求在一个类系的每个需要的地方都需声明时,易于出错,并且不容易加入有同样实时需求的方法,这样出现了非多态(non-polymorphic)实时反常。由于过滤器有匹配的能力,所以可以在过滤器处为多个匹配的方法集中添加时间约束,而不用在方法里申明时间,这样消除了非多态实时反常。如果相互独立的实时需求通过继承组合在一起时,那么它们之间会相互影响,这样开发人员需要重新定义相互影响的需求,出现了正交限制反常。由于过滤器的语义也是正交的,它们的组合可以解决这个问题。过滤器可以用来表达横切关注点,它不但能表示单个对象的关注点,也可以表示横跨多个对象的组合关注点15。 2.4 hyperspace2.4.1 多维关注点分离为了控制软件的复杂性,提高软件的可理解性,软件开发需要把系统分解为小的可管理的模块,然后组合这些开发好的模块得到完整的系统。为了方便软件维护与演进,要求减少改变带来的影响,要求模块的可替换性以及提高软件生命周期过程中各种制品间的可追踪性。虽然在这些领域进行了很好的研究与应用,但这些问题仍然存在,这主要是由于当前软件开发方法一次仅支持一种关注点的分离。如面向对象支持对象的分离,把数据封装在一起,但是阻碍了特征的演进与增加,因为这需要修改和增加多个类里的方法和数据,需要侵入系统内部。即问题原因在于“主分解专制”(tyranny of the dominant decomposition)19。为了达到软件工程的目的,就需要同时分解多种关注点。多维关注点分离(multi-dimensional separation of concerns,mdsoc)要求支持任意多的关注点维数,能同时沿着这些方向分解关注点,能动态处理新的关注点新的分解方向,能处理重叠交互的关注点20。下面以19,20中的例子来说明主分解专制带来的问题。这个例子是构建和演进一个简单的软件工程环境(software engineering environment,see)来处理程序的表达式。see支持表达式程序的创建与操作。包括计算表达式的值并显示结果的计算(evaluation)工具,显示工具和检查语法和语义的检查工具。系统的结构如图2-7。它把表达式表示成抽象语法树(asts),每个ast结点都由一个类表示,类定义了访问和修改方法,以及实现计算工具的eval()方法,实现显示工具的display()方法,实现检查工具的check()方法。图2-7 see的初始设计制品19现在为了减少不必要的重新计算而提高性能,需要对计算结果进行缓存,这样一个简单的需求对设计和代码带来了显著的影响:它需要在基类里增加保存缓存结果的变量以及这个变量的访问方法,修改每个类的setter方法,修改每个类的eval()方法使得它能返回一个缓存的结果。显然它需要侵入已有的设计和代码中进行修改,支持缓存的代码与其它代码交织在了一起,降低了了可理解性和功能的演进。如果系统要增加风格检查(style check)功能,并且希望风格检查能与系统原来的语法语义检查任意结合,同样需要侵入修改,这要影响系统在设计和编码的所有模块。问题就在于主分解专制。主分解满足一些重要的需要,但是阻碍了另一些,如数据的分解符合了应用领域的概念,但是功能特征的代码分散在多个模块中并且与其他功能特征代码混杂在一起19。2.4.2 hyperspacehyperspace21是一个支持多维关注点分离的模型。系统的各种关注点用原来的方法实现,然后通过组合规则把它们组合在一起。软件是由制品组成的,每种制品有它自己的描述或实现方法,每种方法有它自己的语法单元(unit),如方法,类,状态图等等。单元可分为原子单元和组合单元,原子单元在在特定上下文中不可分割,如方法,实例变量,组合单元由原子单元组成,如类,包,图等。关注点空间(concern sp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论