《软件工程》第 9 章 - 软件详细设计
目录
9.1 详细设计的任务与过程模型
9.2 用例设计
9.2.1 设计用例实现方案
9.2.2 构造设计类图
9.2.3 整合并优化用例实现方案
9.3 子系统设计
9.3.1 确立内部设计元素
9.3.2 导出设计类图
9.4 构件设计
9.5 类设计
9.5.1 精化类间关系
9.5.2 精化属性和操作
9.5.3 设计状态图与活动图
9.6 数据模型设计
9.6.1 确定持久数据条目
9.6.2 确定持久数据的组织结构
9.6.3 确立持久数据操作
9.6.4 优化持久数据操作的性能
9.7 设计整合与验证
9.7.1 设计规约
9.7.2 设计验证
在完成软件的体系结构设计后,软件详细设计是将宏观架构转化为具体实现方案的关键步骤。它专注于对系统各部分进行细致规划,为后续编码工作提供明确的指导。本章将结合 Java 代码示例与可视化图表,深入解析软件详细设计的各个环节。
9.1 详细设计的任务与过程模型
详细设计的主要任务是对软件体系结构中的各个模块、构件、类等进行细化设计,包括确定具体的算法、数据结构、接口细节以及模块间的交互方式等。
详细设计的过程模型通常包含以下步骤:
- 对需求和体系结构设计进行分析和理解;
- 进行用例设计,明确每个用例的实现方案;
- 开展子系统、构件、类的设计;
- 完成数据模型设计;
- 对设计进行整合与验证。
其流程图如下:
展示详细设计的整体流程。
9.2 用例设计
9.2.1 设计用例实现方案
针对每个用例,设计具体的实现逻辑和步骤。以 “在线图书借阅系统” 的 “借阅图书” 用例为例,实现方案如下:
- 验证读者是否登录;
- 查询图书库存是否充足;
- 若库存充足,更新图书库存数量,生成借阅记录;
- 返回借阅结果给读者。
对应的 Java 代码示例:
class BookBorrowService {private BookDAO bookDAO;private ReaderDAO readerDAO;private BorrowRecordDAO borrowRecordDAO;public BookBorrowService(BookDAO bookDAO, ReaderDAO readerDAO, BorrowRecordDAO borrowRecordDAO) {this.bookDAO = bookDAO;this.readerDAO = readerDAO;this.borrowRecordDAO = borrowRecordDAO;}public boolean borrowBook(String readerId, String bookId) {// 验证读者是否登录(简化处理,假设已通过其他方式验证)Reader reader = readerDAO.getReaderById(readerId);if (reader == null) {return false;}// 查询图书库存Book book = bookDAO.getBookById(bookId);if (book == null || book.getStock() <= 0) {return false;}// 更新图书库存book.setStock(book.getStock() - 1);bookDAO.updateBook(book);// 生成借阅记录BorrowRecord record = new BorrowRecord(reader, book);borrowRecordDAO.saveRecord(record);return true;}}
上述代码中,BookBorrowService类实现了 “借阅图书” 用例的核心逻辑,通过调用不同的数据访问类完成相关操作。
9.2.2 构造设计类图
根据用例实现方案,确定相关的类及其属性、方法和关系,构造设计类图。“借阅图书” 用例涉及的类图如下:
清晰展示了类之间的依赖和关联关系。
9.2.3 整合并优化用例实现方案
对多个用例的实现方案进行整合,消除重复代码和逻辑冲突,并从性能、可维护性等方面进行优化。例如,将 “借阅图书” 和 “归还图书” 用例中重复的数据库连接和验证逻辑提取为公共方法。
9.3 子系统设计
9.3.1 确立内部设计元素
将系统划分为多个子系统后,确定每个子系统内部的设计元素,如模块、类、接口等。在在线图书借阅系统中,可划分为图书管理子系统、读者管理子系统、借阅管理子系统等。以图书管理子系统为例,内部设计元素可能包括BookController(控制层)、BookService(服务层)、BookDAO(数据访问层)等类。
9.3.2 导出设计类图
根据内部设计元素及其关系,导出子系统的设计类图。图书管理子系统的设计类图如下:
展示图书管理子系统的类结构。
9.4 构件设计
构件设计关注软件系统中可复用的模块或组件,确定其功能、接口和内部实现细节。例如,设计一个通用的 “日志记录构件”,用于记录系统运行过程中的关键信息。
class LoggingComponent {public void logInfo(String message) {System.out.println("[INFO] " + message);}public void logWarning(String message) {System.out.println("[WARNING] " + message);}public void logError(String message) {System.out.println("[ERROR] " + message);}}
该构件提供了不同级别的日志记录方法,其他类可通过创建LoggingComponent实例来复用这些功能。
9.5 类设计
9.5.1 精化类间关系
明确类之间的继承、关联、聚合、组合等关系。例如,在图书借阅系统中,BorrowRecord类与Reader类和Book类是关联关系,且一个Reader可以有多条BorrowRecord,体现一对多的关联。
9.5.2 精化属性和操作
详细定义类的属性和方法,包括属性的类型、访问修饰符,方法的参数、返回值和具体实现逻辑。对Book类进行精化:
class Book {private String id;private String title;private String author;private int stock;private List<BorrowRecord> borrowRecords; // 新增借阅记录列表属性public Book(String id, String title, String author, int stock) {this.id = id;this.title = title;this.author = author;this.stock = stock;this.borrowRecords = new ArrayList<>();}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public int getStock() {return stock;}public void setStock(int stock) {this.stock = stock;}public List<BorrowRecord> getBorrowRecords() {return borrowRecords;}public void addBorrowRecord(BorrowRecord record) {borrowRecords.add(record);}}
上述代码中,为Book类添加了borrowRecords属性和相关操作方法,用于管理图书的借阅记录。
9.5.3 设计状态图与活动图
为类设计状态图和活动图,描述类的状态变化和操作流程。以Book类的状态变化为例,状态图如下:
展示图书的状态转换。
9.6 数据模型设计
9.6.1 确定持久数据条目
分析系统需要持久化存储的数据,如在线图书借阅系统中的图书信息、读者信息、借阅记录等。
9.6.2 确定持久数据的组织结构
选择合适的数据存储结构,如使用关系型数据库(MySQL)时,设计对应的表结构。图书信息表结构设计如下:
字段名 | 数据类型 | 说明 |
book_id | VARCHAR(50) | 图书唯一标识 |
title | VARCHAR(200) | 书名 |
author | VARCHAR(100) | 作者 |
stock | INT | 库存数量 |
9.6.3 确立持久数据操作
定义对持久数据的增、删、改、查操作。以图书信息的查询操作为例,Java 代码(使用 JDBC):
import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;class BookDAO {private static final String DB_URL = "jdbc:mysql://localhost:3306/library";private static final String DB_USER = "root";private static final String DB_PASSWORD = "password";public Book getBookById(String bookId) {Book book = null;try (Connection connection = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);PreparedStatement statement = connection.prepareStatement("SELECT * FROM books WHERE book_id =?")) {statement.setString(1, bookId);ResultSet resultSet = statement.executeQuery();if (resultSet.next()) {String title = resultSet.getString("title");String author = resultSet.getString("author");int stock = resultSet.getInt("stock");book = new Book(bookId, title, author, stock);}} catch (SQLException e) {e.printStackTrace();}return book;}}
9.6.4 优化持久数据操作的性能
通过添加索引、优化 SQL 语句、合理使用缓存等方式提升数据操作性能。例如,在图书信息表的book_id字段上添加索引,加快根据图书 ID 查询的速度。
9.7 设计整合与验证
9.7.1 设计规约
编写详细的设计规约文档,记录详细设计的成果,包括用例设计方案、类图、数据模型等内容,为后续开发和维护提供依据。
9.7.2 设计验证
通过以下方式验证设计的正确性和完整性:
- 评审:组织团队成员、架构师等对设计进行评审,检查是否符合需求和设计规范。
- 原型实现:开发部分功能原型,验证设计的可行性和可实现性。
- 模拟测试:对关键算法和逻辑进行模拟测试,确保其正确性。
本章全面介绍了软件详细设计的各个环节,通过 Java 代码示例、可视化图表和详细的文字说明,帮助读者掌握详细设计的核心要点和实践方法。在实际项目中,详细设计是确保软件高质量实现的关键,需要严谨细致地完成每个步骤。如果对某个知识点存在疑问,或希望补充更多案例,欢迎随时交流!
相关文章:

《软件工程》第 9 章 - 软件详细设计
目录 9.1 详细设计的任务与过程模型 9.2 用例设计 9.2.1 设计用例实现方案 9.2.2 构造设计类图 9.2.3 整合并优化用例实现方案 9.3 子系统设计 9.3.1 确立内部设计元素 9.3.2 导出设计类图 9.4 构件设计 9.5 类设计 9.5.1 精化类间关系 9.5.2 精化属性和操作 9.5.…...

WebVm:无需安装,一款可以在浏览器运行的 Linux 来了
WebVM 是一款可以在浏览器中运行的Linux虚拟机。不是那种HTMLJavaScript模拟的UI,完全通过HTML5/WebAssembly技术实现客户端运行。通过集成CheerpX虚拟化引擎,可直接在浏览器中运行未经修改的Debian系统。 Stars 数13054Forks 数2398 主要特点 完整 Lin…...

王树森推荐系统公开课 排序06:粗排模型
shared bottom 表示神经网络被所有特征共享。精排模型主要开销在神经网络,神经网络很大且很复杂。 每做一次推荐,用户塔只做一次推理。物品塔存放入向量数据库。 后期融合模型常用于召回,前期融合模型常用于精排。 物品塔短时间内比较稳…...
go并发编程| channel入门
channel 介绍 channel 是在 Go 的并发编程中使用的,这个工具的作用之一是 goroutine 之间通信(线程通信指的是多个线程之间通过共享数据或协作机制来协调操作,通常需要借助锁来保证同步)。Go 中推荐使用 channel(不同…...

PH热榜 | 2025-05-29
1. Tapflow 2.0 标语:将你的文档转化为可销售的指导手册、操作手册和工作流程。 介绍:Tapflow 2.0将各类知识(包括人工智能、设计、开发、营销等)转化为有条理且可销售的产品。现在你可以导入文件,让人工智能快速为你…...
详解GPU
详解GPU GPU(图形处理器)就像电脑里的 “图形小能手”,原本主要用来画画(渲染图形),现在还能帮忙干很多杂活(并行计算) 一、先认识 GPU 的 “钥匙”:驱动和开发工具 装驱…...
WPF【11_10】WPF实战-重构与美化(配置Material UI框架)
11-16 【UI美化】配置Material UI框架 三种比较主流的 UI 设计规范,分别是: 苹果的扁平化 UI 设计、安卓或者说谷歌 的 Material Design 以及微软的 Metro 风格。 这三种风格都极具特色,不过我们接下来将会使用的是 Material Design 。在 W…...
(自用)Java学习-5.16(取消收藏,批量操作,修改密码,用户更新,上传头像)
1. 取消收藏功能 前端实现: 用户点击“取消收藏”按钮时,前端通过变量status判断当前状态(0为未收藏,1为已收藏)。 发送AJAX请求到后端接口: 添加收藏:/favoriteise/addFavoriteise?pid商品ID…...

【Node.js】部署与运维
个人主页:Guiat 归属专栏:node.js 文章目录 1. Node.js 部署概述1.1 部署的核心要素1.2 Node.js 部署架构全景 2. 传统服务器部署2.1 Linux 服务器环境准备系统更新与基础软件安装创建应用用户 2.2 应用部署脚本2.3 环境变量管理2.4 Nginx 反向代理配置2…...

【Java Web】速通JavaScript
参考笔记:JavaWeb 速通JavaScript_javascript 速通-CSDN博客 目录 一、JavaScript快速入门 1. 基本介绍 2. JavaScript特点 3. JavaScript的引入方式(重要) 3.1 写在script标签中 3.2 以外部文件方式引入 二、JS的数据类型 1. 变量 2. 常用数据类型 3.特殊值 三、…...

TDengine 运维——巡检工具(安装前预配置)
背景 TDengine 的安装部署对环境系统有一定的依赖和要求,安装部署前需要进行环境预配置操作,本文档旨在说明安装前预配置工具在安装 TDengine 前对环境的预配置内容和工具的使用方法。 预配置工具使用方法 工具支持通过 help 参数查看支持的语法 Usa…...
C#索引器详解:让对象像数组一样被访问
索引器是C#中一个强大而实用的特性,它允许我们像访问数组一样访问类的成员。本文将全面介绍索引器的概念、语法、实现方式以及实际应用场景。 索引器基础概念 索引器(Indexer)是一组get和set访问器,与属性类似,但有以…...
机器学习课设
🎓 图像处理课程设计任务书 课程名称: 图像处理与模式识别 课设题目: 基于手工特征提取与传统机器学习方法的图像分类系统实现 一、课设目的 本课程设计旨在加深对图像处理与分类算法的理解,提升图像特征提取、传统机器学习模…...
vue 如何对 div 标签 设置assets内本地背景图片
在 Vue 中为 <div> 设置 assets 目录下的本地背景图片,需要通过 Webpack 或 Vite 等构建工具 处理路径引用。以下是详细实现方法: 一、项目结构说明 假设你的项目结构如下: src/assets/images/bg.jpg # 背景图片components/…...
wsl2 docker重启后没了
参考这篇文章:wsl2 docker重启后没了_mob64ca12f55920的技术博客_51CTO博客...
ubuntu 22.04 配置静态IP、网关、DNS
1、打开配置文件 vi /etc/netplan/00-installer-config.yaml 2、修改文件内容 # This is the network config written by subiquity network:ethernets:ens33:dhcp4: false # 禁用 dhcpaddresses:- 192.168.12.15/24 # 静态IProutes:- to: defaultvia: 192.168.12.254 …...

RDS PostgreSQL手动删除副本集群副本的步骤
由于PostgreSQL不支持直接删除副本集群,而是需要先将副本集群升级到主实例(区域集群),然后在逐一将写入器实例删除,然后才可以删除副本集群 查看现有的主从实例集群 将副本集群提升到区域集群 选择副本集群–>操作–>提升 提升只读副本…...

MySQL 自增主键重置详解:保持 ID 连续性
目录 前言正文 前言 爬虫神器,无代码爬取,就来:bright.cn Java基本知识: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRUD的功能整理(持续更新)…...
Vue Hook Store 设计模式最佳实践指南
Vue Hook Store 设计模式最佳实践指南 一、引言 在 Vue 3 组合式 API 与 TypeScript 普及的背景下,Hook Store 设计模式应运而生,它结合了 Vue 组合式 API 的灵活性与状态管理的最佳实践,为开发者提供了一种轻量级、可测试且易于维护的状态…...

国产化Word处理控件Spire.Doc教程:通过Java简单快速的将 HTML 转换为 PDF
在处理 HTML 文件时,你可能会发现它们在不同的浏览器和屏幕尺寸下的显示效果并不一致。而将 HTML 转换为 PDF 则可以有效地保留其布局和格式,从而确保内容在不同设备和平台上的呈现保持一致。本文将介绍如何在 Spire.Doc for Java 的帮助下通过 Java 将 …...
Spring AI 1.0 GA深度解析与最佳实践
随着人工智能技术的快速发展,Spring AI 1.0 GA 的发布标志着 Spring 生态在 AI 领域迈出了重要一步。本文将从原理、全景架构设计、最佳实践、性能测试对比等维度,全面解析如何基于 Spring AI 构建企业级 AI 应用,并以接入 DeepSeek 大模型为…...
Java求职面试:从Spring到微服务的技术挑战
Java求职面试:从Spring到微服务的技术挑战 在这个故事中,我们将进入一个模拟的互联网大厂Java求职者面试现场。面试官严肃而专业,而求职者谢飞机则以其幽默和捉摸不透的回答,让面试过程充满了趣味。 第一轮:基础框架…...
鸿蒙OSUniApp 开发的图文混排展示组件#三方框架 #Uniapp
使用 UniApp 开发的图文混排展示组件 在移动应用开发中,图文混排展示是资讯、社区、电商、教育等场景中极为常见的需求。一个灵活、美观的图文混排组件,不仅能提升内容的可读性,还能增强用户的视觉体验。随着 HarmonyOS(鸿蒙&…...
WHAT - 学习 WebSocket 实时 Web 开发
文章目录 一、基础知识了解1. WebSocket 是什么?2. 它的优势: 二、基本工作流程三、快速体验:使用原生 WebSocket客户端(浏览器端 JS):服务端(Node.js 示例,使用 ws 库) …...

5G NTN卫星通信发展现状(截止2025年3月)
今天咱们用实实在在的数据唠唠卫星通信这事儿—这些数字可比科幻片还刺激,直接告诉你这玩意儿现在有多火,未来能有多野! 先甩个大数字:截至2025年3月,全球已经有143个运营商和卫星厂商的合作项目,覆盖53个国…...

【计算机网络】第2章:应用层—DNS
目录 一、PPT 二、总结 DNS(域名系统)详解 (一)DNS核心概念 (二)DNS查询过程(重点❗) (三)DNS资源记录(RR)类型…...

[Linux]虚拟地址到物理地址的转化
[Linux]虚拟地址到物理地址的转化 水墨不写bug 文章目录 一、再次认识地址空间二、页表1、页表的结构设计2、页表节省了空间,省在哪里?3、页表的物理实现 一、再次认识地址空间 OS和磁盘交互的内存基本单位是4KB,这4KB通常被称为内存块。OS对…...

Linux线程入门
目录 Linux线程概念 什么是线程 重新理解进程 线程的优点 线程的缺点 线程的异常 线程用途 Linux线程概念 什么是线程 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”。一切进程至…...

Kubernetes超详细教程,一篇文章帮助你从零开始学习k8s,从入门到实战
k8s 概述 k8s github地址:https://github.com/kubernetes/kubernetes 官方文档:https://kubernetes.io/zh-cn/docs/home/ k8s,全程是 kubernetes,这个名字源于希腊语,意为"舵手"或"飞行员” k8s 这…...
Docker基础 -- Ubuntu 22.04 AArch64 交叉编译 Docker 镜像构建指南
Ubuntu 22.04 AArch64 交叉编译 Docker 镜像构建指南 作者: (填写作者) 发布日期: 2025‑05‑26 1 背景与目标 在企业内网(需要代理)环境下,我们需要一套可靠、可复用的 Ubuntu 22.04 交叉编…...