软件工程第8章体系结构设计主要内容软件体系结构体系结构类型体系结构风格体系结构设计评估可选的体系结构设计使用数据流进行体系结构映射小结进行体系结构设计体系结构设计表示了建立计算机系统所需的数据结构和程序构件。它需要考虑系统采取的体系结构风格,系统组成构件的结构、性质,以及系统中所有体系结构构件之间的相互关系。进行体系结构设计尽管软件工程师能够设计数据和体系结构,但是在建造大型复杂系统的时候,这项工作往往由专家来完成。数据库或者数据仓库设计者为系统创建数据体系结构。”系统体系结构设计师“为系统工程和软件需求分析中导出的需求选择合适的体系结构风格。进行体系结构设计体系结构设计始于数据设计,然后导出系统体系结构的一个或者多个表示。对可选的体系结构风格或模式进行分析,以导出最适合于客户需求和质量属性的结构。一旦选定,使用体系结构设计方法对体系结构进行精化。在体系结构设计过程中,将创建一个包括数据体系结构和程序结构的体系结构模型。此外,还需描述构件的性质以及交互关系。进行体系结构设计设计通常被描述为一个多步过程,其主要任务是从需求信息中综合出数据的表示、程序结构、接口特征和过程细节。设计是由信息驱动的。软件设计方法都是通过仔细考虑分析模型的三个域而得到的。因此,信息、功能和行为三个域是创建软件设计的指南。体系结构设计是构建软件的初始蓝图。软件体系结构从第一个程序被划分成模块开始,软件系统就有了体系结构。同时,程序员已经开始负责模块间的交互和模块装配的全局属性。从历史的观点看,体系结构隐含了很多内容——实现的偶然事件或先前遗留系统。好的软件开发人员经常采用一个或者多个体系结构模式作为系统组织策略,但是他们只是非正式地使用这些模式,并且在最终系统中没有将这些模式清楚地体现出来。什么是体系结构一个程序和计算系统软件体系结构是指系统的一个或者多个结构。结构中包括软件的构件,构件的外部可见属性以及它们之间的相互关系。体系结构并非可运行软件。它是一种表达,使软件工程师能够:(1)分析设计在满足规定需求方面的有效性;(2)在设计变更相对容易的阶段,考虑体系结构可能的选择方案;(3)降低与软件构造相关联的风险。什么是体系结构在体系结构设计的环境中,软件构件可以简单到程序模块或者面向对象的类,也可以扩充到包含数据库和能够完成客户与服务器网络配置的“中间件”。本教材中,软件体系结构的设计考虑了设计金字塔中的两个层次——数据设计和体系结构设计。数据设计使我们表示出传统系统中体系结构的数据构件和面向对象系统中类的定义,体系结构设计则主要关注软件构件的结构、属性和交互作用。为什么体系结构如此重要[BAS03]给出了软件体系结构之所以重要的三个关键原因:软件体系结构的表示有助于对计算机系统开发感兴趣的各方开展交流。体系结构突出了早期设计决策,这些决策对随后的所有软件工程工作有深远的影响,同时对系统作为一个可运行实体的最后成功有重要作用。体系结构“构建了一个相对小的,易于理解的模型,该模型描述了系统如何构成以及其构件如何一起工作”。体系结构设计模型和包含在其中的体系结构模式都是可以传递的,即体系结构的风格和模式可以被应用于其他系统的设计中,并且表示了一组使软件工程师能以可预见的方式描述体系结构的抽象。数据设计数据设计是把在分析模型中定义的数据对象转化成软件构件级的数据结构,并且在必要时转化为应用程序级的数据库体系结构。在某些情况下,必须为一个新系统专门设计和建立数据库。体系结构级的数据设计当今,大大小小的业务均充斥着数据,甚至一个中型规模企业拥有为多个应用系统提供服务的几十个数据库。问题在于如何从这样庞大的数据环境中提取有用的信息,特别当需要的信息是功能交叉时。IT界开发出了数据挖掘技术,也称为数据库中的知识发现,该技术遍历现有的数据库以试图抽取出合适的业务级信息。另一种可选的解决方案称为数据仓库,它是一个独立的数据环境,但包含了某业务使用的所有数据。构件级的数据设计构件级的数据设计关注于那些被一个或者多个软件构件直接访问的数据结构的表示。[WAS80]提出了以下数据规格说明原则:1.应用于功能和行为的系统分析原则也可应用于数据。同样应该开发和评审数据流和数据内容的表示,标识数据对象,还应该考虑其他可选的数据组织结构,评估数据模型对软件设计的影响。2.标识所有数据结构及其完成的操作。设计一个高效的数据结构,必须考虑其上的操作。把属性和操作封装在一个类中满足这个原则。构件级的数据设计3.应该建立定义数据对象内容的机制,并且用于定义数据及其操作。类图定义包含在类中的数据项和应用到这些数据项上的方法。4.低层的数据设计决策应该延迟到设计过程的后期。数据设计可以采用逐步求精的过程,所有的数据组织可以在需求分析阶段定义,在数据设计工作中精化,在构件级设计阶段刻画细节。构件级的数据设计5.只有那些直接使用数据结构内部数据的模块才能够看到该数据结构的表示。信息隐蔽概念以及相关的耦合概念为软件设计质量的评估提供了依据。6.应该开发一个由有用的数据结构及其操作组成的库。类库即可实现这个目标。7.软件设计和程序设计语言应该支持抽象数据类型的规格说明和实现。如果没有办法对所选用于实现的编程语言中的结构进行直接说明,那么复杂数据结构的实现将变得非常困难。体系结构风格和模式建筑师使用体系结构(建筑风格)作为描述机制,将该房子和其他风格的房子区分开来。但更重要的是,体系结构风格也是建筑的样板。必须进一步规定房子的细节,具体说明它的最终尺寸,进一步给出定制的特征,确定建筑材料等。实际上是建筑风格指导了建筑师的工作。体系结构风格和模式为计算机系统建造的软件也展示了众多体系结构风格中的一种。每种风格描述一种系统类别,包括:(1)一组构件完成系统需要的某种功能;(2)一组连接器,它们能使构件间实现“通信、合作和协调”;(3)约束,定义构件如何集成为一个系统;(4)语义模型,它能使设计者通过分析系统的构成成分的性质来理解系统的整体性质。体系结构风格和模式一种体系结构风格就是一种在整个系统设计上面的变换。它的目的就是为系统的所有构件建立一个结构。在对已有体系结构进行再工程时,强制采用一种体系结构风格会导致软件结构的根本性改变,包括对构件功能的再分配。体系结构风格和模式体系结构模式也对体系结构的设计施加一种变换。然而,体系结构模式与体系结构风格在许多基本方面存在不同:(1)体系结构模式涉及的范围要小一些,它更多集中在体系结构的某一局部而不是体系结构的整体;(2)模式在体系结构上施加规则,描述了软件是如何在基础设施层次上处理某些功能性方面的问题;(3)体系结构模式倾向于在系统结构的环境中处理特定的行为问题。模式可以与体系结构风格结合起来,用于建立整个系统结构的外形。体系结构风格的简单分类以数据为中心的体系结构。数据存储驻留在这种体系结构的中心,其他构件会经常访问数据存储,并对存储中的数据进行更新、增加、删除或者修改。图8-1描述了一个典型的以数据为中心的体系结构风格。在某些情况下存储库是被动的,即客户软件独立于数据的任何变化或其他客户软件的动作而访问数据。该方法的一个变种是将中心存储库变换成“黑板”,当用户感兴趣的数据发生变化时,它将通知客户软件。体系结构风格的简单分类图8-1以数据为中心的体系结构体系结构风格的简单分类以数据为中心的体系结构提升了可集成性,即现有的构件可以被修改而且新的客户构件可以加入到系统结构之中,而无需考虑其他的客户。另外,数据可以在客户间通过“黑板”机制传送,客户构件独立地执行过程。体系结构风格的简单分类数据流体系结构。当输入数据经过一系列的计算和操作构件的变换形成输出数据时,可以应用这种体系结构。管道和过滤器结构(如图8-2)拥有一组被称为过滤器的构件,这些构件通过管道连接,管道将数据从一个构件传送到下一个构件。每个过滤器独立于其上游和下游的构件而工作,过滤器的设计要针对某种形式的数据输入,并且产生某种特定形式的数据输出。然而,过滤器没有必要了解与之相邻的过滤器的工作。如果数据流退化成单线的变换,则称为批序列。这种结构接收一批数据,然后应用一系列连续的构件(过滤器)变换它。体系结构风格的简单分类图8-2数据流体系结构体系结构风格的简单分类调用和返回体系结构。该体系结构风格能够让软件设计师设计出一个相对易于修改和扩展的程序结构。存在两种子风格:主程序/子程序体系结构。这种传统的程序结构将功能分解为一个控制层次,其中“主”程序调用一组程序构件,这些程序构件又去调用别的程序构件。图8-3描述了该种系统结构。远程过程调用体系结构。主程序/子程序体系结构的构件分布在网络的多个计算机上。面向对象体系结构。系统的构件封装了数据和必须应用到该数据上的操作,构件间通过信息传递进行通信与合作。体系结构风格的简单分类图8-3主程序/子程序体系结构体系结构风格的简单分类层次体系结构。层次体系结构的基本结构如图8-4所示。其中定义了一系列不同的层次,每个层次各自完成操作,这些操作不断接近机器的指令集。在最外层,构件完成用户界面的操作;在最内层,构件完成与操作系统的连接;中间层提供各种实用程序服务和应用软件功能。这些体系结构风格仅仅是软件设计师可用风格中的一小部分。一旦需求工程提示了待构建系统的特征和约束,就可以选择最适合这些特征和约束的体系结构风格或者风格的组合。在很多情况下,会有多种风格是适合的,需要对可选的体系结构风格进行设计和评估。体系结构风格的简单分类图8-4层次体系结构体系结构模式如果建筑工人决定建构一个“殖民式中厅”,那么只能应用一种体系结构风格。风格的细节内容是可以酌情变动的,但是一旦确定了房子的整体体系结构,这个风格就会影响设计。体系结构的模式有所不同。例如,房子采用一种Kitchen模式,这种Kitchen模式规定了厨房基本用具的放置、水池、橱柜等要求,如果可能的话,也规定了房间中与完成做饭流程相关的这些厨具的布置规则。另外,该模式还可能指明柜台面、灯、墙上的插座、中心岛、地板等要求。显然对厨房有不止一种的设计,但是每种设计都应该在Kitchen模式提供的解决方案环境下来构思完成。体系结构模式软件的体系结构模式定义了处理系统某些行为特征的方法。[BOS00]定义了一系列的体系结构模式域:并发性:很多应用系统必须以一种模拟并行的方式来操作多个任务。在一个应用系统中有很多不同的方法处理并发性,而且每种方法都可以由不同的体系结构模式来呈现。例如,一种方法是使用“操作系统进程管理”模式,该模式提供了一些内置的操作系统特征,这些特征允许构件并发执行。这个模式同时还结合了操作系统中那些管理进程通信、调度的功能以及其他完成并发所需要的功能。还有一种方法是在应用层上定义一个任务调度器。“任务调度器”模式包括一组含有tick()操作的活动对象。调度器定期唤醒每个对象的tick()操作,该操作在控制权返回调度器之前完成它负责的功能,接着调度器唤醒下一个并发对象的tick()操作。体系结构模式持久性:如果数据从创建它的进程执行以来一直存在,则该数据是持久性存在的数据。持久数据被存储在数据库中或者文件里,并且可以在稍后的时间里被其他进程读取和修改。在面向对象的环境中,持久对象的概念对持久性概念做了一些扩展,所有对象属性的值、对象的状态以及其他的附加信息都被存储起来,以备今后的存取和使用。一般说来,可以采用两种体系结构模式获得持久性:一个是数据库管理系统模式,该模式将DBMS的存储和存取能力用于应用系统的体系结构中;另一个是应用级的持久模式,此种模式在应用体系结构中建立了持久性特征。体系结构模式分布性:分布性问题强调系统或系统中构件在一个分布的环境中相互通信的方式。分布性问题有两个元素:(1)实体间连接方式;(2)实体间通信的特性。解决分布性问题最普遍的体系结构模式是代理模式。代理在客户端构件和服务器构件之间充当“中间人”。客户端向代理发出一条信息(包含所有使通信有效的信息),代理完成(与服务器的)