四则运算题目生成器
软件工程大作业的结对项目2–四则运算题目生成器
这篇文章详述了问题定义、可行性研究和需求分析部分
所需要的链接如下:
SoftwareEngineering -Repositpory -GitHub
QuestGeneratorWebsite -Repository -GitHub
队友的博客链接 -优快云
1.前言:为啥要做这个项目
问题定义
这个问题乍一眼看上去比较简单,要求还是很清晰的,首先需要能够生成不重复的四则运算表达式,其次要能对四则运算表达式求值,接下来可以通过不同的途径实现不同的功能,可以构建一个具有UI界面的应用程序,或者搭一个用户输入参数可以生成题目的网站,也可以用一门新的语言制作动画将整个流程描述出来
总而言之需要我们做一个生成题目–给出题目答案–对用户输入进行对错判断
然后给刚才的题目生成器完善的要求
可行性研究
接下来说一下为什么认为这个题目可行
选这个题目是因为对四则运算有基本的了解,因为有数据结构和离散数学的知识基础,离散数学曾经编写过一个程序就是去掉四则运算表达式当中的括号的,所以还是对这个课题比较有信心,而且这个项目的第三阶段里第二个方向正好与我当前所选的一门选修课一致
,而且Python代码比较简洁,正好可以锻炼一下自己所学语言的能力,也能熟悉如何利用Django后台如何搭建一个网站,所以最后我们选择了这个题目
环境呢,我用的Mac电脑,搭配Pycharm 18.1 和Python3.7 加上Django 2.27,Pycharm在编写Django程序的时候比VS Code的优势还是很明显的
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(min) | 实际耗时(min) |
---|---|---|---|
Planning | 计划 | 20 | 20 |
Estimate | 预估完成任务耗时 | 2900 | 2600 |
Development | 开发 | - | - |
Analysis | 需求分析 | 200 | 150 |
Design Spec | 生成设计文档 | 60 | 40 |
Design Review | 复核文档 | 30 | 40 |
Coding Standard | 代码设计规范 | 10 | 50 |
Design | 具体设计 | 50 | 30 |
Coding | 具体编码 | 2200 | 1800 |
Code Review | 代码复审 | 150 | 120 |
Test | 测试 | 120 | 300 |
Reporting | 报告 | ||
Test Report | 测试报告 | 50 | 20 |
Size Measurement | 计算工作量 | 30 | 20 |
Postmortem& Process Improvement Plan | 事后总结与改进计划 | 90 | 30 |
合计 | 2900 | 2600 |
项目分工
我主要负责代码的编码,项目设计部分,也负责一部分的单元测试内容
队友主要负责代码评审(使用pylint)和一部分的测试内容
在项目的设计初期,我们将工程分为了两个部分,第一部分是运算表达式生成和运算,其中包括生成四种类型的运算表达式,判断用户输入结果是否相等,把所有的结果保存到一个txt文件中等
第二部分是写一个网络应用程序,可以保存用户信息并且给用户生成题目,也可由用户指定参数生成题目
需求分析
在分析了结对项目要求文档后,我们认为这个项目由以下功能需求构成:
功能需求
功能需求我们分为了四个阶段,分别对应了开发过程的四个阶段所要实现的不同的功能
第一阶段
a)生成四则运算表达式
b)实现可以运算的表达式求值功能
c)添加乘方运算
第二阶段
a)添加分数运算功能
b)对无法运算的表达式重新生成(/0或结果过大过小,乘方的幂次解出的是一个无法除尽的不循环小数)
c)接受用户输入并且生成特定题目
d)将生成的题目保存
e)接受用户输入并且判断对错
第三阶段
a)创建一个网页应用程序
b)将前两阶段实现的内容以包的形式集成到后端
c)创建数据库实现题目、用户管理
d)实现用户信息管理功能(登录注册修改密码)
e)实现用户输入参数获得相应题目的功能
第四阶段
a)在网页端实现接受用户输入判断对错功能
b)实现对用户输入题目的对错进行记录的功能
c)实现输出用户做过的错题历史的功能
性能需求
我们希望生成题目的速度尽可能快,最好能够在30s时间内完成1000道题目的生成和保存操作,网页端希望网页端的并发能力尽可能强,使用非阻塞式的方式与客户端进行通信,并且希望数据库的安全性尽可能高,保证并发操作的成功率
其他需求
由于这是给小学生生成题目,我们希望可以对不同年级的小学生控制出题的不同难度,可以实现有针对性的出题
前两阶段的设计和编码
网站部分
网站部分包括概要设计和详细设计,编码和测试,性能分析的内容
第三阶段
网页部分-第三阶段(1)
网页部分-第三阶段(2)
网页部分-第三阶段(3)
第四阶段
测试和性能分析
测试和性能分析列为单独的博客,因为内容比较独立,但是又很关键
事后总结和提升
概述
剩下的主要是所搭网站的前端后端部分
所使用的架构是Django架构,同样是python写的开源服务器架构
Django版本2.27 没有使用最新的3.0版本因为3.0版本当中据说有未修复的bug
对于先前已经实现的功能,引入只需要将源码打包在一个文件夹里,就可以在后端轻松引入
网页效果概览
a)首先就是希望网页端可以实现用户输入参数从题库中随机生成题目的功能,这个功能因为有数据库的辅助实现起来还是比较简单的;
b) 其次就是希望可以做到用户管理,用户可以注册可以登录如果忘记密码可以通过预留的邮箱找回密码,这个功能也是可以实现的;
c) 第三个就是希望可以像第三阶段的第一个要求让用户在线答题,并且由于有用户管理的准备工作可以生成用户答题的历史记录,并且记录错题信息
网站MVC部分
网页部分是严格按照MVC设计模式实现的,所以在此介绍一下MVC模型
模型
Django中的模型是在每一个app中的models构成的,通过在models中建立class就相当于在数据库中建立了一张表,这些表由Django维护,对于这些表的调用一般是在Views中进行
视图
Django中的视图是每一个app中的views文件中的函数,view和model的引用是通过import models中的class实现的,通过这种方法可以轻松的实现对数据的增删改查
控制器
Django的控制器是用的urls文件,通过对urls.py的配置将用户请求映射到处理函数,urls.py文件存在于项目的根文件和app文件中,通过对url的匹配规则的修改调用不同apps中的不同视图函数实现对用户输入的控制并且向模型发送数据
项目的开发流程
以下是项目的完整开发过程
Software_engineering部分:
12.12
进行了问题定义、可行性研究、需求分析和概要设计工作,生成了用例图模型,对功能需求划分为四个阶段进行开发,对第一阶段的代码进行了部分功能实现
12.14
进行详细设计工作,生成了类图、顺序图模型
对第一部分代码的另外功能不断实现,并且对代码进行了部分精化,完成了第一部分的编码工作
加入了求解器类,实现了基本运算
12.15
对求解器类进行了编码,增加了分数运算功能,对Origin类进行了部分精化,修正了可能造成歧义的代码,实现了常规的四舍五入方法
增加了分数运算功能入口,增加了对乘方运算的限制,可以进行基本的分数乘方运算
运算结果改为全部以分数表达,方便后续运算过程,改了一部分代码格式
12.16
增加了求解器功能,可以对用户的输入进行对错判断
1.3
加入了单元测试部分的代码,修正了单元测试中发现的四舍五入方法的问题
1.4
使用单元测试代码对算数模块进行测试
1.5
对生成器模块进行了单元测试
1.6
增加了solve和getOperOrder的测试用例,对单元测试代码进行了补充
1.9
增加了solve模块的单元测试用例,对之前的部分单元测试代码进行了补充
1.14
对代码进行了重构,提升了代码质量
1.15
对代码进行了检查,改了部分不规范的大小写,去掉了多余的空行,保证了代码风格统一
1.16
增加了OriginRequest的一个模块方法,增加了模块之间的独立性
远程服务器进行了merge
对模块中的参数进行了重新命名,避免命名规则的冲突
对代码进行性能测试,去掉了运行时间较长的部分,对运行时间不合理的位置进行了检查或者代码修改
增加测试用例
1.17
增加了新的测试用例,删除了不需要的文件,单元测试覆盖率达到100%
QuestGeneratorWebsite部分
12.16
进行了概要设计和详细设计,生成了功能模型、静态模型(类图)和动态模型(顺序图)
进行了初步的编码工作
12.17
数据库已经生成了初始数据
实现数据库可以直接通过quest的unique属性判重
有了找回密码功能
有了开题工具的功能
把sousousou的接口接入了QuestGeneratorWebsite
12.18
修改了Cascade的数据库集联错误
有了题目生成功能,从数据库中取出的数据filter后用output_list保存
更改部分网页名称和URL规则
12.19
增加了History数据库模型,还没有加入History功能和在线答题功能
加了出题功能,还差后端验证,后端验证对应上了题目和作答
修改了部分错误
修改了部分URL规则
12.20
增加了验证题目功能,并且将错误题目成功保存进了数据库
增加了防止重复提交表单刷分的功能,修改了score字段没有存到数据库中的bug
完善了三种出题功能
12.21
对前端进行精化,修改了一部分没有来得及更改的前端信息
加入了查看历史记录的功能,前端填充了对应历史记录的链接
1.2
根据SoftwareEngineering中出现的错误,对generate部分进行了重新编写
修改网页中存在的部分bug
1.14
对代码进行重构,生成了新的用例图和顺序图模型
1.15
增加了单元测试的测试用例,提升了代码的完整性和可靠性,对代码的编码风格进行了统一