软考-系统架构设计师 系统分析与设计详细讲解
个人博客:blogs.wurp.top
一、核心概念:分析与设计的区别与联系
- 系统分析 (System Analysis):解决“做什么”的问题。核心任务是理解、建模和定义业务需求和信息需求,创建一个逻辑模型。它关注的是业务领域,独立于任何具体的技术实现。
- 系统设计 (System Design):解决“怎么做”的问题。核心任务是将分析阶段得到的逻辑模型转换为技术性的、可实现的方案,即物理模型。它关注的是技术解决方案。
关系:分析是设计的基础和输入,设计是分析的实现和输出。架构师的角色贯穿两者,但更侧重于设计阶段。
二、系统分析详解:构建逻辑模型
系统分析的目标是产生一个完整、清晰、无二义性的需求规格说明书,其核心手段是建模。
1. 结构化分析方法 (Structured Analysis)
采用“自顶向下,逐层分解”的思想,典型代表是Yourdon方法。
- 核心模型:
- 数据流图 (DFD - Data Flow Diagram):描述系统的逻辑功能和数据流动。
- 要素:
- 外部实体 (External Entity):与系统交互的人、物或系统。
- 过程 (Process):对数据进行变换的操作。
- 数据流 (Data Flow):数据的流动方向。
- 数据存储 (Data Store):逻辑上存储数据的地方。
- 层次:顶层图(上下文图) -> 0层图 -> 1层图… 逐级分解。
- 要素:
- 数据字典 (DD - Data Dictionary):定义DFD中所有数据的组成和结构。是DFD的补充,确保数据含义的唯一性。
- 实体关系图 (ERD - Entity-Relationship Diagram):描述系统内部的静态数据结构及其关系。
- 要素:实体、属性、关系(1:1, 1:N, M:N)。
- 状态转换图 (STD - State Transition Diagram):描述系统或实体状态如何对外部事件做出响应。适用于实时控制系统。
- 数据流图 (DFD - Data Flow Diagram):描述系统的逻辑功能和数据流动。
2. 面向对象分析方法 (Object-Oriented Analysis)
将系统看作一系列相互作用的对象,使用UML(统一建模语言) 进行建模。
- 核心模型:
- 用例图 (Use Case Diagram):从用户视角描述系统功能,是捕获功能需求的最佳工具。包含参与者 (Actor) 和用例 (Use Case)。
- 用例描述 (Use Case Description):用例图的文字补充,详细描述每个用例的基本流、备选流、前置/后置条件等。
- 类图 (Class Diagram):描述系统的静态结构,显示类、类的属性、方法以及类之间的关系(关联、泛化、聚合、组合、依赖)。是OO设计的基石。
- 活动图 (Activity Diagram):描述业务过程或用例内部的详细操作流程,类似于流程图。
- 序列图 (Sequence Diagram):按时间顺序描述对象间的交互过程,清晰展示一次交互中消息的传递顺序,对理解复杂流程非常有用。
三、系统设计详解:构建物理模型
系统设计分为概要设计(总体架构设计)和详细设计(模块内部设计)。架构师主要负责概要设计。
1. 概要设计 / 总体设计
- 任务:将系统划分为若干组成部分(模块/组件),并定义这些部分之间的相互关系。
- 核心工作:
- 设计架构风格:选择系统的基本结构组织模式(如分层架构、微服务架构等)。
- 子系统/模块划分:遵循高内聚、低耦合的原则,将系统分解为更小、更易管理的部分。
- 数据库设计:将逻辑模型(ERD)转化为物理数据库表结构,进行反规范化、索引设计等以优化性能。
- 用户界面设计:设计人机交互的流程和界面原型。
- 制定设计规范:定义接口标准、编码规范、数据交换格式等。
2. 详细设计
- 任务:细化概要设计的结果,为每个模块设计其内部的算法、数据结构、接口细节等,使其能够直接指导编码。
- 方法:
- 结构化设计:使用程序流程图、盒图(N-S图)、PAD图、伪代码等描述算法逻辑。
- 面向对象设计:细化类图,补充类的详细属性和方法签名,可能使用状态图来描述某些复杂对象的状态变迁。
3. 设计原则与理论(软考重点)
(1) 模块化设计原则
- 高内聚 (High Cohesion):一个模块内部各元素关联的程度。追求功能内聚,即一个模块只完成一个单一的功能。
- 低耦合 (Low Coupling):模块之间相互依赖的程度。耦合度越低,模块独立性越强,越易于修改和维护。
- 信息隐藏:模块应该只暴露必要的接口,而将其实现细节隐藏起来。
(2) 面向对象设计原则 - SOLID
- S - 单一职责原则 (SRP):一个类只负责一项职责。
- O - 开闭原则 (OCP):对扩展开放,对修改关闭。
- L - 里氏替换原则 (LSP):子类必须能够替换它们的父类。
- I - 接口隔离原则 (ISP):使用多个专门的接口,而不是一个庞大臃肿的总接口。
- D - 依赖倒置原则 (DIP):依赖于抽象(接口),而不是具体实现。
(3) 软件设计质量度量
- McCabe圈复杂度:衡量程序逻辑复杂性的指标。V(G) = E - N + 2 (E边数,N节点数)。圈复杂度越高,程序越难理解、测试和维护。通常要求一个模块的圈复杂度不超过10。
- Halstead复杂度度量:基于运算符和操作数的数量来预测程序长度、体积等工作量指标。
四、系统分析与设计方法总结与对比
方面 | 结构化方法 | 面向对象方法 |
---|---|---|
核心思想 | 自顶向下、功能分解 | 对象封装、模型映射 |
分析模型 | DFD, ERD, STD, 数据字典 | 用例图、类图(概念层)、序列图 |
设计模型 | 结构图、模块说明书 | 类图(实现层)、组件图、部署图 |
设计原则 | 高内聚、低耦合 | 高内聚、低耦合 + SOLID原则 |
系统视角 | 过程和行为为中心 | 数据和对象为中心 |
适用场景 | 需求稳定、流程驱动的系统(如交易系统) | 需求易变、大型复杂系统(现代主流) |
五、软考考点总结与应用
-
选择题:
- 直接考查DFD、ERD、用例图、类图等模型的元素和用法。
- 考查高内聚、低耦合、SOLID原则的含义。
- 计算McCabe圈复杂度。
- 区分分析与设计的任务差异。
-
案例分析题:
- 题目给出一段系统描述,要求补全DFD或UML图中的缺失部分。
- 给出一个设计,要求分析其在模块划分或类设计上存在的问题(如耦合度过高、违反开闭原则等)。
- 问题:请为某个系统设计架构。
- 答题套路:1. 首先进行模块划分,并阐述划分原则(高内聚低耦合);2. 说明模块间的接口设计;3. 进行数据库设计(表结构、关键索引);4. 考虑非功能需求(如性能要求高则引入缓存,安全性要求高则设计加密机制)。
-
论文题:
- 可能围绕“论面向对象技术在系统设计中的应用”、“高内聚低耦合原则在某项目中的实践”、“系统架构设计中的权衡策略”等主题。
- 写作时,必须结合一个具体项目,详细论述:
- 你是如何从需求分析(用例图)过渡到系统设计(类图、架构图)的。
- 在设计中如何运用设计原则(如SOLID)来解决复杂性问题。
- 如何通过度量(如圈复杂度)来评估和控制设计质量。
- 在满足非功能需求(性能、安全)方面做了哪些关键设计决策。
总结
对于软考架构师,掌握系统分析与设计的关键在于:
- 掌握两种主流方法:既要理解结构化的功能分解思想,更要精通面向对象的建模和设计方法(UML)。
- 熟练运用建模工具:DFD、ERD、用例图、类图、序列图是必须掌握的“语言”。
- 恪守设计原则:将“高内聚、低耦合”和“SOLID”原则作为设计时的最高准则,并能量化评估(圈复杂度)。
- 具备全局视角:分析阶段要全面理解业务,设计阶段要统筹考虑功能、性能、安全、可靠性等各个方面。