一、项目Coding.net原码仓库地址:https://git.coding.net/caoying/Teamwork.git
曹滢2016012102
卢琪2016011986
二、PSP表格之时间规划
PSP |
任务内容 |
计划时间(min) |
Planning |
计划 |
30 |
Estimate |
估计这个任务需要多少时间,并规划大致工作步骤 |
30 |
Development |
开发 |
2880 |
Analysis |
需求分析 |
30 |
Design Spec |
生成文档 |
40 |
Design Review |
设计复审 |
20 |
Coding Standard |
代码规范 |
10 |
Design |
具体设计 |
40 |
Coding |
具体编码 |
2000 |
Code Review |
代码复审 |
30 |
Test |
测试 |
30 |
Reporting |
报告 |
180 |
Test Report |
测试报告 |
30 |
Size Measurement |
计算工作量 |
20 |
Postmortem & Process Improvement Plan |
事后总结,并提出过程改进计划 |
30 |
三、接口设计介绍
:即信息隐藏。封装经常与信息隐藏交替使用,可以把信息隐藏作为原理和封装的技术。一个软件模块隐藏信息封装成模块或其他信息构建了一个接口。信息隐藏的一个常见用途是隐藏数据的物理存储布局,如果是改变,改变是限制的总计划的一小部分。面向对象的程序设计,信息隐藏(通过嵌套类型)通过移动代码的降低软件开发的风险附属国在一个不确定的实施(设计)到一个明确的接口。接口的客户端执行的操作完全通过它所以如果实现的变化,客户不必改变。
:即接口设计。接口是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,接口类型可用来声明一个变量可以成为一个空指针,或是被绑定在一个以此接口实现的对象。
设计:调用抽象方法——对抽象类、接口进行。
:即松耦合。松耦合发生在依赖类包含一个指针只有一个接口,然后可以通过一个或多个具体的类实现。依赖类的依赖是一种“合同”指定的接口;定义列表的方法和/或特性,实现类必须提供。任何实现该接口的类可以满足一类依赖的依赖不改变类。这使得在软件设计中的可扩展性;一个新的类实现一个接口可以写在一些或所有的情况下,代替目前的依赖,无需改变依赖类;新老班可自由转换。
设计:减少各模块间的依赖性。
四、计算模块接口的设计及实现
1.类和函数的组成及关系
我们一共用了6个类,一共用了 10个函数。它们的关系是不同的类都包含着不同的函数。
2.函数流程图
4.算法的关键及独到之处
我们算法的关键是利用了不同的监听器来实现各种组件,利用不同的接口来实现函数调用。我们的独到之处是界面模块简洁、功能齐全,算法易懂易理解。
五、计算模块接口的性能改进
1.性能改进思路及时间花费
为确保软件满足或超过设计的期望值,有必要分析应用程序的性能以发现潜在的问题。这个过程被称为“性能分析”。它包括检查应用程序以确保每个组件有效地工作,并根据设计密切注视处理器的使用、网络和系统服务、存储和输入/输出(I/O)。
在运行代码的性能分析中,我们发现资源回收不完全。经过各种调试,我们发现是输入输出流的关系,所以我们关闭输出流、修改了代码。整个过程花费了接近三个小时。
2.性能分析图展示及程序中消耗最大函数
展示图:
程序中消耗最大的函数无疑是包含过程最多、工程量最大的函数。
六、单元测试展示
1.单元测试代码及函数
单元测试的代码:(这里就以算分这个类为例,其余测试类似)
public class CoreTest extends TestCase { public void testNewExpSome() { Core.newExpSome(true, 50, 1, 3); } public void testNewExpAll() { Core.newExpAll(false, 50, 1, 3); } public void testDivideExactly() { Core.divideExactly(48, 8,5); } }
单元测试的函数:(这里就以算分这个类为例,其余测试类似)
2.构造测试数据的思路
我们的思路是从要测试的对象出发:首先,我们有一个生成加减乘除类、有一个可以计算式子并返回结果的类、有一个判断优先级的类;接下来我们就要对它们测试。其次我们还有GUI窗口,因此也要进行测试。
3.测试覆盖率截图
在同学的帮助下,使得我们团队的测试覆盖率达到了97%
如下图:
七、异常处理说明
1.输入数判断是否超范围
这里用try——catch方法来捕获异常:
try { n = Integer.parseInt(n.getText()); if (n<0 || n > 10000) { n.setText("n不在范围内,需重输"); return; } flag0 = 1; } catch (Exception a) { n.setText("n异常,需重输"); }
2.文件处理异常
这里同样用try——catch方法来捕获异常:
try { Ffile = new PrintStream("result.txt"); System.setOut(Ffile); } catch (Exception e) { System.out.println("文件生成错误"); }
八、界面设计过程
1.设计思路
我们要设计各个界面的GUI,就要弄清楚分几个界面、各个界面要包含哪些组件、要实现什么具体的功能。所以我们根据分析,有这些:出题界面GUI的设计、答题界面GUI的设计及文件上传界面GUI的设计。
2.实现过程
首页界面GUI代码:
static class Hello extends JPanel { JLabel title = new JLabel("欢迎来到四则运算小程序!"); JLabel l = new JLabel(); JButton timu = new JButton("生成题目"); JButton finish = new JButton("完成题目");
出题界面GUI代码:
static class InMakeExp extends JPanel{ JLabel timunum = new JLabel("题目数量"); JLabel timulower = new JLabel("数值的下界范围"); JLabel timuupper = new JLabel("数值的上界范围"); JLabel most = new JLabel("运算符最多个数"); JCheckBox chenchu = new JCheckBox("乘除法",false); JCheckBox bracket = new JCheckBox("括号",false); JButton ok = new JButton("提交");
JTextField num = new JTextField(10);
JTextField lower = new JTextField(10);
JTextField upper = new JTextField(10);
JTextField most_ = new JTextField(10); JLabel l = new JLabel();
答题界面GUI代码:
timu = new JLabel("题目:"); timu.setSize(100, 40); timu.setLocation(650, 100); l.add(timu); timu.setVisible(false); daan = new JLabel("答案:"); daan.setSize(100, 40); daan.setLocation(650, 160); l.add(la22); daan.setVisible(false); question = new JTextArea(); question.setSize(150, 30); question.setLocation(700, 100); l.add(question); question.setVisible(false); answer = new JTextArea(); answer.setSize(70, 30); answer.setLocation(700, 160); l.add(answer); answer.setVisible(false); tijiao= new JButton("提交"); tijiao.addActionListener(this); tijiao.setSize(70, 30); tijiao.setLocation(780, 160); tijiao.setFont(new Font("Dialog", 1, 14)); l.add(next); tijiao.setVisible(false); }
文件上传界面GUI代码:
shangchuan= new JButton("上传文件"); shangchuan.addActionListener(this); shangchuan.setFont(new Font("Dialog", 1, 18)); shangchuan.setSize(120, 30); shangchuan.setLocation(515, 140); l.add(upload);
九、界面模块与计算模块的对接
1.对接描述
我们GUI界面与计算模块的对接是通过获取参数,调用方法来实现的。出题时,将题目写入文件,然后文件下载到本地。做题时,上传题目后,将题目和答案封装到list集合中。
2.功能截图
首页:
出题界面:
答题界面:
文件上传截图:
生成题目截图:
做题判断结果:
十、结对过程描述及合照
描述:我是主动找卢琪同学结对的,因为和她很合得来。结对之后,针对我们的结对作业,我们讨论过很多次。最开始我们商量做一个web网页,我负责前端部分、她负责后端部分,后台代码实现用她个人作业的Java代码,并且规划了具体要展示什么、实现什么,然后我们利用课余时间以及假期分别做了各自的部分。这里说明一下,各自分开做是卢琪同学有假期出行,也为我的队友出行还在顾着项目作业点个赞。然而由于我们各自分开做各自的,导致后端和前端的代码合不上,并且问题接临而至,如前端部分不能获取后台数据、没有服务器等等,所以后来我们由协商了一下决定做GUI。但这里还是稍微展示一下我完成的前端部分:
前端构架:
首页:(输入完整后点确定即跳到主页)
主页:(可以计时,做完题目后点提交可判断每题的正确与否,可计算答对题数)
合照:
十一、结对编程的优缺点( )
结对编程的优点:1.两个人有商有量,可以各自分担项目的一半;
2.两个人互相学习,可以相互鼓励增加彼此信心;
3.两个人更有动力,可以促进各自写代码的效率。
结对编程的缺点:1.两个人商量可能会出现意见有分歧;
2.两个人分开完成项目的一部分,可能会导致事倍功半,比如我们之前做web项目却中途进行不下去了;
3.两个人之中有一个更厉害的,那么另一人可能会产生依赖、付出也较少。
我的队友卢琪的优点:1.为人和善,易沟通;2.技术厉害,善于学习;3.做事细致。 缺点:做事太细致,速度稍微有点慢。
我的优点:1.平易近人;2.认真学习;3.虚心请教。 缺点:做事风风火火,不是很细致。
十二、PSP表格之时间记录
PSP |
任务内容 |
完成时间(min) |
Planning |
计划 |
40 |
Estimate |
估计这个任务需要多少时间,并规划大致工作步骤 |
60 |
Development |
开发 |
4320 |
Analysis |
需求分析 |
30 |
Design Spec |
生成文档 |
60 |
Design Review |
设计复审 |
20 |
Coding Standard |
代码规范 |
10 |
Design |
具体设计 |
60 |
Coding |
具体编码 |
3600 |
Code Review |
代码复审 |
40 |
Test |
测试 |
50 |
Reporting |
报告 |
300 |
Test Report |
测试报告 |
50 |
Size Measurement |
计算工作量 |
30 |
Postmortem & Process Improvement Plan |
事后总结,并提出过程改进计划 |
40 |