绪论与杂谈
1.软件危机
软件危机是指计算机软件开发和维护过程中遇到的一系列严重问题。包括两方面的问题:
(1)如何开发软件以满足日趋复杂的需求
(2)如何维护数量不断膨胀的软件产品
2.软件工程
(1)将系统化的、规范化的可量化的方法应用于软件的开发运行和维护,即将工程应用于软件。
(2)对(1)中所述方法的研究
(1)软件质量
- SE的目标是软件质量(运行时质量、非运行时质量、体系结构质量)
- 影响质量的因素:
功能、正确、性能、安全、鲁棒性、可信性、健壮性、易用性、适应性、移植性、重用性、集成性、可测性、兼容性、经济效益
(2)软件的非功能特性
- 可变性:包括可维护性、可扩展性、可重构性、可移植性
- 互操作性:不同系统之间相互操作
- 效率:资源占用、响应时间
- 可靠性:分为容错性和健壮性,容错性指在发生错误时可以确保正确的系统响应。健壮性不要求错误发生时能够继续运行,而是保证软件能以明确的可接受的方式终止。
- 可测试性
- 可重用性:重用其他构件,以及提供给其他构件使用
3.软件工程的发展阶段
传统软件工程、面向对象的软件工程、构件软件工程、面向服务的软件工程
4.软件工程的基本方法
复用、分而治之、优化折中
SA对SE的贡献
- 开发团队的组织结构
- 需求获取
- 设计方案的选择
- 分析和描述复杂系统的高层属性
- 人员交流
- 技术进步
软件设计
当前的软件设计
(1)体系结构的设计选择对软件的长远成功是至关重要的
(2)体系结构描述具有不规范性
(3)软件体系结构理论和工具是解决软件复杂性和工程设计的必由之路
软件设计的层次__
- 结构级
- 代码级
- 执行级
软件设计目标
在时间和各类资源限制下,最大程度地满足用户需求。
- 便于维护和升级,因此应该是模块化的
- 设计应该是便于移植的(移植比重新设计花费要小很多)
- 设计具有适应性
- 设计过程应该收到理性的控制
- 设计应该表现出概念的完整性
软件设计中出现的问题
- 对于需求变化缺乏配合
- 过程控制对于维持软件设计的正确性缺乏保证
- 软件产品缺乏概念完整性
软件体系结构的基本概念
软件体系结构
(1)定义
- 软件体系结构定义了软件的局部与总体计算部件的构成,以及他们之间的相互关系。
- 总的来说,软件体系结构是由结构和功能各异、相互作用的部件集合,按照层次构成的。
- 体系结构=部件 + 连接件 + 约束
- 体系的核心模型由5种元素组成:构建、连接体、配置、端口和角色
(2)体系结构的类别
- 概略型
- 需求型
- 设计型
理解软件体系结构
软件体系结构(Software Architecture)包括构成系统的设计元素的描述、 设计元素
之间的交互、 设计元素的组合模式以及在这些模式中的约束。
元素以及元素的分类 素分为了两大类:构件 & 连接件
元素的组合模式,及模式中的约束
简而言之**,软件体系结构 = 构件 + 连接件 + 约束 **
构件与连接件
构件
构件是具有某种功能的可复用的软件结构单元,表示系统中主要的计算元素 和 数据存储。
构件是一个抽象的概念,在程序中可以指程序函数、模块、对象、类等。
连接件
连接是构件间建立和维护行为关联与信息传递的途径。连接包含下面两种要素:
其中,机制指的实际中的消息传递方式。
而协议则决定了 消息的语义理解。


当前对软件体系结构的认识
软件体系结构的知识体系
- 软件的体系结构应该是一个关于软件构成方面的具有层次性的知识体系
- 软件硬件层、基础控制描述层、资源和管理调度层、系统结构模式层、领域应用层
软件结构与软件工程
- 实现体系结构指导下的软件工程设计,关键在于建立软件构件的分析和构造的方法。
- 软件复用是技术的范畴
- 软件体系结构风格为大粒度的软件重用提供机会。
软件体系结构的认识
- 体系结构是关于软件的系统级层次上的组成和行为的,是设计过程中不可缺少的一个阶段,对复杂软件的后期设计活动起着重要决定作用。
- 体系结构是由软部件和部件之间的联系组成,软部件又有自身的体系结构。
- 部件描述有3个方面:计算功能、结构特性、其他特性。
- 目前,没有哪个关于软件体系结构的描述可以说是完整的。关于什么是部件,什么是部件之间的联系并没和明确的界定。
软件体系结构的意义和目标
软件体系结构在软件开发中的意义
- 软件体系结构是软件开发过程初期的产品,对于开发进度和软件质量的一切资金和劳务投入,可以获得最好的回报。
- 体系结构设计是形成的投资高汇报的重要因素。
- 正确有效的体系结构设计会给软件开发带来极大的便利。
软件体系结构的目标
- 外向目标:建立满足终端用户要求的系统需求。
- 内向目标:建立满足后期设计者需要以及易于系统实现、维护和扩展的系统部件构成
所有的设计原则等理论基本上都可以映射到下面一个或几个目标上。

