第一章
工学的定义:
工学: 工程学科的总称,应用学科,用数学和自然科学原理设计有用物体进程。。
研究自然学科的应用方式,研究工程进行的一般规律
工程:
- 狭义: 以目标为依据,应用知识和技术,一群人有组织将现有实体转换为有价值的过程
- 广义: 一群人达到目的,长周期进行协调活动的过程
软件工程:
用工程化方法,构建和维护有效的,实用的和高质量的软件的学科,因为有软件危机所以需要
软件危机的定义:
表现:
- 成本日益增长
- 开发进度难以控制
- 软件质量差
- 维护困难
产生原因
- 用户需求不明确: 用户不清楚需求; 用户描述不清; 开发过程中提出修改; 开发人员理解有误
- 缺乏正确的理论指导
- 软件规模越来越大
- 软件复杂度越来越高
工程的内涵: 研究,设计,开发,生产,施工,操作,管理
科学与工程的区别:
- 目的: 科学在于发现认知;工程在于发明运用
- 方法: 分析归纳; 创造演绎
- 成本: 不计代价; 精打细算
- 贡献: 知识开拓; 生活改善
软件重用:
软件重用:
多次不同软件开发过程中,重复使用相同或相近的软件元素的过程
可重用元素:
程序代码,设计文档,需求分析文档,测试用例,设计过程,领域知识
构件: 功能!
- 语义完整,语法正确,有课重用价值的单位软件。
- 是软件重用过程中明确辨识的系统
- 结构上是语义描述,通信接口和实现代码的复合体
构件实现:
具体实现构件功能的逻辑系统,代码构件
构件应用过程:
构件获取
领域工程
重用技术与领域之间的关系:
- 获取途径: 修改,提取,购买
构件管理
构件描述:
- 实现方法
- 实现体
- 注释
- 生产者
- 生产日期
- 规模
- 价格
- 版本
- 关联构件
构件描述: 管理角度的细节刻画
构件模型: 本质的抽象描述
构件组织:
- 要求: 支持构件库维护,查找:精确,模糊,功能行为检索,精确行为描述,易于使用
- 方法: 关键字法
- 方法:刻面法
- 超文本法:
构件分类:
- 商业化构件种类分为: 用户界面,数据库; 商务应用,工具、网络通信,核心技术
- 构件形态分类: 独立、成熟; 有限制; 适应性; 可修改的
人员及权限管理
- 公共用户
- 注册用户
- 构建提供者
- 一般系统管理员
- 超级系统管理员
构件重用
构件检索
基于关键字法:
- 浏览;
- 关键字匹配
优点: 简单易行
缺点: 用户不一定能恰当运用关键字进行描述
基于刻面法
- 构造查询
- 检索构件
- 排序
优点:方便相似构件的查找
缺点:构造查询困难
基于超文本法
- 一个或多个关键字匹配
- 返回相关文档
- 用户通过超链接跳转浏览
优点: 人性化操作
缺点: 迷失,效率低
理解和评价
理解的目标:
- 构件的功能,行为
- 相关领域知识
- 约束条件、例外
- 可预见的修改部分以及修改方法
理解的手段:
评价:
- 成功次数
- 修改量
- 健壮性
- 性能度量
构件组成
- 基于功能
- 基于数据
- 面向对象
软件体系结构的兴起和发展
软件体系结构的定义
核心是在系统开发过程中尽早处理质量属性相关问题。
软件体系结构是一个程序/系统各构件的结构、它们之间的相互关系以及进行设计的原则和随时间演化的指导方针。
- 软件体系结构是具有一定形式的结构化元素,即构件的集合,包括处理构件、数据构件和连接构件。
- 处理构件负责对数据进行加工,数据构件是被加工的信息,连接构件把体系结构的不同部分组合连接起来。
- 这一定义注重区分处理构件、数据构件和连接构件,这一方法在其他的定义和方法中基本上得到保持。
四个角度
- 概念角度描述系统的主要构件及它们之间的关系;
- 模块角度包含功能分解与层次结构;
- 运行角度描述了一个系统的动态结构;
- 代码角度描述了各种代码和库函数在开发环境中的组织。
软件体系结构的意义
- 早期设计决策的体现
- 风险承担者交流的手段
- 可传递可重用的模型
- 高层复用制品,企业战略财富
软件体系结构的发展历程
第贰章
软件体系结构建模
建模: 建立系统模型的过程
软件体系结构建模: 如何对软件体系结构建立系统模型
每个软件系统都有多个风险承担者: 最终用户,开发人员,系统工程师,项目经理
“4+1”视图模型
- 逻辑视图的特性: 自主性,持久性,依赖性,分布性
- 逻辑与开发视图
- 进程视图的产生
- 4+!视图模型的剪裁
-
每个视图只关心一个侧面,结合在一起才反映系统的软件体系结构的全部内容
-
在每个视图上均独立地支持Perry & Wolf 的公式,即定义一个所使用的元素集合(构件、容器、连接件)
逻辑视图:
- 整个系统的抽象结构表述
- 关注系统提供最终用户的功能
- 不涉及具体的变异即输出和部署
- 常使用BOOCH标记法,在UML中类图表示
- 多数使用面向对象风格
- 主要内容保持一个单一的,内聚的对象模型贯穿整个系统。
开发视图
- 侧重软件模块的组织和管理,为编程人员服务
- 通过程序库或子程序进行组织,由不同人员开发
- 考虑内部需求,充分考虑软件开发的容易程度,重用性,软件的通用性,充分考虑由于具体开发工具的不同带来的局限性
- 采用层次风格,采用4-6层子系统,仅进行相邻交互,层次越低,通用性越强
关于层次的引出
进程视图
- 侧重系统的运行特性
- 关注非功能需求: 性能; 可用性; 并发性
- 定义逻辑视图中的各个类的操作是在哪一个线程中被执行
- 可描述多层抽象
- 每个级别分别关注不同的方向
- 最高层抽象中:进程结构 = 构成一个执行单元的一组任务; 独立、分补; 通过逻辑网络相互通信。
物理视图:
- 把软件映射到硬件上
- 关注系统性能、规模、可靠性
具有进程分配的小型ACS系统的物理视图
具有进程分配的大型ACS系统的物理视图
场景
- 是其他视图的冗余
- 作用: 作为驱动因素发现架构设计中的架构元素; 作为设计结束后的一项验证和说明功能,原型测试
核心模型
生命周期
抽象模型
构件定义:构件是一个数据单元或一个计算单元,由构件的对象的集合,属性的集合,动作的集合和端口的集合组成
构件及其关系的抽象描述
构件间关系的定义:
- 顺序结构(顺序运算)
- 选择结构(选择运算)
- 循环结构
连接件和软件体系结构的抽象模型定义
连接体的抽象描述:
连接件是构件运算的实现,它是一个6元组 <ID,Role,Beha,Msgs,Cons,Non-Func>
其中,Role为连接件和构件的交互点的集合,它由一个四元组定义
Role=<Id,Action,Event,LConstrains>
连接体的抽象定义: 设论域为U
- 构件是一个软件体系结构
- 连接体是一个软件体系结构
- 构件经有限次连接(运算后)是软件体系结构。
软件体系结构记为A=<C,O>,其中C表示组成体系结构的构件集合,O表示构件运算的集合
软件体系结构性质:
- 封闭性:即构件与构件、构件与体系结构、体系结构与体系结构连接后仍是一个体系结构。
- 层次性:即体系结构可由构件连接而成,而体系结构又可以再经过连接组成新的更大的体系结构。
- 可扩充性:即一个满足条件的新构件可以通过连接加入到结构中。
第叁章
软件体系结构风格概述
软件体系风格
- 描述特定应用领域中系统组织方式的惯用模式
- 反映众多系统所共有的结构和语义特性
- 指导如何将各个模块和子系统有效组织成一个完整系统
决定风格
- 控制原则
- 质量属性
讨论体系结构风格时要回答的问题
- 构件和连接件的类型是什么?
- 可容许的结构模式是什么?
- 基本的计算模型是什么?
- 风格的基本不变性是什么?
- 其使用的常见例子是什么?
- 使用此风格的优缺点是什么?
- 其常见的特例是什么?
经典软件体系系结构风格
管道-过滤器风格
优点
- 构件间耦合关系降低,易于分解问题,实现重用
- 易于维护和扩展
- 为系统的运行分析提供便捷条件
- 支持并发计算
缺点
- 不适合处理交互频繁的应用
- 数据解析,合成麻烦
扩展形式
- 管线
- 有界管道
- 批处理
面向对象风格
优点
- 封装性,便于重用
- 可实现交互
缺点
- 调用使得修改被传播
事件驱动风格(基于事件的隐式调用)
说明
- 系统运行得以推进的驱动力来源是:广播媒介
- 事件:监听事件、声明事件
- 构成: 事件消费者,事件生产者,事件管理器
- 特征: 面向对象风格的变体; 事件的触发者不知道哪些构件会被这些事件影响;无法预知和假定构件的处理顺序。
- 与面向对象风格的融合
事件驱动的基本结构
显式调用与隐式调用应用案例
电梯系统类图
电梯模型事件及其子类组织结构
乘客在第一层电梯进出的协作图
分层系统
工作机制
- 每个层次为上一层提供服务
- 同时作为用户调用下层的功能
- 严格的分层
- 半透明的分层
优点
- 支持基于抽象程度递增的系统设计
- 良好的扩展性
- 支持重用
缺点
- 层次划分困难
- 适用性受限
数据共享风格
要素
- 两类构件: 中央数据单元 ; 外部构件
- 控制策略: 两类构件间的交互方式
分类
- 传统数据库型(被动)
- 黑板系统(主动)
黑板系统
中央数据单元
- 是系统的核心
- 存储数据 + 系统状态数据
知识源
相互独立,通过黑板完成交互
- 控制单元的位置
- 由来
- 任务
- 目标
- 动作
- 表示方式
控制单元
非独立单元
优点
- 易于增加数据的生产者和消费者
- 良好的知识库扩展性
- 易于保证数据的同步、一致性
专家系统
C2风格
- 层次网络
- 数据驱动
组织规则
- 顶、底
- 构件不能直接相连
- 连接件之间自由连接
- 连接件的直接相连是有序的
工作方式
请求 + 通知
特点
- 基底独立性
- 构件之间交互只能通过消息传递实现
- 多线程
构件结构
客户/服务器风格
结构
服务器任务
- 保证数据库安全性
- 控制数据库并发访问
- 确保数据的一致性
- 数据备份与恢复
客户端任务
- 提供交互界面
- 提交请求,接收信息
- 对客户端数据执行应用逻辑要求
工作流程机制
优点
- 对软硬件变化的适应性和灵活性,易于系统扩充和缩小
- 数据和事务处理能力较强,服务器端负荷轻
- 模型简单,易于理解
缺点
- 开发成本高
- 不便于使用新技术
- 软件维护升级困难
三层客户/服务器风格
传统二层C/S的弊端
- 软硬件的组合和集成能力有限,难以扩展至大型项目中
- 客户机负荷过重
- 数据安全性不好
结构
工作流程机制
物理结构
优点
- 在逻辑上保持相对独立性,能提高系统和软件的可维护性和可扩展性
- 允许更灵活有效地选用相应的平台和硬件系统,在处理负荷能力上与处理特性上分别适应于结构清晰的三层
- 应用的各层可以并行开发,可以选择各自最适合的开发语言
- 利用功能层有效地隔离开表示层与数据层,未授权的用户难以绕过功能层而利用数据库工具或黑客手段去非法地访问数据层
要注意的关键问题
- 三层C/S结构各层间的通信效率若不高,即使分配给各层的硬件能力很强,其作为整体来说也达不到所要求的性能
- 设计时必须慎重考虑三层间的通信方法、通信频度及数据量
浏览器/服务器风格
结构
优点
- 维护升级简单、高效
- 服务覆盖范围大 I. 空间 II. 类别平台
劣势
- 应用服务器负荷重——数据处理和响应速度慢
- 安全控制能力弱
- 数据动态交互性不强
公共对象请求代理体系结构
原理示意
- 命名服务
- 事件服务
- 事务处理服务
- 交易服务
- 生命周期服务
- 安全服务
- 通知服务
构成
工作过程
特点
- 引入中间件做事务代理
- 实现客户与服务对象的完全隔离
- 提供软总线机制
- 基于面向对象的开发
正交软件体系结构
组织结构特征
- 由完成不同功能的n条线索构成
- 系统具有m个不同抽象级别的层
- 线索之间相互独立
- 系统有公共驱动层和公共数据层
实例
优点
- 结构清晰,易于理解
- 易修改,可维护性强
- 可移植性强,重用粒度较大
基于层次消息总线的体系结构风格
结构
要素
- 复合构件
- 原子构件
- 接口: 消息 + 互补端口
- 消息总线
静态结构要点
- 自顶向下层次化分解
- 总线间无直接的连接
对系统演化的支持
- 动态增删构件
- 动态改变构件响应的消息类型
- 支持消息过滤
异构结构风格
原因
- 变动最终是绝对的
- 实际工作中,我们总会遇到一些遗留下来的代码
- 即使在某一单位中,规定了共享共同的软件包或相互关系的一些标准,仍会存在解释或表示习惯上的不同
不同的结构有不同的处理能力的强项和弱点,一个系统的体系结构应该根据实际需要进行选择,以解决实际问题
示例
C/S与B/S混合之内外有别模型
C/S与B/S混合之查改有别模型
示例
互联系统构成的系统及其体系结构
互联系统风格
上级系统独立于其从属系统,每个从属系统仅仅是其上级系统模型中所指内容的一个实现,并不属于上级系统功能约束的一部分
特定领域软件体系结构
定义
- DSSA就是专用于一类特定类型的任务(领域)的、在整个领域中能有效地使用的、为成功构造应用系统限定了标准的组合结构的软件构件的集合
- DSSA就是一个特定的问题领域中支持一组应用的领域模型、参考需求、参考体系结构等组成的开发基础,其目标就是支持在一个特定领域中多个应用的生成
要点
- 严格定义的问题域和/或解决域 (I.垂直域 II.水平域 )
- 具有普遍性,使其可用于领域中某特定应用的开发
- 对整个领域的适合程度的抽象
- 具有该领域固定的、典型的,在开发过程中可重用的元素
基本活动(反复迭代,逐步求精)
- 领域分析
- 领域设计
- 领域实现
◇ C2风格案例
上下文关键字(KWIC)问题
任务要求
KWIC索引系统接受一些行,每行有若干词,每个词由若干字符组成;每行都可以循环移位,亦即重复地把第一个字删除,然后接到行末; KWIC把所有行的各种移位情况按照字母表顺序输出
设计中有待思考的问题
- 处理算法:例如,行的移位可在每行读入后、在所有行读入后、或当排序要求一组移位的行时執行;
- 数据表示:例如,行、字、字符可以不同的方式存储;类似地,循环移位后的行可以显式或隐式存储(索引和偏移量);
- 系统功能的增强:例如,限制以某些“修饰词”(a, an, and等)打头的移位结果;支持交互,允许用户从原始输入表中删除一些行等;
- 效率:时间和空间;
- 复用:构件被复用的潜力。
方案一:使用共享数据的主程序/子程序
- 问题分解:输入、移动、按字母表排序、输出
- 所有计算构件作为子程序协同工作,由主程序顺序调用各个子程序
- 构件通过共享存储区交换数据
方案贰:抽象数据类型
- 系统分解为5各模块,每个构件提供了过程集合
- 每个模块提供一个接口,接口允许其他构件通过调用接口中的过程来访问数据
第伍章: 软件体系结构描述
5.1 软件体系结构描述方法
5.2 软件体系结构描述框架标准
描述框架标准
5.3 软件体系结构描述语言
5.3.1 Unicon
Unicon
构件:
component<identifier>
<interface>
<implementation>
end <indentifier>