结对作业-四则运算GUI
目录:
一、项目地址
二、PSP
三、接口设计
四、计算模块接口的设计与实现过程
五、计算模块接口部分的性能改进
六、计算模块部分单元测试展示
七、计算模块部分异常处理说明
八、界面模块的详细设计过程
九、界面模块与计算模块的对接
十、结对过程
十一、结对编程思考
一、项目地址
Coding.Net项目地址:https://git.coding.net/chenq971/arithmetic.git
二、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 |
三、接口设计
1.Information Hiding
信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。好的类接口就像是冰山的尖儿一样,让类的大部分内容都不会暴露出来。在本次项目中,我们把描述对象属性的变量及实现对象功能的方法合在一起,尽心封装,保证外界不能任意更改其内部的属性值,也不能任意调动其内部的功能方法。
2.Interface Design
接口作为数据流通的桥梁,起着举足轻重的作用,直接影响着程序的效率性、稳定性、可靠性以及数据的正确性、完整性。因次,设计接口在一个项目中,是非常重要的。不是随便一个功能就要有个接口,也不是随便一个需求就要加个接口。一个接口只负责一个业务功能,包含完整的业务功能。
3.Loose Coupling
耦合性也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。所以一个接口要包含完整的业务功能,而不同接口之间的业务关联要尽可能的小,就是说一个接口不应该随着另一个变化而变化或以某几个接口为前提而存在。在本次项目中,我们都尽量减少类与类之间传递的数据量,增强他们的独立性。
四、计算模块接口的设计与实现过程

计算模块分开了有乘除和没有乘除的四则运算式生成方法,并调用一个类使得式子可以整除以及除数在正确的范围内。
五、计算模块接口部分的性能改进
由于出题时对题目的结果和运算过程中的部分结果是有要求的,所以这次虽然在出题时不要求给出结果,但还是需要调用计算模块来提供检查功能,每计算一步就对结果进行判断,对不合格的运算式舍弃不用,但是在出现有乘法的时候数字就会成倍变大,导致运算式不可用,对于这个问题我在出题模块内进行了优化,当出现乘法时,尽量缩小乘数,在一定程度上使结果不会超出限定,加快出题速度。
我们在第一次性能分析的基础上做了CPU性能分析,以下是以下是访问树 Call Tree:

下面是热点 Hot Spots视图,显示了消耗时间最多的方法:

下面是内存性能分析图(包含改进后的成果):





六、计算模块部分单元测试展示
1.测试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);
八、界面模块的详细设计过程
1、首先设计一个欢迎页面,并询问用户是要出题还是做题,点击相应的按钮进入不同的功能,同时我们还为项目界面设置了背景,更加美观。
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 = ;
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;
九、界面模块与计算模块的对接
在界面和计算模块的对接过程中,我主要负责的是做题功能。界面模块获取用户的意愿,然后通过判断参数内容调用不同的方法。上传文件题目后,用户输入答案,调用方法验证是否是正确答案,并把正确个数和做题时间存放在变量里。如果用户登录了,那么做题记录会全部保存到一个TXT文件里,这样用户想要查询时,软件就能找到对应的信息了。
以下是本项目的功能截图:
1.欢迎界面,选择功能

相当于主函数,按钮分别调用MakeExp类和Count2_1类
2.出题功能

通过按钮调用Core类和InToPost类
2.做题功能



这个界面没有调用其他的类,调用的方法都在Count2_1类中
十、结对过程

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

