软件项目中的概要设计与详细设计

799人浏览 / 0人评论 / 添加收藏

在写概要设计与详细设计的时候,对于内容以及他们之间的界限很容易模糊.今天写点自己的想法.

概要设计内容如下:

具体详细设计内容如下:

 

简单来说,概要设计是“做什么”和“为什么这样做的蓝图”,而详细设计是“具体怎么做”的施工图

下面我将从多个维度详细解释它们的区别。

一、核心比喻

概要设计:就像建筑的总体规划图

它定义了这栋建筑有几个楼层(模块)、每个楼层是干什么的(功能)、楼层之间如何连通(接口)、主要承重墙在哪里(关键数据结构),以及水电的大致走向(网络/数据流)。它让业主和施工方对整体有一个清晰的共识。

详细设计:就像每个房间的详细施工图

它精确规定了插座离地多高、用多粗的电线、水管的具体型号、砖块如何砌筑、门框的精确尺寸。建筑工人可以直接根据这份图纸进行施工。

二、详细对比表格

 
 
对比维度 概要设计 (High-Level Design, HLD) 详细设计 (Low-Level Design, LLD)
目的 描述系统的总体架构模块划分,解决技术实现路线问题。 描述每个模块的内部实现细节,指导程序员直接编码
抽象层次 高层次、宏观的、逻辑性的设计。关注“是什么”和“为什么”。 低层次、微观的、物理性的设计。关注“具体怎么做”。
主要内容 1. 系统总体结构图(架构图)
2. 模块/子系统划分及其功能描述
3. 模块间接口定义(API、协议)
4. 关键数据结构设计
5. 关键技术选型与说明
6. 外部系统依赖关系
1. 每个模块的详细类图(属性、方法)
2. 详细的数据库表设计(字段名、类型、约束)
3. 接口的详细规格(请求/响应参数、错误码)
4. 核心算法的流程图、伪代码或状态图
5. 详细的异常处理逻辑
6. 与非功能性需求(性能、安全)相关的实现细节
受众 项目经理、架构师、客户代表、测试经理(用于评审、评估工作量、制定计划) 软件开发工程师、资深开发工程师(用于直接编写代码)
输出产物 《概要设计说明书》(SDD)、系统架构图、技术方案文档 《详细设计说明书》、类图、时序图、ER图、API文档、伪代码
阶段关系 承上启下:在需求分析之后,详细设计之前。 编码前奏:在概要设计之后,编码之前。

三、举例说明:一个“用户登录”功能

假设我们要开发一个带“用户登录”功能的系统。

1. 概要设计 (HLD) 会描述:

模块划分:系统将分为前端Web模块后端API网关模块用户认证服务模块用户数据库

接口定义

前端Web模块 通过 RESTful API 调用 后端API网关模块/api/v1/login 接口。

API网关 调用 用户认证服务validateUser(username, password) 方法。

关键流程:登录请求的流程是:前端 -> API网关 -> 认证服务 -> (查询数据库) -> 返回结果

关键数据结构:用户表User主要包含id, username, password_hash等字段。

技术选型:密码使用 BCrypt 算法加密。

总结:HLD确定了由哪几个部分组成,以及它们之间如何协作来完成登录这件事。

2. 详细设计 (LLD) 会描述:

类设计

AuthController 类中有一个 login(HttpRequest request) 方法。

AuthService 接口有一个 boolean validateUser(String username, String password) 方法,其实现类是 AuthServiceImpl

数据库详规

users 表:

id: bigint(20), PRIMARY KEY, AUTO_INCREMENT

username: varchar(255), UNIQUE, NOT NULL

password_hash: varchar(255), NOT NULL

created_at: datetime

接口详规

API端点: POST /api/v1/login

请求体: { "username": "string", "password": "string" }

成功响应: { "code": 200, "data": { "token": "jwt_string" } }

失败响应: { "code": 401, "message": "用户名或密码错误" }

算法流程:用伪代码流程图描述 validateUser 方法的执行步骤:

根据用户名从数据库查询用户记录。

如果用户不存在,返回 false

使用 BCrypt 的 matches 函数比对输入密码和存储的哈希值。

返回比对结果。

总结:LLD精确地定义了每个类、每个方法、每个数据库字段以及每个API参数,程序员拿到后几乎可以无歧义地开始写代码。

四、在现代开发中的实践

在敏捷开发中,这两种设计的界限有时会变得模糊,但它们的思想依然存在:

** sprint 0 (第0冲刺):通常会进行一轮轻量级的概要设计**,确定系统的基本架构和技术栈。

每个User Story(用户故事):在开发某个具体功能前,开发团队会进行讨论(相当于简化的详细设计),可能会在白板上画出示意图、定义API,然后就开始编码。详细的API文档(如Swagger)和代码注释承担了部分LLD的职责。

总结

 
 
特性 概要设计 (HLD) 详细设计 (LLD)
焦点 系统的组成部分与连接 模块的内部构造与实现
问题 有哪些组件?它们如何交互? 这个类/方法如何工作?数据如何存储?
读者 决策者协调者 建造者(程序员)

理解两者的区别有助于在项目中更好地进行技术分工、文档编写和沟通协作。

全部评论