关于软件系统设计的一点思考
假如公司要开发一款抢票软件,产品经理给了我们一份产品需求文档,主要描述了系统需要开发哪些功能。
image那么我们如何如设计软件呢?
在大型项目中,软件设计可以包括架构设计、概要设计和详细设计,如下图所示。
image由于上述设计过程非常复杂,输出的文档非常多,在敏捷化开发中未必有效。所以,下面介绍一种简单的系统设计方法。
1. 分析系统上下文
第一步,我们需要确定我们的系统处于一个什么样的环境下,与周边哪些系统存在交互行为。
image.png由于我们有微信通知、微信登录等功能,所以必然与微信接口服务有交互;抢票需要刷票、提交订单,所以必然与12306后端系统有交互;后端系统需要持久化,所以必然与数据库系统有交互;后端和前端必然有交互。所以我们可以画出系统上下文图,如上图所示。
2. 设计系统内部结构
我们可以把后端子系统想象成一个黑盒子,它需要对外提供特定功能(用例图),为例完成这些功能,它与周边其它系统存在交互行为(上下文图)。那么后端子系统这个黑盒子内部是怎么样的,我们还不清楚,所以,接下来,我们需要设计盒子的内部结构。
image我们可以基于四层架构模型来设计其内部结构。与外部系统的交互可以放在整合层;与前端子系统的交互可以放在接口层;与数据库系统的交互可以放在数据管理层;自身的功能实现可以放在业务逻辑层。
那么我们下面就要分别回答四个问题。
(1)与前端子系统交互存在哪些外部接口?
(2)与数据库系统交互需要哪些数据库表?
(3)实现主要功能需要哪些核心模块?
(4)在实现核心模块的时候需不需要采用设计模式?
3. 定义外部接口
可以通过产品需求文档提供的用例图或者原型图,分析前端哪些地方需要向后端请求数据。该过程可能还需要与前端工程师进行讨论,从而确定接口名、请求参数、cookie、返回结果等。
image4. 设计数据库表
下面,我们需要确定系统有哪些数据库表。我们可以通过用例图,识别出实体对象,然后,确定每个实体对象需要存储哪些属性,最后确定实体之间的关系。
image.png该过程考验设计师或者程序员对系统业务的理解,我们首先要深入理解业务,然后基于数据库设计对三大范式对数据库表进行设计。
5. 划分模块
业务逻辑层是我们实现系统功能的核心,我们需要考虑将其分为几个模块,使得模块高内聚,低耦合。
image.pngCSAI顾问团首席顾问,软件架构专家温昱在《软件架构设计:程序员向架构师转型必备》中说到,业务上紧密相关的一组功能实现涉及的元素也紧密相关、甚至是同样的元素。所以,可以通过将用例图转化为功能树的方法,将相似功能组合在一起作为一个模块。该部分同样考验设计师对业务对理解。
6. 考虑设计模式
由于在抢票过程中,有很多状态,比如抢票中、提交中、已取消、待支付、已完成、已过期、休息中等等,我们可以采用if-else的方法对当前状态进行判断,然后分别执行响应对处理,但是,这样做会使得程序难以维护,因此,可以考虑使用状态机模式。
状态机模式允许对象在内部状态改变时改变它的行为,对象看起来就好像修改了它的类。
首先,画出抢票过程的状态图。
image然后,我们就可以设计出类图(几乎所有的设计模式都有现成的类图设计模版)
image总结
完成上述分析和设计过程之后,我们是不是对系统长什么样子有了一个比较清晰的认识了呢?那么这就是我想要分享的小型项目的系统设计方法。
最后,希望大家能够多多关注我的公众号,我会定期推送一些大数据、Java等方面的学习资料。
image