🎓 总站 🏠 本课目录 01 概述 02 软件过程 03 需求工程 04 系统建模 05 概要设计 06 报告与高可信 07 交互与状态图 08 详细设计 09 AOP 10 测试
软件系统综合课程设计 · 第8章

系统详细设计

从详细设计概念出发,系统讲解详细设计原则、工具、人机界面设计、数据库设计及详细设计文档的编写方法。

📚 学习进度
0%

🎯学习目标

  • 理解详细设计的概念、目标及其与概要设计的区别;
  • 掌握详细设计的基本原则:模块化、抽象、信息隐藏、模块独立性;
  • 掌握常用详细设计工具:程序流程图、N-S图、PAD图、判定表、判定树;
  • 了解人机界面设计的基本原则和方法;
  • 掌握数据库设计的基本过程:概念设计、逻辑设计、物理设计;
  • 了解详细设计说明书的内容和编写规范。

1详细设计概述

详细设计(Detailed Design)是软件设计的第二个阶段,也称为过程设计或算法设计。它是在概要设计的基础上,对每个模块进行详细的过程描述,确定模块内部的算法和数据结构。

💡 通俗理解:什么是详细设计?

如果把软件开发比作盖房子:

  • 概要设计就像建筑蓝图——确定房子有几层、每层几个房间、房间怎么布局;
  • 详细设计就像装修图纸——每个房间的墙刷什么颜色、电线怎么走、水管怎么接。

简单说,详细设计就是告诉程序员:每个模块具体怎么实现

详细设计的目标

🎯

确定算法

为每个模块确定具体的算法和数据结构,描述模块内部的逻辑细节。

📊

确定数据结构

确定模块内部使用的数据结构,包括变量、数组、记录等的定义和组织方式。

📝

编写说明书

编写详细设计说明书,为编码提供明确、具体的指导。

🔍

设计测试用例

为每个模块设计测试用例,确保模块实现的正确性。

详细设计与概要设计的区别

对比项概要设计详细设计
设计对象整个系统单个模块
设计内容系统结构、模块划分、接口定义模块内部算法、数据结构
设计工具结构图、层次图、IPO图流程图、N-S图、PAD图、判定表
设计粒度粗粒度(模块级)细粒度(语句级)
设计人员系统架构师高级程序员
设计结果概要设计说明书详细设计说明书
⭐ 详细设计的核心任务详细设计的核心任务是:将概要设计阶段产生的模块逐步细化,形成可直接翻译成程序代码的过程描述。详细设计的结果决定了代码的质量和可维护性。

2详细设计原则

详细设计需要遵循一些基本原则,这些原则有助于产生高质量的设计方案。

模块化原则

系统 模块A 模块B A1 A2 模块分解示例 将大模块分解为小模块 降低复杂度,提高可维护性
图1 · 模块化分解:将复杂系统分解为简单模块
📦

模块化定义

Modularity
把程序划分为若干个模块,每个模块完成一个子功能,把这些模块组装起来组成一个整体,可以完成指定的功能。模块化是控制复杂度的有效手段。
⚖️

模块化权衡

Trade-off
模块数量越多,每个模块越简单,但模块间接口越复杂。需要找到最佳模块数量,使得总成本(开发+维护)最低。这就是模块化的权衡。

抽象原则

抽象是人类认识复杂问题的基本工具。在软件设计中,抽象表现为不同的层次:

最高抽象问题环境语言(用户视角)
高级抽象算法描述(设计视角)
中级抽象过程描述(实现视角)
低级抽象程序代码(编码视角)
最低抽象机器指令(硬件视角)
💡 抽象的通俗理解抽象就是"忽略细节,关注本质"。比如,描述"开车"这件事:
  • 最高抽象:从家到公司(关注目的)
  • 中级抽象:启动、加速、转弯、刹车(关注动作)
  • 最低抽象:踩离合、挂挡、松离合、踩油门(关注操作细节)

