目录:
一、项目地址二、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类中
结对编码作为最近流行的编程方式,有不少的优点。第一,结对编码 的方式是两名程序开发人员一个扮演驾驶者的角色,进行代码编写,另一个扮演观察员的角色,对代码进行评测。这就使得代码的正确率大大提高,增强代码的质量。第二, 结对编程会使两个人都会发现自己平时没有注意到的地方,相互讨论,可以更快更有效地解决问题和发现自身的不足,从而提高了双方的编码能力。第三,和团队编程相比,结对编程只有两人,想法交流更加迅速,编写速度更快,编程效率更高。
然而,在面对一些问题时,双方可能有不同的看法,容易产生分歧,造成不必要的时间内耗。如果两名开发人员的能力相差过大,可能造成想法上沟通不畅发生争执,不利于团队和谐。或者造成代码基本都是由一方完成,而另一方就是享受成果的局面。在本次编程中开始由于我们两人从未接触过这种编程方式,所以不熟悉各自的职责,导致了一些小的问题,但是经过一段时间的磨合,我们的配合逐渐合拍了起来,,渐渐也体会到了结对编程的好处,就是编程完成后两个人就都理解了代码,不会像之前一样只理解自己写的代码,同时也省去了将两个人代码整合的步骤;而且在编程过程中对于一些问题两个人可以得出更好的结论,就直接优化了代码,减少了后续的工作量;两个人一起编程也可以相互监督,减少开小差的几率,提高工作效率。
吕晓真:规划项目进度,思路清晰代码规范,格式简洁,便于阅读细心,可以发现程序中隐藏的问题算法欠佳,有时会导致代码过长陈琦:
注重细节,善于优化程序的代码对代码的理解能力强态度积极,不懒散耐心欠佳,在解决不了问题时会变得急躁