系统详细设计
从详细设计概念出发,系统讲解详细设计原则、工具、人机界面设计、数据库设计及详细设计文档的编写方法。
🎯学习目标
- 理解详细设计的概念、目标及其与概要设计的区别;
- 掌握详细设计的基本原则:模块化、抽象、信息隐藏、模块独立性;
- 掌握常用详细设计工具:程序流程图、N-S图、PAD图、判定表、判定树;
- 了解人机界面设计的基本原则和方法;
- 掌握数据库设计的基本过程:概念设计、逻辑设计、物理设计;
- 了解详细设计说明书的内容和编写规范。
1详细设计概述
详细设计(Detailed Design)是软件设计的第二个阶段,也称为过程设计或算法设计。它是在概要设计的基础上,对每个模块进行详细的过程描述,确定模块内部的算法和数据结构。
如果把软件开发比作盖房子:
- 概要设计就像建筑蓝图——确定房子有几层、每层几个房间、房间怎么布局;
- 详细设计就像装修图纸——每个房间的墙刷什么颜色、电线怎么走、水管怎么接。
简单说,详细设计就是告诉程序员:每个模块具体怎么实现。
详细设计的目标
确定算法
为每个模块确定具体的算法和数据结构,描述模块内部的逻辑细节。
确定数据结构
确定模块内部使用的数据结构,包括变量、数组、记录等的定义和组织方式。
编写说明书
编写详细设计说明书,为编码提供明确、具体的指导。
设计测试用例
为每个模块设计测试用例,确保模块实现的正确性。
详细设计与概要设计的区别
| 对比项 | 概要设计 | 详细设计 |
|---|---|---|
| 设计对象 | 整个系统 | 单个模块 |
| 设计内容 | 系统结构、模块划分、接口定义 | 模块内部算法、数据结构 |
| 设计工具 | 结构图、层次图、IPO图 | 流程图、N-S图、PAD图、判定表 |
| 设计粒度 | 粗粒度(模块级) | 细粒度(语句级) |
| 设计人员 | 系统架构师 | 高级程序员 |
| 设计结果 | 概要设计说明书 | 详细设计说明书 |
2详细设计原则
详细设计需要遵循一些基本原则,这些原则有助于产生高质量的设计方案。
模块化原则
模块化定义
Modularity模块化权衡
Trade-off抽象原则
抽象是人类认识复杂问题的基本工具。在软件设计中,抽象表现为不同的层次:
- 最高抽象:从家到公司(关注目的)
- 中级抽象:启动、加速、转弯、刹车(关注动作)
- 最低抽象:踩离合、挂挡、松离合、踩油门(关注操作细节)
信息隐藏原则
信息隐藏(Information Hiding)是指每个模块的实现细节对于其他模块来说是不可见的,模块之间只通过接口进行通信。
- 降低耦合度:模块之间只依赖接口,不依赖实现细节
- 提高可维护性:修改模块内部实现不影响其他模块
- 增强可测试性:可以独立测试每个模块
- 支持并行开发:不同团队可以同时开发不同模块
模块独立性原则
模块独立性是衡量模块质量的重要标准,由两个指标来度量:
耦合(Coupling)
模块间依赖程度内聚(Cohesion)
模块内功能联系耦合类型详解
| 耦合类型 | 说明 | 耦合度 | 示例 |
|---|---|---|---|
| 非直接耦合 | 两模块无直接关系,通过主模块控制 | 最低 | 模块A和模块B无直接调用 |
| 数据耦合 | 通过参数传递简单数据 | 低 | 模块A调用模块B,传递数值参数 |
| 标记耦合 | 通过参数传递数据结构 | 中低 | 传递数组、记录等结构化数据 |
| 控制耦合 | 传递控制信息(标志、开关) | 中 | 传递标志位控制模块行为 |
| 外部耦合 | 访问同一全局变量 | 中高 | 多个模块访问同一全局数据 |
| 公共耦合 | 访问同一公共数据区 | 高 | 多个模块访问同一数据库表 |
| 内容耦合 | 直接访问模块内部数据或代码 | 最高 | 一个模块直接修改另一模块的变量 |
内聚类型详解
| 内聚类型 | 说明 | 内聚度 | 示例 |
|---|---|---|---|
| 偶然内聚 | 模块内各元素无关联 | 最低 | 把不相关的功能放在一个模块 |
| 逻辑内聚 | 逻辑相似的功能放一起 | 低 | 所有输入操作放在一个模块 |
| 时间内聚 | 同一时间执行的动作放一起 | 中低 | 初始化操作放在一个模块 |
| 过程内聚 | 按特定次序执行的动作放一起 | 中 | 按流程顺序处理数据 |
| 通信内聚 | 使用同一数据的操作放一起 | 中高 | 对同一数据的所有操作 |
| 顺序内聚 | 一个元素的输出是另一元素的输入 | 高 | 数据处理的各个阶段 |
| 功能内聚 | 模块只完成一个功能 | 最高 | 计算平方根的模块 |
- 耦合:尽量使用数据耦合,少用控制耦合,限制公共耦合,完全不用内容耦合
- 内聚:尽量达到功能内聚,至少是顺序内聚或通信内聚
3详细设计工具
详细设计工具用于描述模块内部的算法和逻辑结构,常用的工具包括程序流程图、N-S图、PAD图、判定表和判定树。
程序流程图
程序流程图(Program Flowchart)是最常用的详细设计工具,使用图形符号表示程序的控制流程。
- 流程图不是逐步求精的好工具(容易过早考虑控制流细节)
- 流程图难以表示数据结构
- 流程图的箭头可以随意转移,不利于结构化程序设计
N-S图(盒图)
N-S图(Nassi-Shneiderman图),也称为盒图,是结构化程序设计的工具,强制使用三种基本控制结构。
- 强制结构化:只能使用三种基本控制结构,不允许任意转移
- 功能域明确:每个矩形框就是一个功能域,容易理解
- 容易表示嵌套:嵌套关系通过框的包含关系表示
- 局部与全局变量作用域清晰
PAD图
PAD图(Problem Analysis Diagram,问题分析图)是日本日立公司提出的,用二维树形结构表示程序的控制流。
- 设计清晰:最左端是最高层,向右逐步细化
- 支持逐步求精:可以逐步展开细节
- 容易翻译成代码:PAD图到代码的转换是机械的
- 表示数据结构方便:可以清晰地表示数据结构
- 支持结构化程序设计:强制使用三种基本控制结构
判定表
判定表(Decision Table)是描述多条件复杂决策的工具,特别适合处理复杂的条件组合。
判定树
判定树(Decision Tree)是判定表的图形表示形式,更加直观易懂。
- 判定表:适合复杂的条件组合,能清晰展示所有规则
- 判定树:更直观易懂,适合简单的条件判断
- 选择建议:条件少且简单用判定树,条件多且复杂用判定表
4人机界面设计
人机界面(Human-Computer Interface,HCI)是用户与软件系统交互的桥梁,好的界面设计能提高用户的工作效率和满意度。
用户界面设计原则
一致性原则
Consistency反馈原则
Feedback容错原则
Error Tolerance易学原则
Learnability效率原则
Efficiency美观原则
Aesthetics菜单设计
菜单是用户界面中最常用的交互方式之一,好的菜单设计能提高用户的操作效率。
| 菜单类型 | 特点 | 适用场景 |
|---|---|---|
| 下拉菜单 | 从菜单栏向下展开,包含多个菜单项 | 应用程序的主菜单 |
| 弹出菜单 | 在特定位置弹出,与上下文相关 | 右键菜单、快捷操作 |
| 级联菜单 | 菜单项包含子菜单,形成多级结构 | 复杂的命令组织 |
| 图标菜单 | 用图标代替文字,节省空间 | 工具栏、移动端 |
- 逻辑分组:将相关功能组织在同一菜单中
- 层次适中:菜单层次不宜过深,一般不超过3层
- 命名清晰:菜单项名称应简洁明了,能准确描述功能
- 快捷键:为常用功能设置快捷键
- 禁用状态:不可用的菜单项应显示为灰色
对话框设计
对话框用于与用户进行信息交换,获取用户输入或显示系统信息。
模式对话框
必须处理完才能继续操作其他部分。如:文件打开对话框、打印设置对话框。
非模式对话框
可以一直显示,不影响其他操作。如:查找替换对话框、属性面板。
警告对话框
用于显示警告信息,需要用户确认。如:删除确认、保存提示。
进度对话框
用于显示耗时操作的进度。如:文件复制、数据导入导出。
- 对话框不宜过多,避免打断用户的工作流程
- 对话框的标题应清晰描述其功能
- 按钮命名应使用动词,如"保存"、"取消"、"删除"
- 默认按钮应是最安全的操作(如"取消"而不是"删除")
- 提供键盘操作支持(Tab切换、Enter确认、Esc取消)
5数据库设计
数据库设计是详细设计的重要组成部分,目标是设计出能够满足用户需求、性能优良、易于维护的数据库结构。
数据库设计过程
概念设计
概念设计是数据库设计的第一阶段,目标是建立概念数据模型,通常使用E-R图(实体-联系图)表示。
实体
Entity联系
Relationship属性
Attribute逻辑设计
逻辑设计是将概念模型转换为逻辑模型,通常转换为关系模型(表结构)。
| 转换规则 | 说明 |
|---|---|
| 实体转换 | 每个实体转换为一个关系(表),实体属性转换为表的列 |
| 1:1联系 | 可以合并到任意一方,或单独建表 |
| 1:N联系 | 将联系合并到N方,或单独建表 |
| M:N联系 | 必须单独建表,包含双方的主键 |
物理设计
物理设计是为逻辑数据模型选择最适合应用环境的物理结构,包括存储结构和存取方法。
存储结构
确定数据的存储方式,如:顺序文件、索引文件、散列文件等。
存取方法
确定数据的访问方式,如:全表扫描、索引扫描、位图索引等。
索引设计
为经常查询的字段创建索引,提高查询效率。但索引会增加存储空间和维护成本。
分区设计
将大表分成多个小表,提高查询和管理效率。如:按时间分区、按地区分区。
- 规范化:通过规范化减少数据冗余(1NF→2NF→3NF→BCNF)
- 适度反规范化:为了性能,可以适当增加冗余
- 命名规范:表名、字段名应清晰明了,遵循命名规范
- 主键设计:每个表应有主键,建议使用自增ID或UUID
- 外键约束:合理使用外键保证数据完整性
6详细设计文档
详细设计说明书(Detailed Design Document)是详细设计阶段的主要输出文档,为编码人员提供详细的实现指导。
详细设计说明书的内容
| 章节 | 内容说明 |
|---|---|
| 引言 | 编写目的、背景、定义、参考资料 |
| 程序系统的结构 | 用图表表示程序系统中每个程序(模块)的层次关系 |
| 程序设计说明 | 对每个模块逐一进行说明(见下表) |
| 文件设计 | 数据库设计、文件结构设计 |
| 界面设计 | 用户界面设计、输入输出设计 |
模块设计说明
| 描述项 | 说明 |
|---|---|
| 模块描述 | 模块的功能、性能、输入输出 |
| 功能 | 模块应完成的功能 |
| 性能 | 模块的时间、空间要求 |
| 输入项 | 每个输入项的名称、数据类型、格式、取值范围 |
| 输出项 | 每个输出项的名称、数据类型、格式、取值范围 |
| 算法 | 模块所采用的算法描述(流程图、N-S图、伪代码等) |
| 接口 | 与本模块有关的模块调用关系 |
| 存储分配 | 模块所需的存储空间 |
| 限制条件 | 模块运行的限制条件 |
| 测试要点 | 模块测试的主要关注点和测试用例 |
- 完整性:覆盖所有模块,不遗漏
- 一致性:术语、符号、格式保持一致
- 可追踪性:能追溯到需求规格说明
- 可验证性:设计结果可以被验证和测试
- 可修改性:文档结构清晰,易于修改
⭐重点例题
- 条件:金额>1000(是/否)、VIP客户(是/否)
- 动作:8折、9折、不打折
- 规则:3条
| 条件\规则 | 规则1 | 规则2 | 规则3 |
|---|---|---|---|
| 金额>1000? | 是 | 是 | 否 |
| VIP客户? | 是 | 否 | - |
| 动作 | 8折 | 9折 | 不打折 |
- 实体:学生、课程、教师
- 联系:选课(学生-课程,M:N)、授课(教师-课程,1:N)
- 属性:学生(学号、姓名、年龄)、课程(课程号、课程名、学分)、教师(教师号、姓名、职称)
🎯自测(点击展开)
详细设计与概要设计的主要区别是什么?
什么是模块化?模块化有什么好处?
耦合和内聚分别是什么?它们的关系是什么?
N-S图有什么优点?
判定表和判定树各适用于什么场景?
数据库设计包括哪几个阶段?
详细设计说明书应包含哪些内容?
📝强化题库
选择题点选即时判分;填空题输入后"检查"或"显示答案"。