软件体系结构编档 — Lecture-13
北京大学软件与微电子学院 周立新《软件体系结构》课程 Lecture-13 Part 5:软件体系结构编档 112 页,文字版 PDF,pdftotext 全文提取约 5.2 万字符
一、SA 编档概述
1. 软件文档类型
| 类型 | 服务对象 | 主要内容 |
|---|---|---|
| 系统文档 | 设计和开发人员 | 维护系统或对系统进行重新设置,随软件生命周期过程产生 |
| 用户文档 | 最终用户 | 系统运行支持,描述功能、数据录入、产生结果、定期维护等操作规范 |
系统文档按生命周期阶段划分:
| 阶段 | 传统方法 | 面向对象方法 |
|---|---|---|
| 分析 | E-R 图、数据流图、过程描述、数据字典、事件列表 | 用况图、类图、交互图、状态图 |
| 设计 | 系统流程图、结构图、模块或方法的伪代码、数据库模式图 | 设计类图、软件包图 |
| 实现 | 程序源代码、数据库模式源代码、测试数据 | — |
2. SA 文档的三大用途
- 教育工具 — 特别是新的团队成员、外部分析人员和新的构架师
- 涉众间的首要通讯工具 — 客户架构师、需求工程师、组成部分架构师、实现者、测试者、集成者、维护者、其他系统设计者、管理者、产品线管理者、QA 小组等
- 最为热心的涉众是项目后续构架师
- 支持系统分析 — 包含对安全性、性能、可用性、可维护性等各种属性进行评估的必要信息
3. SA 文档化的核心内容
接口 — 两个独立的实体相互接触、交互和通讯的边界
视图 — 对一组系统元素及其关系的描述
几种著名的视图/视点模型:
| 模型 | 提出者 | 核心视图 |
|---|---|---|
| 4+1 视图 | Philippe Kruchten | 逻辑视图 + 进程视图 + 部署视图 + 实现视图 + 用况视图 |
| RM-ODP 视点 | ISO/ITU-T | 企业视点 + 信息视点 + 计算视点 + 工程视点 + 技术视点 |
| Hofmeister 视图 | Hofmeister | 概念视图 + 模块视图 + 执行视图 + 代码视图 |
| RUP 视图 | 基于 UML | 用况视图 + 设计视图 + 进程视图 + 实现视图 + 部署视图 |
| Clements 视图 | Paul Clements 等 | 模块视图类型 + C&C 视图类型 + 分配视图类型(本章主讲) |
Kruchten 4+1 视图详解:
- 逻辑视图 — 系统设计时子系统或关键包的逻辑表示,忽略实现和物理细节
- 进程视图 — 定义不同 OS 的线程、任务和进程是如何相互通讯的
- 部署视图 — 定义在硬件上是如何被实例化和部署的
- 实现视图 — 描述实际软件如何被实现,包括源代码、目录结构、数据库结构
- 用况视图 — 包括为理解系统行为而必须定义的用况
RM-ODP 视点详解:
- 企业视点 — 商业需求和策略、系统范围和目标
- 信息视点 — 信息的结构、变化、流程、以及在不同功能间的逻辑划分
- 计算视点 — 把系统分解为实体和实体间的接口
- 工程视点 — 处理分布式系统对象之间的交互,以及交互如何得到支持
- 技术视点 — 定义构成系统的硬件和软件构件
4. 合理文档化的七条规则
- 从读者的角度编写文档 — 避免意识流,采用执行流写作风格
- 避免出现不必要的重复
- 避免歧义 — 语义精确,定义明确;慎用箭头
- 使用标准结构
- 记录基本原理
- 使文档保持更新,但更新频度不要过高
- 针对目标的适应性对文档进行评审
5. 编档标准结构
(课程幻灯片中仅列出标题,详细内容在视图类型与风格部分展开)
二、视图类型与风格
三大视图类型总览
| 视图类型 | 关注视角 | 核心元素 | 典型风格 |
|---|---|---|---|
| 模块视图类型 | 代码结构/编译时 | 模块(功能单元) | 分解、使用、泛化、分层 |
| C&C 视图类型 | 运行时行为 | 构件 + 连接件 | 管道-过滤器、共享数据、发布-订阅、客户-服务器、对等、通讯进程 |
| 分配视图类型 | 软件与环境映射 | 软件元素 + 环境元素 | 部署、实现、工作分配 |
2.1 模块视图类型与风格
模块定义 — 能提供内聚功能单元的软件实现单元。产生于 20 世纪 60-70 年代,基于软件单元的思想,具有良好的接口,能提供一组服务(一般为过程或函数),实现了完全或部分隐藏自身内部数据结构和算法。
| 维度 | 描述 |
|---|---|
| 元素 | 模块(提供内聚功能单元的软件实现单元) |
| 关系 | 部分关系、依赖关系、特化关系 |
| 元素特性 | 名称、模块责任、实现信息 |
| 关系特性 | 部分关系:可见性特性;依赖关系:分配的约束条件;特化关系:实现特性 |
| 布局 | 没有继承布局的约束条件 |
支持/不支持什么:
- ✅ 构造:模块视图提供源代码的蓝图,模块与物理结构之间通常有详细映射
- ✅ 分析:模块能划分系统,可以确定模块责任,实现需求跟踪和影响分析
- ✅ 通讯:通过系统责任的自顶向下分解展示系统功能
- ❌ 一般不能用于分析性能、可靠性以及其它运行时属性(无法推断运行时行为)
表示法: 图形表示(UML)、文本列表表示
模块视图的四种风格
| 风格 | 核心关系 | 主要用途 |
|---|---|---|
| 分解风格 | 部分-整体关系(is-part-of) | 系统自顶向下分解,责任分配 |
| 使用风格 | 依赖关系(uses) | 分析模块间依赖,评估可修改性 |
| 泛化风格 | 继承/特化关系(is-a) | 描述可变性、复用、接口继承 |
| 分层风格 | 层间使用关系(允许调用上层/下层) | 结构化系统,支持可移植性和可修改性 |
分解风格:
- 元素:模块
- 关系:“是……的一部分”(分解关系)
- 支持:资源分配、项目规划、需求跟踪、增量式开发
- 不支持:运行时行为分析
使用风格:
- 元素:模块
- 关系:uses(一个模块的正确依赖于另一个模块的存在)
- 支持:影响分析、复用单元识别、可修改性评估
- 不支持:系统整体结构的层次化理解
泛化风格:
- 元素:模块(类/接口)
- 关系:is-a / is-a-kind-of(继承/实现)
- 支持:描述可变性点、框架设计、接口复用
- 表示法:UML 泛化箭头
分层风格:
- 元素:层(一组提供相关服务的模块)
- 关系:允许的层间调用(通常只能调用同层或下层)
- 支持:可移植性、可修改性、增量开发
- 不支持:运行时性能分析
- 常见变体:严格分层(只能调用相邻下层)vs 松散分层(可调用任意下层)
2.2 C&C 视图类型与风格
C&C = Component & Connector(构件与连接件)
运行时视图,关注系统执行时的结构和行为。
| 维度 | 描述 |
|---|---|
| 元素 | 构件(运行时计算单元)+ 连接件(构件间交互的媒介) |
| 关系 | 附着关系(构件通过端口连接到连接件) |
| 元素特性 | 构件的名称、类型、责任、行为协议 |
| 关系特性 | 交互协议、数据传输格式 |
支持/不支持什么:
- ✅ 运行时行为分析:性能、吞吐量、延迟、可靠性、可用性
- ✅ 并发与同步分析
- ✅ 系统执行路径追踪
- ❌ 代码结构映射(源代码如何组织)
表示法(UML 策略):
- 使用类和对象(构件类型作为类,构件实例作为对象)
- 使用子系统(构件类型表示为 UML 子系统,构件实例表示为子系统实例)
- 使用实时语义框架(UML-profile 扩展机制)
C&C 视图的六种风格
| 风格 | 核心机制 | 典型应用 |
|---|---|---|
| 管道-过滤器 | 数据流过一系列处理阶段 | 编译器、数据处理流水线 |
| 共享数据 | 多个构件访问共享数据存储 | 数据库系统、仓库架构 |
| 发布-订阅 | 事件广播,订阅者接收通知 | GUI 事件系统、消息中间件 |
| 客户-服务器 | 请求-响应模式 | Web 应用、分布式系统 |
| 对等连接 | 节点平等,互为客户端和服务器 | P2P 文件共享、分布式计算 |
| 通讯进程 | 并发进程通过多种机制交互 | 操作系统、实时系统 |
管道-过滤器风格:
- 元素:过滤器(计算构件)+ 管道(数据通路连接件)
- 特性:增量式处理、高并发、低耦合
- 支持:吞吐量分析、可修改性(更换过滤器)
- 不支持:需要共享状态的系统
共享数据风格:
- 元素:数据存储(中央仓库)+ 访问构件
- 关系:读写操作
- 两种变体:仓库风格(数据被动,构件主动访问)vs 黑板风格(数据主动触发计算)
- 支持:数据完整性、一致性管理
- 不支持:分布式高并发场景(性能瓶颈)
发布-订阅风格:
- 元素:发布者 + 订阅者 + 事件总线
- 关系:事件发布/订阅关系
- 特性:松耦合、匿名通信、一对多广播
- 支持:可扩展性、事件驱动架构
- 不支持:需要严格时序保证的系统
客户-服务器风格:
- 元素:客户构件 + 服务器构件 + 连接机制
- 关系:请求-响应交互
- 特性:集中式控制、服务复用
- 支持:可伸缩性(增加服务器)、安全性
- 不支持:单点故障问题
对等连接风格:
- 元素:对等节点(兼具客户和服务器角色)
- 关系:对等通信
- 特性:去中心化、高容错、可扩展
- 支持:大规模分布式系统、容错
- 不支持:需要集中管理的场景
通讯进程风格:
- 元素:进程(并发执行单元)
- 连接件:同步、消息传递、数据交换、启动停止等
- 特性:完整表达并发交互机制
- 支持:性能分析、可靠性分析、死锁检测
- 不适合:不关注并发的系统
2.3 分配视图类型与风格
分配视图 — 描述软件元素如何映射到环境元素(硬件、团队、文件系统等)。
部署风格
| 维度 | 描述 |
|---|---|
| 软件元素 | 通常是 C&C 视图类型中的进程 |
| 环境元素 | 计算硬件:处理器、内存、磁盘、网络等 |
| 关系 | ”分配到…”(元素驻留到哪些物理单元上);动态分配时还有”移到…”、“副本移植到…”、“执行移植到…” |
| 软件元素特性 | 资源消耗、必须满足的资源需求和约束条件、安全临界值 |
| 环境元素特性 | CPU 特性、内存特性、磁盘/存储容量、带宽、容错性 |
| 分配关系特性 | 分配是否随系统执行而变换,以及变换规则 |
支持/不支持什么:
- ✅ 性能分析(资源是否足够)
- ✅ 可靠性分析(单点故障识别)
- ✅ 部署规划与成本估算
- ✅ 安全性分析(哪些数据在哪些物理位置)
- ❌ 不适合分析代码结构或模块依赖
三、SA 编档的实施
本课程中该部分仅列出大纲标题,未展开详细内容
- P5-3-1、……
- P5-3-2、……
- P5-3-3、……
关键洞见
- 三种视图类型互补而非互斥 — 模块视图看代码结构,C&C 视图看运行时行为,分配视图看软件与环境的映射。一个完整的架构文档通常需要多种视图。
- 视图选择取决于涉众关注点 — 不同涉众关心不同的质量属性,需要不同的视图来支持分析。
- 文档是沟通工具而非目标 — 七条规则的核心都是”让读者能准确理解架构”,而非追求文档本身的完美。
- 风格是架构知识的复用单元 — 每种风格都有已知的优缺点和适用场景,选择风格就是选择质量属性的取舍。
- C&C 视图是运行时分析的基础 — 性能、可靠性、可用性等运行时质量属性只能通过 C&C 视图和分配视图来分析,模块视图做不到。
关联笔记
- 软件架构概述-软件体系结构课程Lecture-1 — 架构定义、重要性、建筑类比、架构师角色
- 软件架构风格-软件体系结构课程Lecture-2 — 八大经典架构风格 + Shaw & Garlan 分类法
- KWIC与软件架构案例分析-软件架构课程Lecture-3 — KWIC 四种架构对比 + 机器人控制系统
- Agent系统与多Agent系统-软件架构课程Lecture-4 — DAI/DPS/MAS + BDI + KQML/ACL
- 共享信息系统-软件架构课程Lecture-4 — 数据库演进 + CASE 环境 + IBDE 黑板架构
- 设计空间与设计规则 — 软件架构系统研究方法 — CMU/SEI TR-18
- 用户界面软件架构的设计空间与设计规则 — CMU/SEI TR-22
- 量化设计空间 - 软件架构课程 Lecture-5 — QFD + 质量屋 + 多方案比较
- 软件体系结构描述-软件架构课程Lecture-6-7 — IEEE1471 + 形式化方法 + ADL