结对作业博客
结对作业博客
Coding.Net项目地址:https://git.coding.net/liuseshz/Pairwork1.git
目录
一、组队成员
二、PSP表格
三、接口设计
四、计算模块接口的设计与实现过程
五、计算模块接口部分的性能改进
六、计算模块部分单元测试展示
七、计算模块部分异常处理说明
八、界面模块的详细设计过程
九、界面模块与计算模块的对接
十、结对的过程
十一、结对编程的优点和缺点
十二、实际PSP表格
一、组队成员
管凌波 2016012026 裴颖 2016012051
二、预计PSP表格
PSP |
任务内容 |
计划时间(min) |
Planning |
计划 |
30 |
Estimate |
估计这个任务需要多少时间,并规划大致工作步骤 |
30 |
Development |
开发 |
800 |
Analysis |
需求分析 |
20 |
Design Spec |
生成文档 |
10 |
Design Review |
设计复审 |
10 |
Coding Standard |
代码规范 |
10 |
Design |
具体设计 |
20 |
Coding |
具体编码 |
640 |
Code Review |
代码复审 |
30 |
Test |
测试 |
60 |
Reporting |
报告 |
30 |
Test Report |
测试报告 |
10 |
Size Measurement |
计算工作量 |
10 |
Postmortem& ProcessImprovement Plan |
事后总结, 并提出过程改进计划 |
10 |
三、接口设计
- Information Hiding
即信息隐藏,是结构化设计与面向对象设计的基础。
在我们的代码设计中,也有信息隐藏原理的体现:①模块化设计,一定程度上满足相对独立性,互换性及通用性,可以对模块单独进行操作,更易满足不同的需求;②通过面向对象的封装,只可以调用方法,不可以改变内部变量,对外只提供一个简单的函数接口,所有访问都是通过访问函数实现的,模块的内部结构外部不可见;③用具名常量代替字面常量等。
- Interface Design
即接口设计,通过对《构建之法》的阅读以及几篇优秀博客的借鉴[1][2][3],虽然有很多原则我们不能完全实现,但我们也尽量来满足这些原则:①接口的命名上做到规范、优雅;②设计接口来处理比较简单的事情,以保证其单一性;③接口参数尽量用简单的类型;④综合考虑接口的拓展性,尽量做到可复用。
- Loose Coupling
即低耦合,简单地说就是一部分代码的使用和修改影响到其他部分的代码尽可能的少,因此我们进行了模块化设计与编程,比如运算界面和结果界面相对较独立,尽量做到了低耦合度。
四、计算模块接口的设计与实现过程
我们使用了按钮监听器、复选框监听器以及文件监听器。
下面是计时器的代码。
now.setHours(0);
now.setMinutes(0);
now.setSeconds(0);
final Timer timer = new Timer(1000, new ActionListener() {
public void actionPerformed(ActionEvent e) {
Date now2 = new Date(now.getTime() + 1000);
now = now2;
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
lbl.setText(formatter.format(now));
}
});
timer.start();
五、计算模块接口部分的性能改进
在改进计算模块时,我们按运算符数不同分成不同的类,在计算时也不会像把所有种类运算结合在一起时那样容易出错了。
刚开始的性能分析提示我有资源没有回收,于是对消耗最大的部分进行了优化改进,并且对文件进行关闭。按F4再一次查看后,内存占用率明显减少。
六、计算模块部分单元测试展示
展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路。并将单元测试得到的测试覆盖率截图,发表在博客中。只需要测试命令行部分,且该部分覆盖率到90%以上,否则单元测试部分视作无效。
七、计算模块部分异常处理说明
1.对输入出题数、运算符个数、范围等进行,判断其是否合法
if (jtf == false) {
System.out.println("请输入题目数量");
} else if (jtf == false) {
System.out.println("输入的参数中必须包含对题目数值上下界的设定,请重新输入");
}
2.
try {
BufferedReader br = new BufferedReader(new FileReader(file));
try {
while((line = br.readLine()) != null){
String[] num = +++line.split("#");
zheng1=Integer.parseInt(num[1]);
cuo1=Integer.parseInt(num[3]);
}} catch (IOException ex) {
Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
}
} catch (FileNotFoundException ex) {
keep();
}
3.
try {
if (fop != null) {
fop.close();
}
} catch (IOException e) {
e.printStackTrace();
}
4.对结果进行判断
if(jb2[i].getText().equals("正确")||jb2[i].getText().equals("正確")||jb2[i].getText().equals("right"))
jb2[i].setText("正确");
else
jb2[i].setText("错误,答案是:"+strarr[3*i+2]);
}
八、界面模块的详细设计过程
- 界面模块设计思路
- 实现过程
①语言选择:
mi1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jlb.setText("请输入生成的题目数量:");
jtf.getText();
jb.setText("生成题目");
}
});
Mi2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jlb.setText("please input the number of questions you want:");
jtf.getText();
jb.setText("generate tests");
}
});
②输出做完的题目
jbt.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
File file = new File("D:/newfile.txt");
String line =null;
try {
BufferedReader br = new BufferedReader(new FileReader(file));
try {
while((line = br.readLine()) != null){
String[] num = line.split("#");
zheng1=Integer.parseInt(num[1]);
cuo1=Integer.parseInt(num[3]);
}} catch (IOException ex) {
Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
}
} catch (FileNotFoundException ex) {
keep();
}
keep();
}
private void keep() {
FileOutputStream fop = null;
File file;
String content = "正确#"+(n-MainFrame.cuowu+zheng1)+"#错误#"+(MainFrame.cuowu+cuo1)+"#";
try {
file = new File("D:/newfile.txt");
fop = new FileOutputStream(file);
if (!file.exists())
{
file.createNewFile();
}
byte[] contentInBytes = content.getBytes();
fop.write(contentInBytes);
fop.flush();
fop.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fop != null)
{
fop.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
九、界面模块与计算模块的对接
详细地描述UI模块的设计与两个模块的对接,并在博客中截图实现的功能。
- 语言选择功能
通过按钮监听器实现中英文的选择
2.出题界面
3.答题界面及计时
4.判断结果是否正确并输出答题时间
5.将答题的正确数与错误数输出
十、结对的过程及照片
本次结对是自由组队的,原本我们想做页面比较优美的网页版,但是由于我们所掌握的技术有限,最终还是选择了GUI来实现。在整个过程中,我们都很积极主动地学习,做任务,并且主动为对方提供方便,自己来包揽部分。最后的测试及博客的一部分也是有我们两人共同完成的。总的来说这次组队还算不错,在更加了解了一位同学的同时也学习到了很多东西,很有意义。
十一、编程的优点和缺点
- 结对编程的优点
①程序员互相帮助,互相教对方,可以得到能力上的互补;
②增强代码和产品质量,并有效的减少BUG;
③降低学习成本。一边编程,一边共享知识和经验,有效地在实践中进行学习;
④在编程中,相互讨论,可能更快更有效地解决问题。
- 结对编程的缺点
①对于有不同习惯的编程人员,在一起工作会产生麻烦,甚至矛盾;
②两个人在一起工作可能会出现工作精力不能集中的情况;
③不合适的沟通会导到团队的不和谐,最终导致项目进展效率低下。
- 我们的优、缺点
管凌波
①优点:比较有耐心,沉稳、乐于思考
②缺点:积极性不高
裴颖
①优点:思想活跃、性格比较活泼、乐观
②缺点:做事容易拖延
十二、实际PSP表格
在你实现完程序之后,在附录提供的PSP表格记录下你在程序的各个模块上实际花费的时间。
PSP |
任务内容 |
完成时间(min) |
Planning |
计划 |
20 |
Estimate |
估计这个任务需要多少时间,并规划大致工作步骤 |
20 |
Development |
开发 |
1500 |
Analysis |
需求分析 |
20 |
Design Spec |
生成文档 |
20 |
Design Review |
设计复审 |
10 |
Coding Standard |
代码规范 |
10 |
Design |
具体设计 |
40 |
Coding |
具体编码 |
1100 |
Code Review |
代码复审 |
60 |
Test |
测试 |
240 |
Reporting |
报告 |
31 |
Test Report |
测试报告 |
8 |
Size Measurement |
计算工作量 |
8 |
Postmortem& ProcessImprovement Plan |
事后总结, 并提出过程改进计划 |
15 |
十三、附录
[1] 接口设计的 16 个原则
https://blog.csdn.net/gitchat/article/details/78705978
[2] 面向对象设计原则
http://www.cnblogs.com/vaiyanzi/p/6877436.html
[3] 接口设计原则
https://blog.csdn.net/zf0512305/article/details/51200996