信息隐藏原则

信息隐藏(Information Hiding)是指每个模块的实现细节对于其他模块来说是不可见的,模块之间只通过接口进行通信。

模块 A 隐藏的实现细节 模块 B 隐藏的实现细节 接口 只暴露必要信息
图2 · 信息隐藏:模块只通过接口通信,内部细节对外隐藏
⭐ 信息隐藏的好处
  • 降低耦合度:模块之间只依赖接口,不依赖实现细节
  • 提高可维护性:修改模块内部实现不影响其他模块
  • 增强可测试性:可以独立测试每个模块
  • 支持并行开发:不同团队可以同时开发不同模块

模块独立性原则

模块独立性是衡量模块质量的重要标准,由两个指标来度量:

🔗

耦合(Coupling)

模块间依赖程度
衡量模块之间互相依赖的程度。耦合越低,模块独立性越好。目标:追求低耦合。耦合类型(从低到高):非直接耦合→数据耦合→标记耦合→控制耦合→外部耦合→公共耦合→内容耦合。
🎯

内聚(Cohesion)

模块内功能联系
衡量模块内部各元素彼此结合的紧密程度。内聚越高,模块独立性越好。目标:追求高内聚。内聚类型(从低到高):偶然内聚→逻辑内聚→时间内聚→过程内聚→通信内聚→顺序内聚→功能内聚。

耦合类型详解

耦合类型说明耦合度示例
非直接耦合两模块无直接关系,通过主模块控制最低模块A和模块B无直接调用
数据耦合通过参数传递简单数据模块A调用模块B,传递数值参数
标记耦合通过参数传递数据结构中低传递数组、记录等结构化数据
控制耦合传递控制信息(标志、开关)传递标志位控制模块行为
外部耦合访问同一全局变量中高多个模块访问同一全局数据
公共耦合访问同一公共数据区多个模块访问同一数据库表
内容耦合直接访问模块内部数据或代码最高一个模块直接修改另一模块的变量

内聚类型详解

内聚类型说明内聚度示例
偶然内聚模块内各元素无关联最低把不相关的功能放在一个模块
逻辑内聚逻辑相似的功能放一起所有输入操作放在一个模块
时间内聚同一时间执行的动作放一起中低初始化操作放在一个模块
过程内聚按特定次序执行的动作放一起按流程顺序处理数据
通信内聚使用同一数据的操作放一起中高对同一数据的所有操作
顺序内聚一个元素的输出是另一元素的输入数据处理的各个阶段
功能内聚模块只完成一个功能最高计算平方根的模块
⚠️ 设计目标
  • 耦合:尽量使用数据耦合,少用控制耦合,限制公共耦合,完全不用内容耦合
  • 内聚:尽量达到功能内聚,至少是顺序内聚或通信内聚

3详细设计工具

详细设计工具用于描述模块内部的算法和逻辑结构,常用的工具包括程序流程图、N-S图、PAD图、判定表和判定树。

程序流程图

程序流程图(Program Flowchart)是最常用的详细设计工具,使用图形符号表示程序的控制流程。

开始/结束(椭圆) 处理 处理框(矩形) 判断 判断框(菱形) 流程线(带箭头) I/O 输入/输出框(平行四边形) 开始 输入A 计算B 输出B 简单程序流程图示例 计算并输出结果
图3 · 程序流程图基本符号与示例
⚠️ 流程图的缺点
  • 流程图不是逐步求精的好工具(容易过早考虑控制流细节)
  • 流程图难以表示数据结构
  • 流程图的箭头可以随意转移,不利于结构化程序设计

N-S图(盒图)

N-S图(Nassi-Shneiderman图),也称为盒图,是结构化程序设计的工具,强制使用三种基本控制结构。

