1、1闽江学院软 件 工 程 过 程 论 文题目: 基于层次消息总线的体系结构风格概述 院 系: 专业班级: 学 号: 学生姓名: 指导教师: 年 月 日2目录一软件体系结构概述.31.1 软件体系结构作用和意义.31.2 软件体系结构的发展.5二.基于层次消息总线的软件体系构72.1 HMB 概述.72.2 构件归约.82.3 构件接口.92.4 构件结构.102.5 构件行为.10三体会.10四参考文献.113软件体系结构的作用和意义目前,软件体系结构尚处在迅速发展之中,越来越多的研究人员正在把注意力投向软件体系结构的研究。用于对软件体系进行规格描述的模型、标记法和工具仍很不正规。尽管这些不正
2、规的模型是有用的,为使之更为精确和健壮,在很多方面的研究工作还需要继续进行。许多项目都是在回顾时,才发现问题在结构上,因结构局限性,付出太多的代价,在体系设计上付出一天的努力解决的问题,在以后阶段可能要多付出几天到十几天. 首先,体系结构一般说来与需求是密切相关的.明确的需求可以制定明确的软件规格,越明确的规格来设计出来的软件架构越清晰。需求的变更也是必须要考虑,有明确的变更趋势也可以更早的在设计中体现出来。然后,在定制软件规格的阶段,要考虑一个问题,就是一些核心的技术,指的是这个项目中比较重要的关键的技术,应实验一个这些技术是否可行,如果稳定可靠才能采用, 否则只能另寻它路. 一些难关也是要
3、考虑的。这样制定的规格才能符合实际.这些工作应作为结构设计上的重要参考。最后,如果有明确的需求和规格,那应该进行详细的结构设计,从用例到类图,到关键部分的序列图,活动图等,越细越好.多多与别人交流,尽量让更多的人了解你的设计,为设计提出建议。结构设计应注重体系的灵活性,一定要考虑各种变更的可能性。这是最关键的阶段, 但这通常是理想状态,一般来说,客户不会给出太明确的需求。只有走别的线路了, 这种情况下前面的亮点还是需要的,不能省略.总之写在纸上的东西就有案可查. 比如说:4(1)写出一个小的原型来.如果有用户界面的,最好办,先写出界面, 不实现具体功能.让用户试用.如果没有用户界面, 试写一个
4、能工作的最小系统,同样给用户试用.这样你和用户才能对这个软件有感性认识;(2)与用户探讨,记录用户的反馈; (3) 如果没问题进入第 3 步 ;(4) 回到(1 ) ,写一个更完善的。在 Coding 阶段时应遵循体系结构 .所以开发人员必须对这个体系有深入的了解.了解它的内部结构和如何扩展. 记录下遇到的问题. 测试人员可针对这个体系设计测试程序.如性能上的, 可能的缺陷等 在测试时期,记录下体系结构导致的问题,以便借鉴. 开发人员 Review 整个架构。总结整个项目,分析优缺点可以把这个体系作为后续项目的范本. 整个项目一般受到多种限制,尤其明显的是 Schedule.面对这些问题.在设
5、计架构上要注意模块的划分,模块越独立越好. 不要过分注重其它特性. 如果设计不清,就要调整一个规格,去掉一些不重要的功能, 这才是可行的 .关于软件体系结构的研究工作主要在国外展开的,国内到目前为止对于软件体系结构的研究尚处在起步阶段。软件体系结构在国内未引起人们广泛注意的原因主要有两点:(1 )软件体系结构从表面上看起来是一个老话题,似乎没有新东西。(2 )与国外相比,国内对大型和超大型复杂软件系统开发的经历相对较少,对软件危机的灾难性体会没有国外深刻,因而对软件体系结构研究的重要性和必要性的认识还不很充分。软件体系结构设计既然作为软件工程的一部分,它的计算机辅助实现手段是相当重要的。我们应
6、当开发出一些软件工具来实现体系结构的描述和分析,开发阶段转换工具,以实现阶段成果的自动转换,例如,把需求规格说明自动转换为构件等。目前关于这方面的研究成果很少,特别是可以应用到实际项目开发中的工具和环境就更少。当今软件系统的规模变得越来越大,结构也越来越复杂,同时从头开始构5建的大系统数量在急剧地减少,因而很多遗留系统正在被逐步地利用。从遗留系统软件代码和系统中抽取结构信息,经过描述、统一、抽象、一般化与实例化等处理,可总结出系统的体系结构。在这种情况下,软件再工程变得越来越重要,因为它提供了一条把遗留系统转换为可进化系统的现实可行的途径,是一种可以改进人们对软件的理解和改进软件本身的活动。这
7、类研究的目的是为一些特定的应用领域的软件系统提供一些体系结构框架,如控制系统、移动机器人和用户接口界面等。通过这些框架可以很方便地构造一个新的软件系统。所以正确合理地运用软件体系结构的知识可以在项目开发中发挥它无穷的力量。 软件体系结构的发展 随着计算机技术的发展和应用的不断深入,软件系统的规模和复杂度日益增加, 在软件设计过程中人们所面临的问题不仅仅是考虑软件系统的功能问题,而是面临要解决更难处理的可修改性、 性能、 可靠性等非功能性问题。特别是从 80 年代起,对软件系统适应变更的要求越来越高,因此系统整体的结构设计已经超过了算法和数据结构,成为系统开发关注的主要问题。为了更好地进行系统结
8、构的设计,研究人员在 90 年代初期提出了新的解决方法: 软件体系结构,试图用类似建筑学的观点去构造软件,以更精确的方式刻画软件的结构。1. 软件体系结构的发展现状近年来,人们逐渐认识到软件体系结构在软件开发中的重要地位, 好的软件体系结构已经是决定一个软件系统成功的重要因素。因此,软件工程研究人员将研究热点集中到软件体系结构的研究上。目前已有一些公用的体系结构范型,如管道/过滤器、 层次系统、 Client/ Server 结构等。但是软件体系结构的研究尚处在发展之中,用于对软件体系进行规格描述的模型、 标记法和工具目前仍很不正规, 只是用特定的方式来理解并用于特定的系统。软件系统设计者没有
9、从系统体系结构中寻找共性, 以便在特定领域形成通用的体系结构范型;没有对体系结构模型进行选择的原则 ,甚至没有能将他们的设计技巧规范地表达出来。因此,为了使模型、 标记法更为精确和健壮,在很多方面的研究工作还需要继续进行,如充实、完善公用体系结构范型中所用的术语, 使之标准化和规范化。另外还要为软件构件间的交互定义更好的抽象模型并加以实现。建立完善的软件体系结构的形式模型、描述方法、 度量模型、 评价方法和可复用的软件体系结构范型库, 将有助于对软件的理解、 复用,以及解决软件危机问题,并且使以后的软件开发者节省时间。归纳现有体系结构的研究活动,主要包括如下几个方面:( 1)体系结构理论模型的
10、研究;( 2)体系结构描述研究:主要研究体系结构描述语言及其支持环境、 体系结构描述规范;( 3)体系结构设计研究:包括体系结构设计方法、 体系结构风格、 体系结构设计空间等内容;( 4)体系结构分析与验证:研究如何将软件的非功能特性转化为体系结构的需求, 如何分析体系结构满足期望的需求的属性, 对体系结构的语法、 语义、 类型失配等进行检查与验证的研究;( 5)体系结构演化与复用研究: 研究产品线中软件体系结构演进的理论与方法 , 从已有文档、 系统设计和代码中逆向提取软件体系结构、 体系结构复用等;( 6)动态体系结构研究 :研究软件系统由于特殊需要必须在连续运营情况下的体系结构变化与支撑
11、平台;( 7)基于体系结构的软件开发: 研究引入体系结构后的软件开发过程、 基于体系结构开发与中间技术集成、 基于体系结构的程序框架自动生成技术等。6尽管软件体系结构研究领域取得了若干成果, 但在应用方面, 软件体系结构仍然很不成熟。N. Medvovo nic 认为, 目前对软件体系结构的理解还仅限于直观、 或当作稀奇事、 或当作民间传说;语义丰富但不严紧。体系结构似乎没有解决实际问题。由此可见, 若要有效地指导软件工程实践、 为软件开发提供一个好的结构及其设计结构的指导原则,软件体系结构研究还有若干问题需要解决。2 一种层次式软件体系结构设计由上面的讨论可知, 软件体系结构不仅指定了系统的
12、组织结构和拓扑结构, 并且显示了系统需求和构成系统的元素之间的对应关系,提供了一些设计决策的基本原理。所以, 这里利用建筑学中的构件概念构建一个层次式软件体系结构的基本思想和结构框架。3 软件系统分析 ,构建系统模型如何抽象问题领域模型来建立软件模型是系统软件体系结构设计成功的关键。对于软件项目的开发来说,一个清晰的软件体系结构是首要的。尽管在开发的初期就设计好系统的最终结构是不可能的,也是不现实的,因为需求还在不断地发生变化。所以,一个好的软件体系结构应该可以创建或再创建功能、 用户界面和问题域模型,进化原型以满足新的软件需求。为了使开发人员在开发软件时对系统体系结构有一个清晰的把握, 不至
13、于将一大堆工作混杂在一起而造成系统的维护困难。利用层次软件体系结构来对系统进行层次化的分类, 即把大型软件系统按照功能的扩展性, 分成若干层。其中有些部分实现比较底层的操作, 比如与数据库打交道;有些部分实现某一类数据结构的基本操作,比如栈、 队列的操作等;还有些部分是专门与系统的最终用户进行交互、 读取用户输入信息,将结果反馈给用户等。这些不同部分之间有可能是纯粹的聚集关系。它们在一起只是因为系统需要它们各自的功能来完成不同的任务。另外一种关系就可能是层次关系, 实现底层操作的部分为实现较高层操作的部分提供服务。有了底层的基本服务,高层操作就只需要关心本层必须完成的任务。对于底层的操作, 它
14、只需要明确定义可以提供给高层的服务接口即可。其内部可以采用不同的实现方法,层与层之间是完全透明的。它们只通过层间的服务接口进行交互。4 软件系统功能的层次化划分在对软件系统进行分析后, 首先对它的所有功能进行层次化划分, 然后对每一个层次的功能进行模块化分解。一个层次中可能有多个模块具有相似的功能, 对这些模块进行更深层次的划分,将相同部分提取出来作为低一层次来对待,而上层的不同部分就划分到不同模块中。这样的层次划分和模块化分解一直进行下去, 直到系统所有功能都有一个明确的模块归属为止。这种软件系统的分解采用先水平后垂直的划分方法。层与层之间的界限是明确的, 但层中的模块内部可能要进行进一步的
15、划分。这是一个反复迭代的递归分解过程。在对软件系统进行先水平后垂直的分解过程中,可能会发现同一层不同模块的内部模块中有功能相似的子模块, 对于这种情况需要将它们的公共部分进行提取, 然后对初始的层次划分进行调整,将公共部分作为它们的下一个层次。当前层次只需要去访问公共部分提供的服务。完成软件系统的分解后, 首先按照各模块对上层提供的服务来定义它与上层模块之间的接口。定义好层与层之间的服务接口后,就可以对各个模块进行独立的设计了。有了这种先进行层次化分解再进行独立设计的方法, 软件开发人员就可完全按照各模块的设计进行独立的开发。这样就不会再出现将多个层次的东西绞在一起的情况。3. 3 构建三层系
16、统结构在明确不同构件所处的层次以及所要完成的功能后, 按照 MVC ( Model、 View、 Cont ro ller) 设计范式,可以构造如下层次结构的软件体系结构。7图 1 三层构件系统结构示意图数据操作层构件:这类构件与数据库打交道 ,其主要功能是完成对数据库操作。划分这一层构件的目的是用这一层的构件来屏蔽底层数据库操作的复杂性和多样性, 为上层应用提供统一或数据库操作服务接口。业务层构件:这一层构件有两种 ,一种是用于公共服务,一种是用于特定领域操作。公共服务构件专注于提供常见问题的高效解决算法,同时提供与操作系统相关的公共服务, 比如文件读写、目录管理、 报表制作等。它还对一些通
17、用数据结构提供常见的操作支持。这类构件支持水平复用,也就是说各种软件系统都可能使用它们提供的服务, 从而避免重复劳动, 节省软件开发时间,避免重复开发过程中引入错误, 提高软件产品质量。特定领域构件与实际的应用领域密切相关。首先需要领域专家对该领域作广泛深入的调查研究,进行领域分析,搜集各种资料,最后为各个构件界定范围。表示层构件: 这类构件与软件系统的最终用户打交道,提供用户界面操作服务,所以称为用户界面构件。当前可视化开发环境中已经提供了大量的界面构件,为软件系统的界面开发提供了有力支持。可以对这些界面构件进行组合、 改进,开发不仅使最终用户感觉友好, 而且使开发人员更易于使用的大粒度用户
18、界面构件。总之,这样的构件层次是一个大粒度的划分,它们之间不具有严格意义上的上下层关系,在各个层次构件的内部层次划分中才能看到明显的上软件体系结构是具有一定形式的结构化元素,即构件的集合,包括处理构件、数据构件和连接构件。处理构件负责对数据进行加工,数据构件是被加工的信息,连接构件把体系结构的不同部分组组合连接起来。这一定义注重区分处理构件、数据构件和连接构件,这一方法在其他的定义和方法中基本上得到保持。8二.基于层次消息总线的体系结构风格 HMB 2.1HMBHMB 风格基于层次消息总线、 支持构件的分布和并发 ,构件之间通过消息总线进行通讯 ,如图 1 所示.消息总线是系统的连接件 ,负责
19、消息的分派、 传递和过滤 ,以及处理结果的返回;各个构件挂接在消息总线上 ,向总线登记感兴趣的消息类型;构件根据需要发出消息 ,由消息总线负责将该消息分派到系统中所有对此消息感兴趣的构件 ,消息是构件之间通讯的唯一方式;构件接收到消息后 ,根据自身状态对消息进行响应 ,并通过总线返回处理结果.由于构件之间通过总线进行连接 ,并不要求各个构件具有相同的地址空间或局限在一台机器上.该风格可以较好地刻划分布式并发系统 ,以及基于CORBA、 COM 和 E JB 规范的系统.构件 构件 构件 消息总线 ( 连接件 )构件 构件 构件 构件 消息总线 ( 连接件 )构件 复合构件图 1 HMB 风格的
20、系统示意图如图 1 所示 ,系统中的复杂构件可以分解为比较简单的子构件 ,这些子构件通过局部消息总线进行连接 ,这种复杂的构件称为复合构件.如果子构件仍然比较复杂 ,还可以进一步分解.如此分解下去 ,整个系统形成了树状的拓扑结构 ,树结构的末端结点称为叶结点 ,它们是系统中的原子构件 ,不再包含子构件 ,原子构件的内部可以采用不同于 HMB 的风格 ,例如数据流风格、 面向对象风格、 管道 - 过滤器风格等,这些属于构件的内部实现细节 ,但要把它们集成到 HMB 风格的系统中 ,必须满足 HMB 风格的构件模型的要求 ,主要是在接口规约方面的要求.另外 ,整个系统也可以作为一个构件 ,通过更高
21、层的消息总线 ,集成到更大的系统中.于是 ,可以采用统一的方式刻划整个系统和组成系统的单个构件.2 构件规约在 SADL 中 ,构件是系统的基本构造单元 ,具有较好的自包含性.每个构件对外提供了一个或多个不同的接口 ,接口定义了一组发送和接收的消息集合 ,刻画了构件对环境提供的服务和向环境要求的服务.此外 ,在构件规约中 ,还刻画了构件的静态结构和动态行为 ,如图 3 所示.component - spec : : =component name provides inter face2list is / / 接口部分 structure2 part / / 结构部分 behavior2 pa
22、rt / / 行为部分end component ;9图 3 SADL 的构件规约框架上述的构件规约同样适用于刻画整个系统.HMB 风格的系统是由构件通过消息总线连接而成的 ,其中的每个复合构件都是一个子系统 ,由更低层的构件通过局部消息总线连接而成;同时 ,系统也可以看作是一个大的复合构件 ,集成到更大的系统中. SADL 支持用统一的方法对构件和系统进行描述.在这个意义上 ,系统和构件只有层次上的差异 ,同我们考虑问题时所处的上下文相关 ,这符合人们认识客观世界的一般规律.3. 构件接口在 SADL 中 ,一个构件可以提供一个或多个接口 ,构件接口定义如图 4 所示.接口定义给出了构件接收
23、和发送的消息集合.在接口定义时 ,可以直接继承多个接口.在一般程序设计语言中 ,过程、 函数或对象接口只定义了其对外提供的服务 ,而 SADL 的构件接口定义中还包括了要求的外部环境提供的服务 ,体现了互联接口的通讯完整性9 .inter face2spec : : =inter face name extends inter face2list is / /接口之间的继承send :message2spec / /发出的消息集合receive :message2spec / /接收的消息集合end inter face ;inter face2list : : = inter face2na
24、me ,inter face2name message2spec : : = sync| asyn message2name ( parameter2list ) ;parameter2list : : =parameter ,parameterparameter : : =direction type parameter2namedirection : : = in| out| in out图 4 SADL 的构件接口定义构件之间通过发送消息进行交互 ,消息可以是同步消息或异步消息 ,同步消息的发送者必须等待消息的处理结果返回后 ,才可继续运行;异步消息的发送者不必等待结果的返回 ,就可以继
25、续运行 ,这样发送者和接收者可以并发运行.消息中的参数分为三种:in、 out 和 in out ,分别代表输入、输出和输入输出 ,in 参数是随消息一起发出的只读参数 ,out 参数保存了消息处理的结果 ,in out 参数同时具有两者的特点 ,缺省情况下是 in 参数.指明参数的传递方向不仅关系到不同的参数的处理方式 ,在分布式环境下 ,还可以减少网络上的数据传输量.对 in 参数而言 ,只需把数据从服务请求方传到服务提供方 ,out 参数则只需把结果数据从服务提供方传到服务请求方 ,只有 in out 参数需要在两个方向上传递数据.由上可以看出 SADL 提供的接口定义具有以下一些特点:
26、a.支持互联接口 ,可以充分地表达构件和环境之间的关系.通过接口定义 ,表达了构件同环境的所有交互信息 ,减少了构件使用时对环境依赖的不确定性 ,提高了构件的复用潜力.b.方便构件集成.构件在实现时 ,如果需要外部环境提供的服务 ,只需使用在接口处定义的请求服务.在构件集成时 ,通过把构件请求的服务同其它构件(即环境)提供的服务匹配起来即可.c.支持对构件之间的同步和异步消息通讯的表达.102.4 构件结构在 SADL 中 ,复合构件是由低层的构件通过局部消息总线连接而成的 ,其结构定义如图 5 所示.reference :component2list ; / / 引用的构件consistof
27、 :component2name instance2list ; / /构件实例声明alias :instance2name. message2name to new2name ; / / 消息过滤表registry : (bus2message ,instance2name) ; / / 构件- 消息响应登记表图 5 SADL 的构件结构定义在上述构件结构定义中 ,(1) reference 部分指明了所有引用到的子构件.(2) consistof 部分指出了实际组成该复合构件的所有子构件实例 ,一个复合构件可能包含多个同类型的子构件实例.(3)由于不同来源的构件事先并不知道各自的接口 ,因
28、此可能同一消息在不同构件中使用了不同的名字 ,或不同的消息使用了相同的名字 ,造成构件集成时的冲突和不匹配. alias 部分对构件发出和接收的消息进行简单地换名或阻塞某个消息 ,当新名字是 null 时 ,表示阻塞相应的消息.(4) registry 部分登记了每个子构件实例感兴趣的消息 ,形成构件 - 消息响应登记表.对每个登记项中的 bus 2message ,构件实例 instance2name 中应有一个接收消息与此对应 ,即在消息名称、 参数个数和类型、 以及返回值上要一致.这里的 bus 2messages 指的是复合构件接收的消息集合同所有子构件发送的消息集合的并集.2.5 构
29、件行为软件系统以及组成系统的构件从本质上来说 ,都是信息的变换装置 ,其行为可以用带输出的有限状态机刻画.在 SADL 中 ,采用 Mealy 机刻画构件的行为 ,一个 Mealy 机包括一组有穷的状态集合、 状态之间的变迁和在变迁时发生的动作,采用五元组 ( source2state ,message ,condition ,method , tar2,get2state) 表示. 其中 ,source2state 和 target2state 分别表示源状态和目标状态 ,为了实现从源状态到目标状态的转换 ,需要接收特定消息 message ,满足特定条件 condition ,并且执行特定
30、方法 method.构件行为定义部分刻画了构件对外界消息的响应 ,同构件接口定义和静态结构定义部分一起完整地对构件进行了规约 ,为构件实现或在可复用构件库中查找符合规约的构件提供了依据.三体会在以前所做的课程设计中,或多或少都有用到一些体系结构的思想,但从未上升到理论高度,自从知道到基于层次消息总线的体系结构风格后,我认识到这是一种非常优秀的体系结构风格,通过对基于层次消息总线的一些深入了解,我迫切渴望地在以后的开发中使用这种体系结构风格。这次的论文制作中,对层次消息总线体系结构风格只是在理论上有了一些概念,并未在真实的软件开发项目中的使用。知识就是用来应用的,即使现在没有用到,以后也会不知不觉的应用这种方法。非常感谢老师在课上辛勤地讲解。老师说的很对,从11事计算机专业的学生必须多看看书籍和多听听讲座,确实,有些讲座对人的影响是十分重要的。我知道现在自己的知识还不够,但我今后我会认真学习,努力学好专业知识。我觉得很有必要深入了解基于层次消息总线的体系结构。努力学好专业知识,为自己的职业生涯,画上浓厚的一笔。四参考文献:1.基于层次消息总线的软件体系结构描述语言 张世琨 ,王立福 ,常欣 ,杨芙清 (北京大学计算机科学技术系,北京 100871)2.软件体系结构 张友生、李雄 编著3.浅谈软件体系结构王霞俊