软件体系结构编档 — Lecture-13

北京大学软件与微电子学院 周立新《软件体系结构》课程 Lecture-13 Part 5:软件体系结构编档 112 页,文字版 PDF,pdftotext 全文提取约 5.2 万字符


一、SA 编档概述

1. 软件文档类型

类型服务对象主要内容
系统文档设计和开发人员维护系统或对系统进行重新设置,随软件生命周期过程产生
用户文档最终用户系统运行支持,描述功能、数据录入、产生结果、定期维护等操作规范

系统文档按生命周期阶段划分:

阶段传统方法面向对象方法
分析E-R 图、数据流图、过程描述、数据字典、事件列表用况图、类图、交互图、状态图
设计系统流程图、结构图、模块或方法的伪代码、数据库模式图设计类图、软件包图
实现程序源代码、数据库模式源代码、测试数据—

2. SA 文档的三大用途

  1. 教育工具 — 特别是新的团队成员、外部分析人员和新的构架师
  2. 涉众间的首要通讯工具 — 客户架构师、需求工程师、组成部分架构师、实现者、测试者、集成者、维护者、其他系统设计者、管理者、产品线管理者、QA 小组等
    • 最为热心的涉众是项目后续构架师
  3. 支持系统分析 — 包含对安全性、性能、可用性、可维护性等各种属性进行评估的必要信息

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. 合理文档化的七条规则

  1. 从读者的角度编写文档 — 避免意识流,采用执行流写作风格
  2. 避免出现不必要的重复
  3. 避免歧义 — 语义精确,定义明确;慎用箭头
  4. 使用标准结构
  5. 记录基本原理
  6. 使文档保持更新,但更新频度不要过高
  7. 针对目标的适应性对文档进行评审

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 策略):

  1. 使用类和对象(构件类型作为类,构件实例作为对象)
  2. 使用子系统(构件类型表示为 UML 子系统,构件实例表示为子系统实例)
  3. 使用实时语义框架(UML-profile 扩展机制)

C&C 视图的六种风格

风格核心机制典型应用
管道-过滤器数据流过一系列处理阶段编译器、数据处理流水线
共享数据多个构件访问共享数据存储数据库系统、仓库架构
发布-订阅事件广播,订阅者接收通知GUI 事件系统、消息中间件
客户-服务器请求-响应模式Web 应用、分布式系统
对等连接节点平等,互为客户端和服务器P2P 文件共享、分布式计算
通讯进程并发进程通过多种机制交互操作系统、实时系统

管道-过滤器风格:

  • 元素:过滤器(计算构件)+ 管道(数据通路连接件)
  • 特性:增量式处理、高并发、低耦合
  • 支持:吞吐量分析、可修改性(更换过滤器)
  • 不支持:需要共享状态的系统

共享数据风格:

  • 元素:数据存储(中央仓库)+ 访问构件
  • 关系:读写操作
  • 两种变体:仓库风格(数据被动,构件主动访问)vs 黑板风格(数据主动触发计算)
  • 支持:数据完整性、一致性管理
  • 不支持:分布式高并发场景(性能瓶颈)

发布-订阅风格:

  • 元素:发布者 + 订阅者 + 事件总线
  • 关系:事件发布/订阅关系
  • 特性:松耦合、匿名通信、一对多广播
  • 支持:可扩展性、事件驱动架构
  • 不支持:需要严格时序保证的系统

客户-服务器风格:

  • 元素:客户构件 + 服务器构件 + 连接机制
  • 关系:请求-响应交互
  • 特性:集中式控制、服务复用
  • 支持:可伸缩性(增加服务器)、安全性
  • 不支持:单点故障问题

对等连接风格:

  • 元素:对等节点(兼具客户和服务器角色)
  • 关系:对等通信
  • 特性:去中心化、高容错、可扩展
  • 支持:大规模分布式系统、容错
  • 不支持:需要集中管理的场景

通讯进程风格:

  • 元素:进程(并发执行单元)
  • 连接件:同步、消息传递、数据交换、启动停止等
  • 特性:完整表达并发交互机制
  • 支持:性能分析、可靠性分析、死锁检测
  • 不适合:不关注并发的系统

2.3 分配视图类型与风格

分配视图 — 描述软件元素如何映射到环境元素(硬件、团队、文件系统等)。

部署风格

维度描述
软件元素通常是 C&C 视图类型中的进程
环境元素计算硬件:处理器、内存、磁盘、网络等
关系”分配到…”(元素驻留到哪些物理单元上);动态分配时还有”移到…”、“副本移植到…”、“执行移植到…”
软件元素特性资源消耗、必须满足的资源需求和约束条件、安全临界值
环境元素特性CPU 特性、内存特性、磁盘/存储容量、带宽、容错性
分配关系特性分配是否随系统执行而变换,以及变换规则

支持/不支持什么:

  • ✅ 性能分析(资源是否足够)
  • ✅ 可靠性分析(单点故障识别)
  • ✅ 部署规划与成本估算
  • ✅ 安全性分析(哪些数据在哪些物理位置)
  • ❌ 不适合分析代码结构或模块依赖

三、SA 编档的实施

本课程中该部分仅列出大纲标题,未展开详细内容

  • P5-3-1、……
  • P5-3-2、……
  • P5-3-3、……

关键洞见

  1. 三种视图类型互补而非互斥 — 模块视图看代码结构,C&C 视图看运行时行为,分配视图看软件与环境的映射。一个完整的架构文档通常需要多种视图。
  2. 视图选择取决于涉众关注点 — 不同涉众关心不同的质量属性,需要不同的视图来支持分析。
  3. 文档是沟通工具而非目标 — 七条规则的核心都是”让读者能准确理解架构”,而非追求文档本身的完美。
  4. 风格是架构知识的复用单元 — 每种风格都有已知的优缺点和适用场景,选择风格就是选择质量属性的取舍。
  5. C&C 视图是运行时分析的基础 — 性能、可靠性、可用性等运行时质量属性只能通过 C&C 视图和分配视图来分析,模块视图做不到。

关联笔记