结对作业-四则运算GUI的更多相关文章
- 结对作业——四则运算 Part2. 封装与对接相关问题
结对作业——四则运算 Part2. 封装与对接相关问题 PB15061303 刘梓轩PB16061489 艾寅中 GITHUB 地址 戳这里 目录 Part 1. Core代码编写部分Part 2. ...
- 结对作业——四则运算 Part3. 对于结对编程的总结与思考
结对作业——四则运算 Part3. 对于结对编程的总结与思考 PB15061303 刘梓轩PB16061489 艾寅中 GITHUB 地址 戳这里 目录 Part 1. Core代码编写部分 Part ...
- Core 第三组 结对作业——四则运算 Part1. Core代码编写
结对作业——四则运算 Part1. Core代码编写 PB15061303 刘梓轩PB16061489 艾寅中 GITHUB 地址 戳这里 目录 (因为内容较多,分为了三个部分,但作业系统中只能提交一 ...
- 结对项目——四则运算GUI项目
一.项目地址:https://git.coding.net/lvgx/wsz.git 二.PSP: PSP2.1 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min) Plannin ...
- 结对作业--基于GUI的四则运算生成器
组员:201421123015 陈麟凤 201421123019 张志杰 201421123020 黄海鸿 coding 地址 :https://coding.net/u/zhang1995/p/wo ...
- 结对作业-基于GUI的四则运算
一.需求分析 1.题目要求: 我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序.进一步,本次要求把这个程序做成GUI(可以是Windows PC 上的,也可以是Mac.Linux,web ...
- 结对编程作业——四则运算GUI程序
毛忠庆 201421122088 赵嘉楠 201421122065 源代码存放位置:https://gitee.com/ouwen0819/SiZeYunSuan.git 题目描述 使用 -n 参数控 ...
- 结对编程四则运算gui
码市地址:https://git.coding.net/linzhao/sizeyunsuangui.git 林 钊 -- 201421123105 吴世荣 -- 201421123119 王坤彬 - ...
- 结对编程-四则运算-GUI
201421123022 王若凡 201421123026 欧阳勇 https://git.coding.net/ttoyy/sizeyunsuan-GUI.git a.需求分析: ...
随机推荐
- 单片机、CPU、指令集和操作系统的关系
郑重声明:转载自http://blog.csdn.net/zhongjin616/article/details/18765301 1> 首先讨论各种单片机与操作系统的关系 说到单片机,大家第一 ...
- 为eclipse添加源代码
看到这个页面,直接点击 红色区域 attach source 关联源代码,进入到如下页面: 点击第二个选择外部的路径,点击导入文件夹,也就是解压出来的src文件夹(不建议直接导整个jar包,虽然也可以 ...
- python+soket实现UDP协议的局域网广播程序
# udp_gb_server.py '''服务端(UDP协议局域网广播)''' import socket s = socket.socket(socket.AF_INET, socket.SOCK ...
- LOJ #2473. 「九省联考 2018」秘密袭击
#2473. 「九省联考 2018」秘密袭击 链接 分析: 首先枚举一个权值W,计算这个多少个连通块中,第k大的数是这个权值. $f[i][j]$表示到第i个节点,有j个大于W数的连通块的个数.然后背 ...
- OpenStack入门篇(二十二)之实现阿里云VPC的SDN网络
1.修改/etc/neutron/neutron.conf配置 [root@linux-node1 ~]# vim /etc/neutron/neutron.conf [defalut] ... co ...
- 微信小程序:选项卡页面切换
一.功能描述 在同一个页面内实现不同展示页面的切换功能,如下图所示 二.代码实现 1. index.js Page({ /** * 页面的初始数据 */ data: { currentData : 0 ...
- 爬虫-设置代理ip
1.为什么要设置代理ip 在学习Python爬虫的时候,经常会遇见所要爬取的网站采取了反爬取技术导致爬取失败.高强度.高效率地爬取网页信息常常会给网站服务器带来巨大压力,所以同一个IP反复爬取同一个网 ...
- SSIS 控制流和数据流
在SSIS的体系结构中,Package是SSIS的最重要的部分,从本质上来讲,Package是一个有序地执行任务的单元.Package的核心是控制流(Control Flow),用于协调包中所有组件的 ...
- css快速入门-引入方式
一.概述 HTML是骨架.框架CSS是外表.衣服JS是动作.肌肉 css的主要作用是对元素进行渲染.1.找到要操作的标签(选择器)2.对定位的标签进行操作(属性) 二.CSS引入方式 1.行内式 &l ...
- php js css加载合并函数 宋正河整理
<?php //php js css加载合并函数 宋正河整理 //转载请注明出处 define('COMBINE_JS',true); define('COMBINE_CSS',true); ...