在写概要设计与详细设计的时候,对于内容以及他们之间的界限很容易模糊.今天写点自己的想法.
概要设计内容如下:
具体详细设计内容如下:
简单来说,概要设计是“做什么”和“为什么这样做的蓝图”,而详细设计是“具体怎么做”的施工图。
下面我将从多个维度详细解释它们的区别。
概要设计:就像建筑的总体规划图。
它定义了这栋建筑有几个楼层(模块)、每个楼层是干什么的(功能)、楼层之间如何连通(接口)、主要承重墙在哪里(关键数据结构),以及水电的大致走向(网络/数据流)。它让业主和施工方对整体有一个清晰的共识。
详细设计:就像每个房间的详细施工图。
它精确规定了插座离地多高、用多粗的电线、水管的具体型号、砖块如何砌筑、门框的精确尺寸。建筑工人可以直接根据这份图纸进行施工。
对比维度 | 概要设计 (High-Level Design, HLD) | 详细设计 (Low-Level Design, LLD) |
---|---|---|
目的 | 描述系统的总体架构和模块划分,解决技术实现路线问题。 | 描述每个模块的内部实现细节,指导程序员直接编码。 |
抽象层次 | 高层次、宏观的、逻辑性的设计。关注“是什么”和“为什么”。 | 低层次、微观的、物理性的设计。关注“具体怎么做”。 |
主要内容 | 1. 系统总体结构图(架构图) 2. 模块/子系统划分及其功能描述 3. 模块间接口定义(API、协议) 4. 关键数据结构设计 5. 关键技术选型与说明 6. 外部系统依赖关系 |
1. 每个模块的详细类图(属性、方法) 2. 详细的数据库表设计(字段名、类型、约束) 3. 接口的详细规格(请求/响应参数、错误码) 4. 核心算法的流程图、伪代码或状态图 5. 详细的异常处理逻辑 6. 与非功能性需求(性能、安全)相关的实现细节 |
受众 | 项目经理、架构师、客户代表、测试经理(用于评审、评估工作量、制定计划) | 软件开发工程师、资深开发工程师(用于直接编写代码) |
输出产物 | 《概要设计说明书》(SDD)、系统架构图、技术方案文档 | 《详细设计说明书》、类图、时序图、ER图、API文档、伪代码 |
阶段关系 | 承上启下:在需求分析之后,详细设计之前。 | 编码前奏:在概要设计之后,编码之前。 |
假设我们要开发一个带“用户登录”功能的系统。
模块划分:系统将分为前端Web模块
、后端API网关模块
、用户认证服务模块
、用户数据库
。
接口定义:
前端Web模块
通过 RESTful API 调用 后端API网关模块
的 /api/v1/login
接口。
API网关
调用 用户认证服务
的 validateUser(username, password)
方法。
关键流程:登录请求的流程是:前端 -> API网关 -> 认证服务 -> (查询数据库) -> 返回结果。
关键数据结构:用户表User
主要包含id
, username
, password_hash
等字段。
技术选型:密码使用 BCrypt 算法加密。
总结:HLD确定了由哪几个部分组成,以及它们之间如何协作来完成登录这件事。
类设计:
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) |
---|---|---|
焦点 | 系统的组成部分与连接 | 模块的内部构造与实现 |
问题 | 有哪些组件?它们如何交互? | 这个类/方法如何工作?数据如何存储? |
读者 | 决策者与协调者 | 建造者(程序员) |
理解两者的区别有助于在项目中更好地进行技术分工、文档编写和沟通协作。
全部评论