章节概述
对于架构设计师而言,系统设计是其"看家本领",而设计是在对系统进行分析的基础上进行的。本章系统阐述了从问题定义到系统设计的完整方法论,涵盖了定义问题与归结模型、需求分析与软件设计、结构化分析与设计(SA/SD)、面向对象分析与设计(OOA/OOD)、用户界面设计以及工作流参考模型六大主题。需求分析解决"做什么"的问题,系统设计解决"怎么做"的问题,两者构成了软件生存期中最关键的两个步骤。
根据 Standish Group 对 23000 个项目的研究结果,28% 的项目彻底失败,46% 的项目超出经费预算或工期,仅约 26% 获得成功。在这些高达 74% 的不成功项目中,约 60% 的失败源于需求问题。这一数据凸显了需求分析在整个软件开发生命周期中的极端重要性。本章首先介绍问题分析的方法(鱼骨图、帕累托图),然后分别深入讲解结构化方法和面向对象方法两大分析与设计体系,最后延伸到界面设计与工作流管理。
结构化分析方法以数据流图(DFD)为核心,采用自顶向下逐层分解的策略;面向对象方法以UML 统一建模语言为标准,通过对象、类、继承、多态等概念构建与现实世界贴近的模型。两种方法各有侧重,架构设计师需要根据项目特点灵活选择。此外,本章还涉及模块设计中的高内聚低耦合原则、信息隐蔽原则,以及分布式系统设计和系统过渡计划等实践性内容。
知识结构框架
- 8.1 定义问题与归结模型 — 问题分析五步骤(达成共识→理解本质→确定干系人→定义边界→确定约束)、因果鱼骨图、帕累托图、上下文范围图与用例模型、系统约束
- 8.2 需求分析与软件设计 — 需求分类(功能/非功能/设计约束;业务/用户/系统需求)、需求工程=需求开发+需求管理、需求分析方法演进(结构化→软系统→面向对象→面向问题域)、软件设计两阶段(概要设计+详细设计)
- 8.3 结构化分析与设计 — DFD四大元素与层次(Context图→0层图→1层图)、数据字典符号规则、结构图(模块/调用/数据)、变换流与事务流、模块设计(信息隐蔽、内聚7种/耦合7种)
- 8.4 面向对象的分析与设计 — 对象/类(实体类/控制类/边界类)、继承与泛化、多态4种(参数/包含/重载/强制)、UML构造块与14种图、用例图(包含/扩展关系)、类图4种关系(依赖/泛化/关联[聚合/组合]/实现)、交互图(顺序/通信/定时)、状态图与活动图
- 8.5 用户界面设计 — 三大黄金法则(置用户于控制之下、减少记忆负担、保持界面一致)、界面设计四活动(用户分析→界面设计→实现→界面确认)
- 8.6 工作流设计 — 工作流管理系统WFMC参考模型六大模块(流程定义工具、工作流执行服务、其他执行服务、客户应用程序、被调用应用程序、管理和监控工具)
核心概念
问题分析
开发前对问题透彻理解的五步法:在问题定义上达成共识、理解问题本质(根本原因分析)、确定项目干系人和用户、定义系统边界、确定系统实现的约束。鱼骨图和帕累托图是常用的分析工具。
数据流图(DFD)
图形化系统模型,展示信息系统输入、输出、处理、数据存储。包含5个基本元素:过程(加工)、外部实体(源/宿)、数据存储(文件)、数据流、实时连接。采用自顶向下逐层分解策略。
数据字典
对所有与系统相关的数据元素的有组织列表和精确定义,使开发人员对输入、输出、存储成分有共同理解。条目包括名称、何处使用/如何使用、内容描述、补充信息。
变换流与事务流
变换流:信息沿输入通路进入系统,转换为内部表示,经变换中心处理后沿输出通路离开。事务流:信息进入系统后,事务中心根据输入信息类型在若干动作序列中选择一个执行。
模块独立性(高内聚低耦合)
模块独立指每个模块完成相对独立的特定子功能,与其他模块联系最简单。用耦合(模块间联系紧密度)和内聚(模块内元素联系紧密度)两个标准衡量。设计目标:高内聚、低耦合。
信息隐蔽
将每个程序成分封装在单一设计模块中,尽可能少地暴露内部处理。将难的决策、可能修改的决策、数据结构内部连接、硬件相关细节等隐蔽起来,以提高软件可修改性、可测试性和可移植性。
对象与类
对象由对象标识(名称)、属性(状态/数据)、服务(操作/方法)三要素组成,封装为整体以接口对外提供服务。类是对具有相同属性和服务的对象的抽象。类分三种:实体类(永久存储)、控制类(协调用例行为)、边界类(系统与外界交互)。
继承与泛化
继承说明特殊类(子类)与一般类(父类)的关系;泛化说明一般类与特殊类的关系,是一对多关系。子类与父类完全一致(关联、属性、操作),还可包含额外信息,且父类实例可用处也可用子类实例。
多态(4种形式)
一般类中定义的属性或服务被特殊类继承后,可具有不同数据类型或行为。参数多态和包含多态合称通用多态;重载多态和强制多态合称特定多态。重载=编译时静态绑定,改写=运行时动态绑定。
UML 四种关系
依赖(虚线箭头):修改X可能引起Y修改;泛化(空心箭头实线):父类与子类关系;关联(实线):语义联系,含聚合(空心菱形,生命周期可不同)和组合(实心菱形,生命周期相同);实现(空心箭头虚线):接口与实现类关系。
用例图
描述外部参与者所理解的系统功能。参与者代表与系统接口的角色(虚拟概念),用例定义一组用例实例,应给参与者带来可见价值。用例间关系:包含(<<include>>,提取公共行为)和扩展(<<extend>>,分离不同场景)。
关键公式与规则
数据字典符号规则
DFD 层次编号规则
内聚度排序(从高到低)
耦合度排序(从低到高)
多态分类规则
聚合 vs 组合(生命周期规则)
考试要点
- DFD 四大元素与层次:过程(加工)、外部实体(源/宿)、数据存储(文件)、数据流,外加实时连接。层次编号:Context图→0层图(1,2,3)→1层图(1.1,1.2…)。0层图输入输出须与Context图一致。
- Context 图 = 0 层图的顶层:将整个系统表示为一个过程,所有外部实体和进出系统的数据流都画在一张图中,描述系统最高层结构。
- 变换流 vs 事务流:变换流=信息经输入→变换中心→输出;事务流=事务中心根据输入类型选择若干动作序列之一执行。需根据流类型分别实施变换分析或事务分析。
- 内聚/耦合 7 种排序(必考):内聚从高到低:功能>顺序>通信>时间内>逻辑>偶然;耦合从低到高:非直接>数据>标记>控制>外部>公共>内容。设计目标是高内聚低耦合。
- 信息隐蔽目的:将可能变化的因素隐藏在模块内部,提高软件可修改性、可测试性和可移植性,是现代软件设计的关键性原则。
- 面向对象三大特性:封装(对象=标识+属性+服务)、继承/泛化(子类与父类关系)、多态(不同类对象对同一消息的不同响应)。
- 多态 4 种及通用/特定分类:参数多态、包含多态属通用多态;重载多态、强制多态属特定多态。
- 重载 vs 改写:重载=编译时静态绑定(静态分派);改写=运行时动态绑定(动态分派)。这是两者本质区别。
- UML 14 种图分类:静态模型(类图、对象图、包图、构件图、部署图、制品图);动态模型(用例图、顺序图、通信图、定时图、状态图、活动图、交互概览图,对象图兼属静态/动态)。UML 2.0 共 14 种。
- 类图 4 种关系及聚合 vs 组合:依赖(虚线箭头)、泛化(空心箭头实线)、关联(实线,含聚合与组合)、实现(空心箭头虚线)。聚合=部分与整体生命周期可不同;组合=生命周期相同。
- 用例的包含与扩展关系:<<include>>=从多个用例提取公共行为(抽象用例),强制包含;<<extend>>=分离不同场景为主用例+辅用例,条件性扩展。
- 顺序图 vs 通信图区别:顺序图强调消息传递的时间顺序(垂直轴=时间,水平轴=对象);通信图强调对象间的静态链接关系。两者语义等价,排版不同。
关键图示
图8-5 数据流图(DFD)的基本元素
DFD 包含过程(加工)、外部实体(源/宿)、数据存储(文件)、数据流、实时连接五个基本元素,是结构化分析的核心工具。
图8-12 用例图示例
用例图描述外部参与者所理解的系统功能,包含参与者(小人图标)和用例(椭圆),是需求分析阶段的核心模型。
图8-15 类图实例
类图展示类的三格结构(类名、属性、操作)及类间关系(依赖、泛化、关联、实现),是面向对象建模的核心。
图8-19 状态图实例
状态图描述特定对象的所有可能状态及引起状态转移的事件,包含初始状态、结束状态、中间状态和状态转移箭头。