顺序结构 A B 选择结构 条件? A (T) B (F) 循环结构(WHILE) WHILE 条件 DO 循环体 循环结构(UNTIL) 循环体 REPEAT UNTIL 条件
图4 · N-S图的四种基本控制结构
💡 N-S图的优点
  • 强制结构化:只能使用三种基本控制结构,不允许任意转移
  • 功能域明确:每个矩形框就是一个功能域,容易理解
  • 容易表示嵌套:嵌套关系通过框的包含关系表示
  • 局部与全局变量作用域清晰

PAD图

PAD图(Problem Analysis Diagram,问题分析图)是日本日立公司提出的,用二维树形结构表示程序的控制流。

PAD图示例 开始 处理A 条件? 处理B T 处理C F 处理D
图5 · PAD图:用二维树形结构表示程序控制流
⭐ PAD图的优点
  • 设计清晰:最左端是最高层,向右逐步细化
  • 支持逐步求精:可以逐步展开细节
  • 容易翻译成代码:PAD图到代码的转换是机械的
  • 表示数据结构方便:可以清晰地表示数据结构
  • 支持结构化程序设计:强制使用三种基本控制结构

判定表

判定表(Decision Table)是描述多条件复杂决策的工具,特别适合处理复杂的条件组合。

判定表示例:订单处理 条件\规则 规则1 规则2 规则3 金额>500? VIP客户? - 动作 8折 9折 原价 条件桩:列出所有条件 | 条件项:条件的取值 动作桩:列出所有动作 | 动作项:对应的动作
图6 · 判定表结构:条件桩、条件项、动作桩、动作项

判定树

判定树(Decision Tree)是判定表的图形表示形式,更加直观易懂。

判定树示例:订单折扣 金额>500? VIP? 原价 8折 9折
图7 · 判定树:用树形结构表示条件判断和对应动作
💡 判定表 vs 判定树
  • 判定表:适合复杂的条件组合,能清晰展示所有规则
  • 判定树:更直观易懂,适合简单的条件判断
  • 选择建议:条件少且简单用判定树,条件多且复杂用判定表

4人机界面设计

人机界面(Human-Computer Interface,HCI)是用户与软件系统交互的桥梁,好的界面设计能提高用户的工作效率和满意度。

用户界面设计原则

🎯

一致性原则

Consistency
界面元素(颜色、字体、布局、术语)在整个系统中保持一致。用户学会一个界面,就能快速学会其他界面。

反馈原则

Feedback
系统应及时向用户提供反馈信息,让用户知道当前状态。如:进度条、提示信息、错误警告等。
🔄

容错原则

Error Tolerance
系统应能容忍用户的错误操作,提供撤销、重做功能,给出明确的错误提示和恢复建议。
📚

易学原则

Learnability
界面应简单直观,减少用户的学习成本。提供帮助文档、提示信息、操作向导等辅助功能。

效率原则

Efficiency
界面应支持高效操作,减少用户的操作步骤。提供快捷键、批量操作、自动完成等功能。
🎨

美观原则

Aesthetics
界面应美观大方,符合用户的审美习惯。合理使用颜色、图标、动画等元素,提升用户体验。

菜单设计

菜单是用户界面中最常用的交互方式之一,好的菜单设计能提高用户的操作效率。

菜单类型特点适用场景
下拉菜单从菜单栏向下展开,包含多个菜单项应用程序的主菜单
弹出菜单在特定位置弹出,与上下文相关右键菜单、快捷操作
级联菜单菜单项包含子菜单,形成多级结构复杂的命令组织
图标菜单用图标代替文字,节省空间工具栏、移动端
⭐ 菜单设计要点
  • 逻辑分组:将相关功能组织在同一菜单中
  • 层次适中:菜单层次不宜过深,一般不超过3层
  • 命名清晰:菜单项名称应简洁明了,能准确描述功能
  • 快捷键:为常用功能设置快捷键
  • 禁用状态:不可用的菜单项应显示为灰色

对话框设计

