You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
6.4 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 加餐 | 软件设计文档示例模板
在[第9篇文章](https://time.geekbang.org/column/article/175529)中我讲了每种UML模型图的画法以及这些画法分别适用于什么样的设计阶段我们也可以将不同阶段输出的模型图放在一个文档中对每张模型图配以适当的文字说明构成一篇设计文档。
对于规模不太大的软件系统,我们可以将概要设计文档和详细设计文档合并成一个设计文档。这一篇文章中,我会展现一个设计文档示例模板,你可以参考这个模板编写你的设计文档。
文档开头是设计概述,简单描述业务场景要解决的核心问题领域是什么。至于业务场景,应该在专门的需求文档中描述,但是在设计文档中,必须要再简单描述一下,以保证设计文档的完整性,这样,即使脱离需求文档,阅读者也能理解主要的设计。
此外,在设计概述中,还需要描述设计的非功能约束,比如关于性能、可用性、维护性、安全性,甚至开发和部署成本方面的设计目标。
然后就是具体的设计了,第一张设计图应该是部署图,通过部署图描述系统整个物理模型蓝图,包括未来系统长什么样。
如果系统中包含几个子系统,那么还需要描述子系统间的关系,可以通过子系统序列图,子系统活动图进行描述。
子系统内部的最顶层设计就是组件图,描述子系统由哪些组件组成,不同场景中,组件之间的调用序列图是什么样的。
每个组件内部,需要用类图进行建模描述,对于不同场景,用时序图描述类之间的动态调用关系,对于有复杂状态的类,用状态图描述其状态转换。
具体示例模板如下:
## 1 设计概述
……系统是一个……的系统,是公司……战略的核心系统,承担着公司……的目标任务。
### 1.1 功能概述
系统主要功能包括……,使用者包括……。
### 1.2 非功能约束
……系统未来预计一年用户量达到……日订单量达到……日PV达到……图片数量达到 ……。
1. 查询性能目标:平均响应时间<300ms95%响应时间<500ms,单机TPS>100
2. 下单性能目标:平均响应时间<800ms95%响应时间<1000ms,单机TPS>30
3. ……性能目标:平均响应时间<800ms95%响应时间<1000ms,单机TPS>30
4. 系统核心功能可用性目标:>99.97%
5. 系统安全性目标:系统可拦截…… 、……、……攻击密码数据散列加密客户端数据HTTPS加密外部系统间通信对称加密
6. 数据持久化目标:>99.99999%。
## 2 系统部署图与整体设计
系统上线时预计部署……台物理机,……个子系统,和公司……系统交互,和外部第三方……个系统交互。
### 2.1 系统部署图
![](https://static001.geekbang.org/resource/image/4b/cb/4bb2e603dc9ed6ab9700f29fa5cbb5cb.png)
子系统1的功能职责为……部署……台服务器依赖……和……子系统实现 ……功能。
子系统2参照子系统1来写。
### 2.2 下单场景子系统序列图
![](https://static001.geekbang.org/resource/image/40/ac/4022d74c2923e8bf5adc013788e05fac.png)
1. 下单时子系统先发送……消息到子系统3子系统3需要执行……完成……处理然后发送……消息到财务系统消息中包含……数据。
2. 收到……的处理结果……后子系统1发送……消息到……子系统2……。
### 2.3 退款场景子系统序列图
![](https://static001.geekbang.org/resource/image/40/ac/4022d74c2923e8bf5adc013788e05fac.png)
1. 退款子系统先发送……消息到子系统3子系统3需要执行……完成……处理然后发送……消息到财务系统消息中包含……数据。
2. 收到……的处理结果……后子系统1发送……消息到……子系统2……。
### 2.4 退款场景子系统活动图
![](https://static001.geekbang.org/resource/image/37/e1/375ef48e2f806f42460b1beba71d2ae1.png)
如图所示:
1. 退款开始时子系统1处理XXX然后判断m的状态如果m为真请求子系统3处理ZZZ如果m为假子系统继续处理ZZZ并结束。
2. 子系统3处理ZZZ后一方面继续处理XYZ一方面将……消息发送给财务通进行AAA处理。
3. 子系统在处理完XYZ后返回子系统继续梳理YYY然后退款处理结束。
## 3 子系统1设计
子系统1的主要功能职责是……其中主要包含了……组件。
### 3.1 子系统1组件图
![](https://static001.geekbang.org/resource/image/53/51/53440aeb1890d9de2234e7392b7fbc51.png)
子系统1包含6个组件
组件1的功能主要是……需要依赖组件2完成……是子系统1的核心组件用户……请求主要通过组件1完成。
同样的组件2也可以参照组件1来这样写。
#### 3.1.1 场景A组件序列图
![](https://static001.geekbang.org/resource/image/15/89/15b121ced550eca4913773fc14dcaf89.png)
对于场景A首先组件1收到用户消息CCC然后组件1调用组件2的XXX方法……。
#### 3.1.2 场景B组件活动图
![](https://static001.geekbang.org/resource/image/c3/13/c37566e9d6709b5aa75d9fdb7c1a4513.png)
在场景B中首先组件收到……消息开始处理……然后判断……如果为true那么……如果为false那么……。
### 3.2 组件1设计
组件1的主要功能职责是……其中主要包含了……类。
#### 3.2.1 组件1 类图
![](https://static001.geekbang.org/resource/image/e2/4d/e299191932e2f306dceed924b2915b4d.png)
Class1实现接口Interface1主要功能是……Class1聚合了Class2和Class3共同对外提供……服务Class1依赖Class4实现……功能Class4……。
#### 3.2.2 场景A 类序列图
![](https://static001.geekbang.org/resource/image/6b/02/6b7c8d72357d1d7a26159a78378ed602.png)
在场景A中当外部应用调用类1的create方法时类1……。
#### 3.2.3 对象1状态图
![](https://static001.geekbang.org/resource/image/bc/2e/bc2c158c13cfb129fba57f1b60aadc2e.png)
对象1运行时有4种状态初始状态是状态1当条件1满足是状态1转换为状态2当条件3满足时状态2转换为状态4……。
### 3.3 组件2设计
重复上面的格式。
## 4 子系统2设计
重复上面的格式。