基于工程实践的需求分析和概念原型
本文结合高级软件工程课程所学的知识,对工程实践项目进行需求分析和建立模型,对学到的知识进行应用与实践。
1. 项目介绍
该项目为《设计一个类似知乎的问答系统》,我与另外两位同学一起负责该项目的后端开发。项目的基本要求是支持问题的发布、回答的发布和修改、问题拉链、点赞点踩等功能,并进一步实现高并发,图片评论等功能。
2. 用例建模
2.1 什么是用例
用例的核心概念中首先它是一个业务过程,经过逻辑整理抽象出来的一个业务过程,这是用例的实质。
什么是业务过程?在待开发软件所处的业务领域内完成特定业务任务的一系列活动就是业务过程。
用例的基本要素:
-
一个用例应该由业务领域内的某个参与者所触发。
-
用例必须能为特定的参与者完成一个特定的业务任务。
-
一个用例必须终止于某个特定参与者,也就是特定参与者明确地或者隐含地得到了业务任务完成的结果。
2.2 用例建模的基本步骤
-
第一步,从需求表述中找出用例,往往是动名词短语表示的抽象用例;
-
第二步,描述用例开始和结束的状态,用TUCBW和TUCEW表示的高层用例;
-
第三步,对用例按照子系统或不同的方面进行分类,描述用例与用例、用例与参与者之间的上下文关系,并画出用例图;
-
第四步,进一步逐一分析用例与参与者的详细交互过程,完成一个两列的表格将参与者和待开发软件系统之间从用例开始到用例结束的所有交互步骤都列举出来扩展用例。
-
其中第一步到第三步是计划阶段,第四步是增量实现阶段。
2.3 对项目进行进行用例建模
2.3.1 提取项目用例
本项目的参与者为使用问答系统的用户,结合项目背景,得出针对用户的用例如下:
- 账户的注册、修改、登录、登出
- 浏览问题列表、查看问题详情、问题拉链、查看回答、点赞、评论、收藏等
- 发布问题、修改问题、删除问题
- 回答问题、修改回答、删除问答
- 查看个人主页
2.3.2 绘制用例图
根据上述信息,画出用例图如下:

3. 业务领域建模
3.1 什么是业务领域建模
业务领域建模是开发团队用于获取业务领域知识的过程。因为软件工程师往往需要工作在不同的业务领域或者不同项目中,他们需要业务领域知识来开发软件系统。软件工程师往往来自不同的专业背景,这可能会影响他们对业务领域的认知。因此业务领域建模有助于开发团队获取业务领域知识形成统一的业务认知。
开发团队获取业务领域知识的过程一般包括收集业务领域相关信息、执行团队头脑风暴、对业务领域相关的知识概念进行分类,最后用UML类图将业务领域知识图形化展示。
3.2 业务领域建模的基本步骤
-
第一步,收集应用业务领域的信息。聚焦在功能需求层面,也考虑其他类型的需求和资料;
-
第二步,头脑风暴。列出重要的应用业务领域概念,给出这些概念的属性,以及这些概念之间的关系;
-
第三步,给这些应用业务领域概念分类。分别列出哪些是类、哪些属性和属性值、以及列出类之间的继承关系、聚合关系和关联关系。
-
第四步,将结果用 UML 类图画出来。
第一步更多地在获取需求的阶段已经完成,这里不做赘述;第四步 UML 类图的画法前面已经给出,接下来我们重点将头脑风暴的做法和业务领域概念分类的方法具体探讨一下。
3.3 对项目进行进行业务领域建模
根据之前获得的业务领域信息进行分析,画出 UML 类图如下:

4. 数据建模
- 用户表,储存用户信息
| 字段 | 类型 | 空 | 默认 | 注释 |
|---|---|---|---|---|
| id | bigint(20) | 否 | ||
| username | varchar(32) | 否 | 用户名 | |
| nickname | varchar(32) | 否 | 昵称 | |
| password | varchar(256) | 否 | 密码 | |
| varchar(256) | 否 | 邮箱 | ||
| avatar | text | 否 | 头像 | |
| status | int(11) | 否 | 0 | 状态 |
| create_time | bigint(20) | 否 | 创建时间 | |
| update_time | bigint(20) | 否 | 更新时间 |
- 问题表,储存发布的问题
| 字段 | 类型 | 空 | 默认 | 注释 |
|---|---|---|---|---|
| id | bigint(20) | 否 | ||
| user_id | bigint(20) | 否 | 问题所属用户 ID | |
| title | varchar(128) | 否 | 标题 | |
| summary | text | 否 | 摘要 | |
| content | longtext | 否 | 内容 | |
| status | int(11) | 否 | 0 | 状态 |
| create_time | bigint(20) | 否 | 创建时间 | |
| update_time | bigint(20) | 否 | 更新时间 |
- 回答表,储存发布的回答
| 字段 | 类型 | 空 | 默认 | 注释 |
|---|---|---|---|---|
| id | bigint(20) | 否 | ||
| user_id | bigint(20) | 否 | 回答所属用户 | |
| question_id | bigint(20) | 否 | 回答所属问题id | |
| title | varchar(128) | 否 | 标题 | |
| content | longtext | 否 | 内容 | |
| comment_count | bigint(20) | 否 | 0 | 评论数 |
| collect_count | bigint(20) | 否 | 0 | 收藏数 |
| view_count | bigint(20) | 否 | 0 | 浏览数 |
| status | int(11) | 否 | 0 | 状态 |
| create_time | bigint(20) | 否 | 创建时间 | |
| update_time | bigint(20) | 否 | 更新时间 |
- 评论表,储存各种评论
| 字段 | 类型 | 空 | 默认 | 注释 |
|---|---|---|---|---|
| id | bigint(20) | 否 | ||
| user_id | bigint(20) | 否 | 评论所属用户id | |
| entity_type | int(11) | 否 | 被评论的实体类型 | |
| entity_id | bigint(20) | 否 | 被评论的实体id | |
| target_id | bigint(20) | 否 | 被评论的用户id | |
| content | longtext | 否 | 内容 | |
| status | bigint(20) | 否 | 0 | 状态 |
| create_time | bigint(20) | 否 | 创建时间 |
5. 概念原型
5.1 什么是概念原型
-
概念是人对能代表某种事物或发展过程的特点及意义所形成的思维结论。
-
概念原型是一种虚拟的、理想化的软件产品形式。

5.2 概念原型工作过程举例
-
注册过程
用户填写注册信息,发送数据到系统后台,系统对注册信息进行校验数据格式、查询用户名是否被注册过,不符合要求则返回错误信息。符合要求则向数据库写入数据,并将注册成功结果返回给用户。
-
发布问答
用户登录已注册的账户,浏览问题列表,发现感兴趣的问题,点击问题查看详情以及回答列表,用户发布自己的回答,系统进行处理,返回处理结果,所有用户都可以看到该用户的回答。
6. 总结
本文结合学到的软件工程中的需求分析、用例建模、业务领域建模、数据建模等知识,对我的工程实践项目进行分析和建模。在这个过程中,我对我的工程实践项目有了更深的理解,也体会了在软件开发过程中应用各种方法论的重要性。

浙公网安备 33010602011771号