体系结构的发展

软件体系机构的研究范畴
- 软件体系结构描述语言和工具(ADL)
- 产品线和标准:企业 -> 需求 -> 架构 -> 系统
- 软件体系结构风格以及风格的应用
- 体系结构文档化
体系结构的基础和层次特性
构造软件同样需要基础。
计算机硬件结构、软件的基本组成、构成软件的可用组块三个方面。
软件体系结构的层次结构模型
(1)任何软件的完整结构都具有层次关系:
- 特定的软件需要特定的硬件环境运行
- 不存在不需要下层支持的抽象的上层结构或框架
- 层次性是软件体系结构的不变性质,是软件构成的共同规律
(2)软件体系结构的层次结构模型(6层):

从层次模型看软件体系结构
- 数据库、网络、存储器,JavaEE、Spring ,etc.
- 层次模型对软件体系结构的认识:
- 体系结构是关于软件的构成部件及其连接的分层的结构框架
- 体系结构包括软件的内在概念和外在操作结构
- 体系结构分析与设计涵盖并指导着从逻辑结构设计到运行实现的软件工程的全部过程
软件体系结构集成环境
目标:
- 能够描述各种风格的软件系统结构
- 支持自顶向下(自下而上)的分层细化体系结构元素
- 确保接口一致
- 提供一个体系结构知识库存放与体系结构设计相关的设计模式、设计要素、设计需求
- 具有一个提供数据和控制模型代码的模板生成器
- 提供体系结构的图形化描述工具,从不同的视角反映体系结构
元素:
- 体系结构配置文档编辑器
- 体系结构配置图形编辑器
- 体系结构视图:文本视图、交互视图、层次视图
- 体系结构语法分析器
- 代码模板生成器
(1)UniCon
体系结构描述语言和环境。
UnicCon是基于部件和连接器的。
(2)Wright
可以描述体系结构的风格、系统族、体系结构实例和单个系统
Wright体系结构描述语言基于交互
(3)Darwin
构件说明定义了可以创建一个或多个实例的构件类型
Darwin系统的设计验证工具为设计人员提供了一种“What-If”的测试机制。
(4)ACME
- 采用图形化编辑方式直接描述构件和连接件
软件体系结构的设计原理+体系结构的一般描述
1.体系结构设计中遵循的原理
- 抽象:数据抽象、实体抽象、行为抽象、过程抽象、对象抽象、虚拟机抽象
- 封装:将抽象的属性和行为结合一起,隔离不同的抽象。
- 数据隐藏:对用户隐藏部件的实现细节。
- 模块化:代码结构物理分块
- 关注点分离:不同和无关联的责任应该在软件系统中分离开来,让他们出现在不同的部件中相互协作。
- 内聚和耦合
- 充分性、完备性、原始性:
充分性是指部件应该把握住与其进行有意义和高效交互抽象的所有特性;
完整性是指一个部件应该把握住所有与其抽象相关的特性;
原始性是指部件应该完成的操作都可以容易地得到实现(人的价值是最大的); - 策略和实现分离:策略部件负责处理上下文决策、参数选择等,实现部分专注算法的实现。
- 接口和实现分离:接口规范功能的使用方法,实现部分提供功能的具体方法。
- 分而治之:将复杂的问题分解为若干个小问题,自上而下的分析,自下而上的实现
- 层次化
2.通用的一般的描述方法
(1)主程序与子程序
- 这是软件设计最直接、最基本的结构关系。
- 更复杂的设计包含了库、包、模块、程序覆盖等概念。
- 主程序与子程序优点:
- 是一切软件结构的最本质、最基础的形式
- 代码的效率可以得到最大限度的发挥和提高
(2)数据抽象和面向对象
-
数据抽象和面向对象设计是在主程序和子过程设计基础上建立和发展起来的重要的软件描述方法。
-
数据抽象是面向对象设计的理论基础
-
类和对象是该描述方法的基础粒度,而非模块或者包。
-
本质上没有逃出主子程序的思想
-
面向对象的优点
信息隐藏保证了对象行为的可靠性<br /> 系统更容易分解成相互作用又相互独立的对象集合<br /> 为系统的维护和升级提供了良好的条件。<br />** **继承性和封装性提高了复用的可能性和方便性。
(3)层次结构
- 层次化是一种复杂系统设计的带普遍性的设计原则。
** 层次结构的优点**
- 层次的复用性
- 对标准化的支持,允许在不同层使用来自不同商家的产品
- 依赖本地化,层次间的标准接口通常把代码变化的影响限制在其所在的层次之内,这样做便于支持系统的可移植性和可测试性
- 可替换性,独立层次的实现能够被功能相同的模块替换。(例如,硬件的可替换性)享用互操作性好处的代价是增加了程序开销。
** 层次结构的缺点**
- 改变行为的连锁效应。例如,在维护升级时,必须在许多层次上做大量的工作。
- 低效率。分层结构通常比单一层次的结构效率更低。例如,通信协议在从高层传送信息时需要增加信息头和尾。
- 包含过多不必要的工作。如果低层次执行某些高层次并不需要的重复的工作,对于软件的整体性能就有消极的影响。高层请求通常会导致多次对低层次的同样的请求,层次数太多还会在层次间传送变量和返回值时带来额外的开销。
理论的形式化方法(体系结构的描述)
- 形式化的定义:用于计算机系统的形式化方法是描述系统性质的基于数学的技术
- 如果一个方法有良好的数学基础,那么它就是形式化的。
- 规约方法的目标:无二性、一致性、完整性
(1)体系结构描述语言
- ADL建立在形式化的理论基础之上
- ADL的功能:能够描述体系结构的组成要素,并能对系统体系结构、体系结构风格进行建模和分析验证的描述语言。
- ADL分类:
- 描述软件体系结构配置的ADL:CHAM
- 描述软件体系结构实例的ADL:Rapide
- 描述软件体系结构风格的ADL:Wright
- ADL的目标:
- 精确的语义描述
- 支持分析推理
(2)类属理论
是一种表达对象关系的数学语言:
- 提供了概念划分的统一性
- 类属是由一个对象集合和一个关联两个对象的箭头集合构成的。
- 对象是以某种逻辑表达的形式规范,箭头定义了这些规范之间的关系。
- 软件研究者把他看成是表达抽象和依赖关系的工具
- 在体系结构的部件和连接器描述中都被广泛采用
(3)Z Notation
Z Notation使用标准的逻辑操作符和集合操作符以及他们标准的常规语义
(4)CSP(通信顺序进程)
(5)化学抽象机制CHAM
体系结构设计风格
设计模式
- 体系结构的设计模式是构成负责软件的基础和常用单元,解决的是软件的底层或接近底层的结构问题。
- 设计模式使人们可以更加简单方便地复用成功的设计和体系结构,帮助设计者更好更快地完成系统设计。
常见风格分类
- 数据流风格:批处理和管道/过滤器。
- 调用/返回风格:主程序/子程序、层次结构和C/S。
- 面向对象风格。
- 独立部件风格:进程通信和事件驱动。
- 虚拟机风格:解释器和基于规则的系统。
- 数据共享风格:数据库系统和黑板系统。
1.管道/过滤器 体系结构风格
主要包括过滤器和管道两种元素。在这种结构中,构件被称为过滤器,负责对数据进行加工处理。每个过滤器都有一组输入端口和输出端口,从输入端口接收数据,经过内部加工处理之后,传送到输出端口上。数据通过相邻过滤器之间的连接件进行传输,连接件可以看作输入数据流和输出数据流之间的通路,这就是管道。