对话框用于与用户进行信息交换,获取用户输入或显示系统信息。

💬

模式对话框

必须处理完才能继续操作其他部分。如:文件打开对话框、打印设置对话框。

📝

非模式对话框

可以一直显示,不影响其他操作。如:查找替换对话框、属性面板。

⚠️

警告对话框

用于显示警告信息,需要用户确认。如:删除确认、保存提示。

📊

进度对话框

用于显示耗时操作的进度。如:文件复制、数据导入导出。

⚠️ 对话框设计注意事项
  • 对话框不宜过多,避免打断用户的工作流程
  • 对话框的标题应清晰描述其功能
  • 按钮命名应使用动词,如"保存"、"取消"、"删除"
  • 默认按钮应是最安全的操作(如"取消"而不是"删除")
  • 提供键盘操作支持(Tab切换、Enter确认、Esc取消)

5数据库设计

数据库设计是详细设计的重要组成部分,目标是设计出能够满足用户需求、性能优良、易于维护的数据库结构。

数据库设计过程

需求分析 概念设计 逻辑设计 物理设计 数据库设计四阶段 需求分析 → 概念结构设计 → 逻辑结构设计 → 物理结构设计 → 实施 → 运维 每个阶段都有相应的设计方法和工具
图8 · 数据库设计过程:从需求分析到物理实现

概念设计

概念设计是数据库设计的第一阶段,目标是建立概念数据模型,通常使用E-R图(实体-联系图)表示。

📦

实体

Entity
现实世界中可以区分的事物。用矩形表示,框内写实体名。如:学生、课程、教师。
🔗

联系

Relationship
实体之间的关系。用菱形表示,框内写联系名。如:选课、授课、属于。
📊

属性

Attribute
实体或联系的性质。用椭圆表示,框内写属性名。如:学号、姓名、成绩。

逻辑设计

逻辑设计是将概念模型转换为逻辑模型,通常转换为关系模型(表结构)。

转换规则说明
实体转换每个实体转换为一个关系(表),实体属性转换为表的列
1:1联系可以合并到任意一方,或单独建表
1:N联系将联系合并到N方,或单独建表
M:N联系必须单独建表,包含双方的主键

物理设计

物理设计是为逻辑数据模型选择最适合应用环境的物理结构,包括存储结构和存取方法。

💾

存储结构

确定数据的存储方式,如:顺序文件、索引文件、散列文件等。

🔍

存取方法

确定数据的访问方式,如:全表扫描、索引扫描、位图索引等。

📈

索引设计

为经常查询的字段创建索引,提高查询效率。但索引会增加存储空间和维护成本。

🔄

分区设计

将大表分成多个小表,提高查询和管理效率。如:按时间分区、按地区分区。

💡 数据库设计原则
  • 规范化:通过规范化减少数据冗余(1NF→2NF→3NF→BCNF)
  • 适度反规范化:为了性能,可以适当增加冗余
  • 命名规范:表名、字段名应清晰明了,遵循命名规范
  • 主键设计:每个表应有主键,建议使用自增ID或UUID
  • 外键约束:合理使用外键保证数据完整性

6详细设计文档

详细设计说明书(Detailed Design Document)是详细设计阶段的主要输出文档,为编码人员提供详细的实现指导。

详细设计说明书的内容

章节内容说明
引言编写目的、背景、定义、参考资料
程序系统的结构用图表表示程序系统中每个程序(模块)的层次关系
程序设计说明对每个模块逐一进行说明(见下表)
文件设计数据库设计、文件结构设计
界面设计用户界面设计、输入输出设计

模块设计说明

