目录:
一、项目地址
二、PSP
三、接口设计
四、计算模块接口的设计与实现过程
五、计算模块接口部分的性能改进
六、计算模块部分单元测试展示
七、计算模块部分异常处理说明
八、界面模块的详细设计过程
九、界面模块与计算模块的对接
十、结对过程
十一、结对编程思考
一、项目地址
PSP |
任务内容 |
计划时间(min) |
完成时间(min) |
Planning |
计划 |
30 |
60 |
Estimate |
估计这个任务需要多少时间,并规划大致工作步骤 |
30 |
60 |
Development |
开发 |
1000 |
3080 |
Analysis |
需求分析 |
60 |
120 |
Design Spec |
生成文档 |
30 |
30 |
Design Review |
设计复审 |
30 |
20 |
Coding Standard |
代码规范 |
10 |
10 |
Design |
具体设计 |
30 |
40 |
Coding |
具体编码 |
720 |
2500 |
Code Review |
代码复审 |
60 |
210 |
Test |
测试 |
60 |
150 |
Reporting |
报告 |
55 |
100 |
Test Report |
测试报告 |
30 |
60 |
Size Measurement |
计算工作量 |
10 |
20 |
Postmortem& ProcessImprovement Plan |
事后总结, 并提出过程改进计划 |
15 |
20 |
更改其内部的属性值,也不能任意调动其内部的功能方法。
计算模块分开了有乘除和没有乘除的四则运算式生成方法,并调用一个类使得式子可以整除以及除数在正确的范围内。
由于出题时对题目的结果和运算过程中的部分结果是有要求的,所以这次虽然在出题时不要求给出结果,但还是需要调用计算模块来提供检查功能,每计算一步就对结果进行判断,对不合格的运算式舍弃不用,但是在出现有乘法的时候数字就会成倍变大,导致运算式不可用,对于这个问题我在出题模块内进行了优化,当出现乘法时,尽量缩小乘数,在一定程度上使结果不会超出限定,加快出题速度。
我们在第一次性能分析的基础上做了CPU性能分析,以下是以下是访问树 Call Tree:
下面是热点 Hot Spots视图,显示了消耗时间最多的方法:
下面是内存性能分析图(包含改进后的成果):
测试Core类(包含newExpSome,newExpAll,divideExactly)
在测试Core类中的函数时,我模拟了在实际应用时会出现的情况,结合更大限度地覆盖更多代码这一目标,我设计了多组参数,期望能覆盖到各种情况。通过多次进行单元测试,将多次单元测试结合起来,达到了97%。
设计思路:
(1)改变运算符个数的上限:由于运算符个数不同产生括号的代码不同,所以增加情况个数能够覆盖更多代码。
(2)设置是否有括号和乘除。
(3)增加运算次数:这样在使用随机数的函数中能出现更多的情况,覆盖更多的代码,走通一些异常处理代码。
2.测试Command类(包含main和write方法)
设计思路:
(1)测试main方法:
在main方法中实现了对输入参数的解析和对输入参数异常的报错,所以测试这个部分的函数最主要的就是构造不同的异常情况,同时也不要忘记测试参数正确时的情况,因为这也是代码的一部分(单元测试中第一次就是因此覆盖率较低)。
(2)测试write方法
在write方法中主要实现了将传入的ArrayList分行写入文件,所以测试这个部分的思路就是:在测试方法中构造一个ArrayList,向里面传入一些值,然后以它为参数传入到write方法中,通过输出结果判定是否成功执行。
以下为各参数会出现的异常:
1.出题数量:出题数量范围错误;出题数量输入值不是数字;未输入出题数量。
单元测试样例:
String[] args1 = {“-n”,”-20”} Command.main(args1); String[] args2 = {“-n”,”a”} Command.main(args2); String[] args3 = {“-b”,”-c”} Command.main(args3);
2.运算符上限:上限范围错误;输入值不是数字。
单元测试样例:
String[] args1 = {“-o”,”20”} Command.main(args1); String[] args2 = {“-o”,”a”} Command.main(args2);
3.数值范围:上下界范围错误;上下界输入不是数字;下界大于上界。
单元测试样例:
String[] args1 = {“-m”,”-20”,”2000”} Command.main(args1); String[] args2 = {“-m”,”a”,”b”} Command.main(args2); String[] args3 = {“-m”,”40”,”20”} Command.main(args3);
4.输入的参数不是规定的参数格式,如输入“-”、“-x”等作为参数。
单元测试样例:
String[] args1 = {“-x”}
Command.main(args1);
JLabel title = new JLabel("欢迎使用四则运算软件,您是要:"); JButton make = new JButton("出题");//出题按钮 JButton ans = new JButton("做题");//做题按钮 JLabel l = new JLabel();
Icon icon = new ImageIcon("3.jpg"); //页面背景 l.setIcon(icon); add(l);
2.如果用户点击了出题按钮,就会跳转到出题界面。出题界面仔细询问用户的各个需求,例如题目数量、数值范围、有无括号等等。用户点击提交按钮即可在桌面上生成名为result.txt的四则运算文件。
JLabel num = new JLabel("题目数量(必填)"); JLabel lower = new JLabel("数值范围(下界)"); JLabel upper = new JLabel("数值范围(上界)"); JLabel num_op = new JLabel("最多有几个运算符"); JTextField theNum = new JTextField(10); JTextField theLower = new JTextField(10); JTextField theUpper = new JTextField(10); JTextField theNum_op = new JTextField(10); JCheckBox mul_de = new JCheckBox("乘除法",false); JCheckBox bracket = new JCheckBox("括号",false); JButton ok = new JButton("提交"); JLabel l = new JLabel();//页面背景
3.如果用户点击了做题按钮,就会跳转到做题界面。这个界面大致又可以分为三块,用户登录、上传文件以及做题。用户可以选择不登录,直接上传文件做题,但是登陆后可以记录他每次的成绩,并且查询最好成绩和最高正确率。
(1)用户登录,包含用户名、密码和登录、退出按钮。同时我还在页面上提示了登录做题与不登录的区别,用户自己选择。
JPanel pa; JLabel la11;//用户登录标签 JLabel la; // 标题标签 JLabel la1; // 用户名标签 JLabel la2; // 密码标签 JTextField f1; // 用户名输入 JTextField f2; // 密码输入 JLabel la3;// 说明标签 JLabel la4;// 说明标签 JButton login; // 登录按钮 JButton logout;//退出按钮
(2)上传文件,包含上传文件和开始做题按钮,还输出了整个文件的内容
JButton upload;// 上传文件按钮 TextArea doExpre; // 做题文本框 JButton start; // 开始做题按钮 // 上传文件 int reslut = 0; File file = null; String path = null; Component chatFrame = null; JFileChooser fileChooser = new JFileChooser();
(3)如果没有登录用户,只能一道道做题,最后停止查看本次的正确个数;如果登录了,可以查看做题记录和最好成绩。
JButton stop; // 停止做题按钮 JButton best;// 记录成绩按钮 JButton good;//最好成绩 // 做题 JTextArea question; JTextArea answer; TextArea fina; // 最后结果 JLabel la21; JLabel la22; JButton next; int[] correctGood; double[] correctTime; // 时间 long startTime; long endTime;
相当于主函数,按钮分别调用MakeExp类和Count2_1类
2.出题功能
通过按钮调用Core类和InToPost类
2.做题功能
这个界面没有调用其他的类,调用的方法都在Count2_1类中
结对编码作为最近流行的编程方式,有不少的优点。第一,结对编码 的方式是两名程序开发人员一个扮演驾驶者的角色,进行代码编写,另一个扮演观察员的角色,对代码进行评测。这就使得代码的正确率大大提高,增强代码的质量。第二, 结对编程会使两个人都会发现自己平时没有注意到的地方,相互讨论,可以更快更有效地解决问题和发现自身的不足,从而提高了双方的编码能力。第三,和团队编程相比,结对编程只有两人,想法交流更加迅速,编写速度更快,编程效率更高。
然而,在面对一些问题时,双方可能有不同的看法,容易产生分歧,造成不必要的时间内耗。如果两名开发人员的能力相差过大,可能造成想法上沟通不畅发生争执,不利于团队和谐。或者造成代码基本都是由一方完成,而另一方就是享受成果的局面。
在本次编程中开始由于我们两人从未接触过这种编程方式,所以不熟悉各自的职责,导致了一些小的问题,但是经过一段时间的磨合,我们的配合逐渐合拍了起来,,渐渐也体会到了结对编程的好处,就是编程完成后两个人就都理解了代码,不会像之前一样只理解自己写的代码,同时也省去了将两个人代码整合的步骤;而且在编程过程中对于一些问题两个人可以得出更好的结论,就直接优化了代码,减少了后续的工作量;两个人一起编程也可以相互监督,减少开小差的几率,提高工作效率。
吕晓真:
规划项目进度,思路清晰
代码规范,格式简洁,便于阅读
细心,可以发现程序中隐藏的问题
算法欠佳,有时会导致代码过长
陈琦:
注重细节,善于优化程序的代码
对代码的理解能力强
态度积极,不懒散
耐心欠佳,在解决不了问题时会变得急躁