优点:
简单性。
支持复用。
系统具有可扩展性和可进化型。
系统并发性(每个过滤器可以独立运行,不同子任务可以并行执行,提高效率)。
便于系统分析。
缺点:
系统处理工程是批处理方式。
不适合用来设计交互式应用系统。
由于没有通用的数据传输标准,因此每个过滤器都需要解析输入数据和合成数据。
难以进行错误处理。
_传统的编译器就是管道/过滤器体系结构风格的一个实例。_编译器由词法分析、语法分析、语义分析、中间代码生成、中间代码优化和目标代码生成几个模块组成,一个模块的输出是另一个模块的输入。源程序经过各个模块的独立处理之后,最终将产生目标程序。
2.面向对象 体系结构风格
在面向对象体系结构中,软件工程的模块化、信息隐藏、抽象和重用原则得到了充分的体现。在这种体系结构中,数据表示和相关原语操作都被封装在抽象数据类型中。在这种风格中,对象是构件,也成为抽象数据类型的实例。对象与对象之间,通过函数调用和过程调用来进行交互。

优点:
- 一个对象对外隐藏了自己的详细信息
- 对象将数据和操作封装在一起
- 继承和封装方法为对象服用提供了技术支持
缺点:
- 如果一个对象要调用另一个对象,则必须知道它的标识和名称
- 会产生连锁反应
3.事件驱动 体系结构风格
事件驱动就是在当前系统的基础之上,根据事件声明和发展状况来驱动整个应用程序运行。
事件驱动体系结构的基本思想是:系统对外部的行为表现可以通过它对事件的处理来实现。在这种体系结构中,构件不再直接调用过程,而是声明事件。系统其他构件的过程可以在这些事件中进行注册。当触发一个事件的时候,系统会自动调用这个事件中注册的所有过程。因此,触发一个事件会引起其他构件的过程调用。