描述项说明
模块描述模块的功能、性能、输入输出
功能模块应完成的功能
性能模块的时间、空间要求
输入项每个输入项的名称、数据类型、格式、取值范围
输出项每个输出项的名称、数据类型、格式、取值范围
算法模块所采用的算法描述(流程图、N-S图、伪代码等)
接口与本模块有关的模块调用关系
存储分配模块所需的存储空间
限制条件模块运行的限制条件
测试要点模块测试的主要关注点和测试用例
⭐ 详细设计说明书的质量要求
  • 完整性:覆盖所有模块,不遗漏
  • 一致性:术语、符号、格式保持一致
  • 可追踪性:能追溯到需求规格说明
  • 可验证性:设计结果可以被验证和测试
  • 可修改性:文档结构清晰,易于修改

重点例题

例题1:判断模块耦合类型 题目:模块A调用模块B,传递一个学生记录(包含学号、姓名、成绩)。这是什么耦合? 分析:传递的是数据结构(记录),不是简单变量,也不是控制信息。 答案:标记耦合。因为传递的是数据结构(记录),比数据耦合高一级,但比控制耦合低。 判断口诀:"简单变量"=数据耦合;"数据结构"=标记耦合;"控制标志"=控制耦合。
例题2:判断模块内聚类型 题目:一个模块包含以下功能:打开文件、读取数据、关闭文件。这是什么内聚? 分析:三个操作都针对同一个数据(文件),且按顺序执行。 答案:顺序内聚。因为一个操作的输出是下一个操作的输入(打开→读取→关闭)。 判断口诀:"同一数据"=通信内聚;"顺序依赖"=顺序内聚;"一个功能"=功能内聚。
例题3:绘制判定表 题目:某公司折扣政策:金额>1000且是VIP客户,打8折;金额>1000但不是VIP,打9折;金额≤1000,不打折。 分析:
  • 条件:金额>1000(是/否)、VIP客户(是/否)
  • 动作:8折、9折、不打折
  • 规则:3条
判定表:
条件\规则规则1规则2规则3
金额>1000?
VIP客户?-
动作8折9折不打折
例题4:E-R图设计 题目:设计学生选课系统的E-R图。 分析:
  • 实体:学生、课程、教师
  • 联系:选课(学生-课程,M:N)、授课(教师-课程,1:N)
  • 属性:学生(学号、姓名、年龄)、课程(课程号、课程名、学分)、教师(教师号、姓名、职称)
关键点:M:N联系必须转换为独立的表,1:N联系可以合并到N方。

🎯自测(点击展开)

详细设计与概要设计的主要区别是什么?
详细设计针对单个模块,确定模块内部的算法和数据结构;概要设计针对整个系统,确定系统结构、模块划分和接口定义。详细设计的粒度更细,是编码的直接依据。
什么是模块化?模块化有什么好处?
模块化是把程序划分为若干个模块,每个模块完成一个子功能。好处:降低复杂度、提高可维护性、支持并行开发、易于测试和调试。
耦合和内聚分别是什么?它们的关系是什么?
耦合衡量模块间依赖程度,内聚衡量模块内功能联系的紧密程度。关系:高内聚通常导致低耦合,两者都是模块独立性的度量指标。目标:高内聚、低耦合。
N-S图有什么优点?
N-S图强制使用三种基本控制结构(顺序、选择、循环),不允许任意转移;功能域明确,容易表示嵌套关系;支持结构化程序设计。
判定表和判定树各适用于什么场景?
判定表适合复杂的条件组合,能清晰展示所有规则;判定树更直观易懂,适合简单的条件判断。条件少且简单用判定树,条件多且复杂用判定表。
数据库设计包括哪几个阶段?
数据库设计包括:需求分析、概念设计(E-R图)、逻辑设计(关系模型)、物理设计(存储结构)、实施、运维。核心是前四个阶段。
详细设计说明书应包含哪些内容?
详细设计说明书应包含:引言、程序系统的结构、程序设计说明(每个模块的功能、性能、输入输出、算法、接口等)、文件设计、界面设计。

📝强化题库

选择题点选即时判分;填空题输入后"检查"或"显示答案"。

已答 0/0答对 0正确率
已答 0/0答对 0