四则运算升级版--图形化界面
结对项目——四则运算 “软件”之升级版
GitHub地址:https://github.com/Rozmin/Airi
结对成员刘星辰博客园:https://www.cnblogs.com/destinymingyun
一、开发环境
IDE : IntelliJ IDEA 2018.2.4 x64
JDK: JDK_U801
系统: Window 10 x64
二、需求分析
1.原始需求:
- 生成题目,单个题目最多不能超过4个运算符,操作数小于100。
- 用户可以输入答案
- 若用户输入答案正确,则提示正确;若答案错误,则提示错误,并要提示正确答案是多少。
2.拓展方向:
- 程序可以出带括号的正整数四则运算,支持分数,除法保留两位小数,如:(1/3+1)*2 = 2.67,特别注意:这里是2.67而非2.66,或保持分数形式:8/3
- 可以出表达式里含有负整数(负整数最小不小于-100)的题目,且负数需要带括号,用户输入的结果不用带括号。如: 2*(-4) = -8
- 用户答题结束以后,程序可以显示用户答题所用的时间
- 用户可以选择出题的个数(最多不能超过5个题目),答题结束可以显示用户答错的题目个数和答对的题目个数
- 用户在第一次答题时,需要用户输入用户名,用户下次启动后,程序需要记住用户前一次输入的用户名
- 程序可以出单个整数阶乘的题目:如:4!=24
- 程序可以设置答题时间,时间设置为整数,单位为秒,最大不能超过120秒,若超过了答题时间未答题,则提示:时间已到,不能答题。
- 程序可以设置皮肤功能,可以改变界面的颜色即可。
3.分析:
对于8个功能的选择,我们小组参考了《构建之法》第8章的需求分析。将其按书中的四个象限进行分类
1.必要需求
原始需求 + 图形化界面
2.杀手需求
程序可以出带括号的正整数四则运算,支持分数,除法保留两位小数,如:(1/3+1)*2 = 2.67,特别注意:这里是2.67而非2.66
可以出表达式里含有负整数(负整数最小不小于-100)的题目,且负数需要带括号,用户输入的结果不用带括号。如: 2*(-4) = -8
程序可以出单个整数阶乘的题目:如:4!=24
3外围需求:
程序可以设置答题时间,时间设置为整数,单位为秒,最大不能超过120秒,若超过了答题时间未答题,则提示:时间已到,不能答题。
用户答题结束以后,程序可以显示用户答题所用的时间
用户可以选择出题的个数(最多不能超过5个题目),答题结束可以显示用户答错的题目个数和答对的题目个数
用户在第一次答题时,需要用户输入用户名,用户下次启动后,程序需要记住用户前一次输入的用户名
4.辅助需求:
程序可以设置皮肤功能,可以改变界面的颜色即可。
4.方向选择
值得一提的是,一开始,因为我们小组以前没有完全写过整套的代码,一开始想八个功能全完成的,工作量高于我们估计的n倍,而且由于我们本身的技术能力限制,完成作业时间限制,最后不得不选其中的一部分。考虑到未来可能会升级到web模式,以及java对图形化界面过于复杂的操作(相对于html)。
在参考了《构建之法》第8章的需求分析。将分好象限的功能再按5种办法细分
不做:
程序可以设置皮肤功能,可以改变界面的颜色即可。
维持:
登陆注册
抵消:
程序可以设置答题时间,时间设置为整数,单位为秒,最大不能超过120秒,若超过了答题时间未答题,则提示:时间已到,不能答题。
用户答题结束以后,程序可以显示用户答题所用的时间
用户可以选择出题的个数(最多不能超过5个题目),答题结束可以显示用户答错的题目个数和答对的题目个数
程序可以出带括号的正整数四则运算,支持分数,除法保留两位小数,如:(1/3+1)*2 = 2.67,特别注意:这里是2.67而非2.66
可以出表达式里含有负整数(负整数最小不小于-100)的题目,且负数需要带括号,用户输入的结果不用带括号。如: 2*(-4) = -8
程序可以出单个整数阶乘的题目:如:4!=24
差异化:
无自定义新功能
优化:
具体编码结构上的优化和可拓展性(重点)
三、设计
1.总体结构设计
2.模块设计
总体上分为如上三大块,Window模块中只负责用户的输入输出,将题目委托给SubjectLibrary管理,而SubjectLibrary只负责相应题库题目的生成,不关心题目的计算过程等。最终每一种题型由一个实例构成。
Window UI界面模块详细设计
参考了网页跳转页面的模式,三个panel是相互独立的,逐一添加入 MainFrame 的 panel 内,通过MainFrame的跳转函数实现跳转。
示例如下:
主要函数: goToPanel(String panelName, String message)跳转到指定面板并传消息给该面板
MainFrame mainFrame = new MainFrame(); mainFrame.addPanel(new LoginPanel(mainFrame),"LoginPanel"); mainFrame.addPanel(new UIPanel(mainFrame),"UIPanel"); mainFrame.addPanel(new RegisterPanel(mainFrame), "RegisterPanel"); mainFrame.goToPanel("LoginPanel",null); //跳转到指定面板
SubjectLibrary 题库模块详细设计
题库可以设定题库的题目个数,是否重复,题目类型等,每一道题目都是一个题目对象
构造方法:
SubjectLibrary() 默认构造一个5道题目的题库
SubjectLibrary(int questionNum) 构造一个questionNum道题的题库
SubjectLibrary(String name, int questionNum) 构造一个库名为name的questionNum道题目的题库
常用方法:
void setRepetition(boolean repetition) 设置题库题目是否可以重复
void initLib() 按要求生成题目
void setQuestionNum(int questionNum) 设置题目数目
void setName(String name) 设置题库名字
List<Question> getLib() 返回题库
void registerQuestion(String Type) 注册题目类型
示例
SubjectLibrary test = new SubjectLibrary(5); // 构造题库 test.registerQuestion(FourAirthmetic.questionType); // 注册题目类型 test.registerQuestion(Factorial.questionType); test.initLib(); // 生成题目 for (Question question : test.getLib()) { // 获取题目 System.out.println("题目类型:"+question.getQuestionType()); System.out.println("题目内容:"+question.getQuestion()); System.out.println("题目答案:"+question.getAnswer()); }
效果如下
Question 模块详细设计
我们在设计中想,题库只关心题目的生成和其他操作,并不会具体关心题目的个体差异,无论是阶乘还是四则运算都应该是一种操作,所以我们将二者的共性抽离出,同时考虑到未来题库可能管理的不是是数学类型的题目,所以我们设计了如下结构。
题库只关心Question中的方法,在数学中我们定义了关于边界的设定和计算方法抽象,至于如何实现我们交给了最终类。
最终类具体设计
四、程序运行示例
五、结对过程
这个程序的总体结构是我们在分析组员刘星辰之前的初版四则运算的结构,进行总结,改进设计而来。
在这里不得不佩服结对成员 任荣秀 根据 “要将对于答案的判断这个业务放在题库的生成里,还是调用计算类的方法,最后还是将计算多项式类并到题库生成类中作为一个静态方法。” 提出的新的设计理念
最后在此放上我俩的结对图
总结
在结对编程中,虽逻辑上会有阻碍,但有一种不一样的体会,一个内容的实现不止有两种,团队合作实现项目很有必要,个人完成的情况下会有很大的思维限制。
PSP2.1 | Personal Software Process Stages | Time Senior Student(h) | Time(h) |
Planning | 计划 | 3 | 2 |
· Estimate | 估计这个任务需要多少时间 | 10 | 20 |
Development | 开发 | 8 | 10 |
· Analysis | 需求分析 (包括学习新技术) | 2 | 1 |
· Design Spec | 生成设计文档 | 2 | 1 |
· Design Review | 设计复审 | 1 | 1 |
· Coding Standard | 代码规范 | 0.5 | 1.5 |
· Design | 具体设计 | 4 | 4.5 |
· Coding | 具体编码 | 12 | 13 |
· Code Review | 代码复审 | 1 | 2 |
· Test | 测试(自我测试,修改代码,提交修改) | 1 | 1.5 |
Reporting | 报告 | 1 | 3 |
· | 测试报告 | 0 | 0 |
· | 计算工作量 | 1 | 1 |
· | 并提出过程改进计划 | 0 | 1 |