优点:
- 事件声明者不需要知道哪些构件会响应事
- 提高了软件复用能力
- 便于系统升级
缺点:
- 构件放弃了对计算的控制权,完全由系统来决定
- 存在数据·传输问题
4.分层 体系结构风格
在分层风格中,系统将划分为一个层次结构。
每一层都具有高度的内聚性,包含抽象程度一致的各种构件,支持信息隐藏。
分层有助于将复杂系统划分为独立的模块,从而简化程序的设计和实现。
通过分解,可以将系统功能划分为一些具有明确定义的层,较高层是面对特定问题,较低层具有一般性。
每层都为上层提供服务,同时又利用了下层的逻辑功能。在分层体系结构中,每一层只对相邻层可见。层次之间的连接件是协议和过程调用。用以实现各层之间的交互。

优点:
设计者可以将系统分解为一个增量的步骤序列从而完成复杂的业务逻辑。
每一层之多和相邻的上下两层进行交互。
只要给相邻层提供相同的接口。
缺点:
并非所有系统都能够按照层次来进行划分。
很难找到一种合适和正确的层次划分方法。
在传输数据是,需要经过多个层次。
多层结构难以调试。
5.C2 体系结构风格
C2结构是一个层次网络,包括构件和连接件两种软件元素。构件和连接键都是包含顶部和底部的软件元素。构件和构件之间只能通过连接件进行连接,而连接件之间则可以直接进行连接。构件的顶部、底部分别与连接件的底部、顶部连接,连接件的顶部、底部也分别与连接件的底部、顶部连接。
在C2体系结构中,构件之间的所有通信必须使用消息传递机制来实现。构件之间所有传递的信息可以分为两种,一种是向上层构件发出服务请求的请求消息,另一种是向下层构件发出指示状态变化的通知消息。连接件负责消息的过滤、路由、广播、通信和相关处理。

优点:
可以使用任何编程语言来开发构件,构件重用和替换比较容易实现
具有一定的扩展能力,可以有多种不同粒度的构件
构件不需要共享地址空间,避免了共享全局变量所造成的复杂关系
具有良好的适应性
在C2体系结构中,可以使用多个工具集和多种媒体类型,能够动态地更新系统的框架结构
缺点:
构件和构件之间不允许直接相连
与某一个连接件相关联的构件和连接件的数目没有限制
6.数据共享 体系结构风格
数据共享风格也成为仓库风格。
在这种风格中,有两种不同类型的软件元素:一种是中央数据单元,也成为资源库,用于表示系统的当前状态;另一种是相互依赖的构件组,这些构件可以对中央数据单元实施操作。中央数据单元和构件之间可以进行信息交换,这是数据共享体系结构的技术实现基础。
根据所使用的控制策略不同,数据共享体系结构可以分为两种类型,一种是传统的数据库,另一种是黑板。
如果由输入流中的事件来驱动系统进行信息处理,把执行结构存储到中央数据单元,则这个系统就是数据库应用系统。
如果由中央数据单元的当前状态来驱动系统运行,则这个系统就是黑板应用系统。
黑板是数据共享体系结构的一个特例,用以解决状态冲突并处理可能存在的不确定性知识源。
黑板常用于信号处理,如语音和模式识别,同时在自然语言处理领域中也有广泛的应用,如机器翻译和句法分析

优点:
- 便于多客户共享大量数据,而不必关心数据是何时产生的、由谁提供的及通过何种途径来提供
- 便于将构件作为知识源添加到系统中来
缺点:
- 对共享数据结构,不同知识源要达成一致
- 需要同步机制和加锁机制来保证数据的完整性和一致性,增大了系统设计的复杂度
7.解释器 体系结构风格
解释器作为一种体系结构,主要用于构建虚拟机,用以弥合程序语义和计算机硬件之间的间隙。实际上,解释器是利用软件来创建的一种虚拟机,因此,解释器风格又被称为虚拟机风格。

优点:
- 能够提高应用程序的抑制能力和变成语言的跨平台移植能力。
- 实际测试工作可能费城复杂,测试代价极其昂贵,具有一定的风险性。
缺点:
- 由于使用了特定了语言和自定义操作规则,因此增加了系统运行的开销。
- 解释器系统难以设计和测试。
8.C/S 体系结构风格

优点:
客户机构件和服务器构件分别运行在不同的计算机上,有利于分布式数据的组织和处理。
构件之间的位置是相互透明的,客户机程序和服务器程序都不必考虑对方的实际存储位置。
客户机侧重数据的显示和分析,服务器则注重数据的管理。
构件之间是彼此独立和充分隔离的。
将大规模的业务逻辑分布到多个通过网络连接的低成本的计算机,降低了系统的整体开销。
缺点:
开发成本较高。
在开发C/S结构系统时,大部分工作都都集中在客户机程序的设计上,增加了设计的复杂度。
信息内容和形式单一。
如果对C/S体系结构的系统进行升级,开发人员需要到现场来更新客户机程序,同时需要对运行环境进行重新配置,增加了维护费用。
两层C/S结构采用了单一的服务器,同时以局域网为中心,因此难以扩展到Intranet和Internet。
数据安全性不高。
9.B/S 体系结构风格
B/S结构是三层C/S体系结构的一种实现方式,主要包括浏览器,Web服务器和数据库服务器。B/S结构主要利用不断成熟的WWW技术,结合浏览器的多脚本语言,采用通用浏览器来实现原来需要复杂的专用软件才能实现的强大功能,节约了开发成本。
当用户运行某个应用程序时,只需要在可以断的浏览器中输入响应的 URL,向 Web 服务器提出 HTTP 请求。
当Web 服务器接收 HTTP 请求之后,会调用相关的应用程序(Servlets),同时向数据库服务器发送数据操作请求。
数据库服务器对数据操作请求进行响应,将结果返回给Web服务器的应用程序。

优点:
客户端只需要安装浏览器,操作简单。
运用HTTP标准协议和统一客户端软件,能够实现跨平台通信。
开发成本比较低,只需要维护Web服务器程序和中心数据库。
缺点:
个性化程度比较低,所有客户端程序的功能都是一样的。
客户端数据处理能力比较差。
在B/S结构的系统中,数据提交一般以页面为单位,动态交互性不强,不利于在线事务处理。
B/S体系结构的可扩展性比较差,系统安全性难以保障。
B/S结构的应用系统查询中心数据库,其速度要远低于C/S体系结构。
10.公共对象请求代理(CORBA)体系结构风格
公共对象请求代理(Common Object Request Broker Architecture,CORBA)是由对象管理组织(Object Management Group,OMG)提出来的,是一套完整的对象技术规范,其核心包括标准语言、接口和协议。
在异构分布式环境下,可以利用CORBA来实现应用程序之间的交互操作,同时,CORBA也提供了独立于开发平台的编程语言的对象重用方法。

优点:
- 实现了客户端程序与服务器程序的分析。
- 将分布式计算模式与面向对象技术结合起来,提高了软件复用率。
- 提供了软件总线机制,软件总线是指一组定义的完整的接口规范。
- CORBA能够支持不同的编程语言和操作系统,在更大的范围内,开发人员能够相互利用已有的开发成果。
缺点:
?
11.正交 体系结构风格
正交体系结构是一种以 垂直线索构件族 为基础的层次化结构,包括组织层和线索。
在每一个组织层中,都包含具有相同抽象级别的构件。
线索是子系统的实例,是由完成不同层次功能的构件通过相互调用而形成的,每一条线索完成系统的一部分相对独立的功能。
在正交体系结构中,每条线索的实现与其他线索的实现无关或关联很少。在同一层次中,构件之间不存在相互调用关系。

优点:
- 结构清晰。
- 便于修改和维护。
- 易于重用。
缺点:
?
12.MVC 体系结构风格
模型-视图-控制器(Model-View-Controller,MVC)是一种常见的体系结构风格。MVC被广泛应用与用户交互程序的设计中。
优点:
- 多个视图与一个模型相对应
- 具有良好的移植性。
- 系统被分割为三个独立的部分,当功能发生变化时,改变其中的一个部分就能够满足要求。
缺点:
- 增加了系统设计和运行复杂性。
- 视图与控制器连接过于紧密,妨碍两者的独立复用。
- 视图访问模型的效率比较低。