结对项目作业GUI
一.Coding.Net项目地址:https://git.coding.net/zhengsh589/CoupleProject.git
二.PSP表格(完成前):
PSP |
任务内容 |
计划共完成需要的时间 |
Planning |
计划 |
一周 |
Estimate |
估计这个任务需要多少时间,并规划大致工作步骤 |
一周 |
Development |
开发 |
4天 |
Analysis |
需求分析 (包括学习新技术) |
3.5(h) |
Design Spec |
生成设计文档 |
2(h) |
Design Review |
设计复审 (和同事审核设计文档) |
1(h) |
Coding Standard |
代码规范 (为目前的开发制定合适的规范) |
1(h) |
Design |
具体设计 |
1h |
Coding |
具体编码 |
2天 |
Code Review |
代码复审 |
1(h) |
Test |
测试(自我测试,修改代码,提交修改) |
2(h) |
Reporting |
报告 |
2h |
Test Report |
测试报告 |
1.5h |
Size Measurement |
计算工作量 |
30min |
Postmortem & Process Improvement Plan |
事后总结, 并提出过程改进计划 |
30min |
三.结对编程对接口的设计:
在网上查阅了有关于其它资料中关于Information Hiding, Interface Design, Loose Coupling,我了解到以下关于它们的信息:
Information Hiding信息隐藏:信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。
Interface Design接口设计:是传统的后勤保障的一种要素也是一种后勤功能,而面向接口编程是软件工程领域常用的设计手段。
Loose Coupling松耦合:系统通常是基于消息的系统,此时客户端和远程服务并不知道对方是如何实现的。客户端和服务之间的通讯由消息的架构支配。只要消息符合协商的架构,则客户端或服务的实现就可以根据需要进行更改,而不必担心会破坏对方。
我们的想法和设计:对于模块化设计和界面化设计,我们并不需要知道界面内部如何运行,而我们只利用这些方法对接口设计为只需要调用方法和实现接口就可以,有访问都是通过访问函数实现的。
对于模块化设计,我们在关于界面生成,输入输出,生成题目,计算结果,优先级顺序和互换等方面也都是分开的,互相独立的。
四.模块接口的设计与实现过程:
我们的代码有以下类:Calculate,Command,Create,FileOutPrint,FileRead,MainExp这几个类,Calculate里面包含加减乘除计算结果,Command是控制题目数量还有操作数范围的等等的限制的条件,如按钮和面板控制,等等。Create里面则是生成随机数以及判断算术符优先顺序的方法priority(判断优先级的方法)等,FileOutPrin还有FileRead包括测试的部分,MainExp里面则包含操作符的生成以及算术的范围限制。
以下是我做的一部分代码:
1. 检查用户的答案并计算正确题数:
public void checkAnswer() {
double result = 0;
double userInput = 0;
for (int i = 0; i < answer.size(); i++) {
if (tfUserAns.get(i).getText().trim().equals("")) {
userInput = 1;
result = 0;
} else {
userInput = Double.parseDouble(tfUserAns.get(i).getText().trim());
result = Double.parseDouble(answer.get(i).trim());
}
hint.get(i).setVisible(true);
// 回答正确的话:
if (result - userInput == 0) {
hint.get(i).setText("√");
rightNumber++;
} else {
// 回答错误的话:
wrongNumber++;
}
}
}
2. 出题的题条件判断,限制输入的条件:
private void addContToMenu(JPanel menuPanel, final JScrollPane scrollPane, final JPanel resultPanel) {
JButton but1 = new JButton("提交");
JPanel tfPanel1 = new JPanel();
final JTextField tf1 = new JTextField(" ");
tfPanel1.setLayout(new BorderLayout(5, 0));
tfPanel1.add(new JLabel("请输入题目数量:"), BorderLayout.WEST);
tfPanel1.add(tf1, BorderLayout.CENTER); JPanel tfPanel2 = new JPanel();
final JTextField tf2 = new JTextField(" ");
tfPanel2.setLayout(new BorderLayout(5, 0));
tfPanel2.add(new JLabel("请输入操作数的最大值:"), BorderLayout.WEST);
tfPanel2.add(tf2, BorderLayout.CENTER); JPanel tfPanel3 = new JPanel();
final JTextField tf3 = new JTextField(" ");
tfPanel3.setLayout(new BorderLayout(5, 0));
tfPanel3.add(new JLabel("是否有乘除(1为是,0为否):"), BorderLayout.WEST);
tfPanel3.add(tf3, BorderLayout.CENTER);
3.计算算数符优先顺序
public static void priority (int m){
int counter = 0; //乘除计数器
int c = 0;
for(int h = 0;h<m;h++){
if(counter == 0){
if(yunsuan.get(h).equals("x")||yunsuan.get(h).equals("÷")){
if(h == 0){
priorityTemp [h] =h;
}
else if(h ==1){
c = priorityTemp[0];
priorityTemp[0] = h;
priorityTemp[h] = c;
}
//将a冒泡到第一个位置
else{
priorityTemp[h] = priorityTemp[1];
priorityTemp[1] = priorityTemp[0];
priorityTemp[0] = h;
}
counter ++;
}
else{
priorityTemp[h] = h;
}
}
else if(counter ==1){
if(yunsuan.get(h).equals("x")||yunsuan.get(h).equals("÷")){
if(h == 1){
priorityTemp[h] = h;
}
五.模块接口部分的性能改进:
我们用JProfiler做的效能分析:
匆匆忙忙地完成作业,未能有充裕时间优化性能,深表遗憾~~
六.模块部分单元测试展示:
单元测试的覆盖率截图:这一部分是我的队友测试的,他用jacoco测试覆盖率的。
将程序运行后得到下面的代码覆盖率图:
代码的指令覆盖率达到了97%,但是因为我们用了很多if语句,所以分支覆盖率降到了81%。
七.模块部分异常处理说明:
我们没有设计异常目标。。。
八.界面模块的详细设计过程:
考虑到界面模块设计方面,我们主要是先将设置布局管理器,将界面的布局确定好。
// 设置布局管理器
setLayout(new BorderLayout(15, 15)); JPanel menuPanel = new JPanel();
JScrollPane scrollPane = new JScrollPane();
JPanel resultPanel = new JPanel(); jlTime.setForeground(Color.blue); 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");
jlTime.setText("耗时:" + formatter.format(now));
}
}); resultPanel.setVisible(false);
addContToMenu(menuPanel, scrollPane, resultPanel);
addContToResult(resultPanel); this.add(menuPanel, BorderLayout.NORTH);
this.add(scrollPane, BorderLayout.CENTER);
this.add(resultPanel, BorderLayout.SOUTH); }
将题目数量和其他判断条件加入菜单面板,包括输入题目数量等等。
// 将控件加入菜单面板
private void addContToMenu(JPanel menuPanel, final JScrollPane scrollPane, final JPanel resultPanel) {
JButton but1 = new JButton("提交");
JPanel tfPanel1 = new JPanel();
final JTextField tf1 = new JTextField(" ");
tfPanel1.setLayout(new BorderLayout(5, 0));
tfPanel1.add(new JLabel("请输入题目数量:"), BorderLayout.WEST);
tfPanel1.add(tf1, BorderLayout.CENTER); JPanel tfPanel2 = new JPanel();
final JTextField tf2 = new JTextField(" ");
tfPanel2.setLayout(new BorderLayout(5, 0));
tfPanel2.add(new JLabel("请输入操作数的最大值:"), BorderLayout.WEST);
tfPanel2.add(tf2, BorderLayout.CENTER); JPanel tfPanel3 = new JPanel();
final JTextField tf3 = new JTextField(" ");
tfPanel3.setLayout(new BorderLayout(5, 0));
tfPanel3.add(new JLabel("是否有乘除(1为是,0为否):"), BorderLayout.WEST);
tfPanel3.add(tf3, BorderLayout.CENTER);
设置监听按钮,提交按钮做了三件事:时间暂停,计算本次正确率,计算总的正确率,在按提交键之后将题目输入到界面并开始计时。
// 设置按钮监听,按钮主要做这几件事:1.开始计时 2.调用mainExp类生成题目,3.结果面板设为可见,4.数据初始化
but1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
clearAll();
now.setHours(0);
now.setMinutes(0);
now.setSeconds(0);
timer.start();
// 获得生成的题目list,赋给question的list中
mainExp createExercise = new mainExp();
createExercise.createEquation(Integer.parseInt(tf1.getText().trim()),
Integer.parseInt(tf2.getText().trim()),Integer.parseInt(tf3.getText().trim()));
Command.this.setQuestion(createExercise.getQuestion());
Command.this.setAnswer(createExercise.getAnswer());
Command.this.addContToMain(scrollPane);
resultPanel.setVisible(true);
resultPanel.validate(); }
});
menuPanel.add(tfPanel1);
menuPanel.add(tfPanel2);
menuPanel.add(tfPanel3);
menuPanel.add(but1);
menuPanel.add(jlTime); }
九.界面模块与计算模块的对接:
如何让界面模块与计算模块二者之间对接呢?我们主要的想法是可以通过生成gui界面,用户可以根据自己的要求输入想要的条件,然后后台接受到数据,生成算式并传送到界面,以下是图片展示:
十.描述结对的过程及其图片展示:
1.结对过程
我们的结对主要分为两个阶段,前一阶段主要是对主要框架的构思和对模块,界面等等的思考与设计阶段,并且参考与学习必要运用的那些知识,以及对项目作业要求的仔细阅读与审查,讨论哪些方面可以被实现,哪些方面可以实现的更好。第二阶段主要是分工负责各个部分的代码主要实现,对于命名规则等等,一开始没有统一,造成了麻烦,后来在沟通之下才最终意见一致,由于做的比较晚,比较匆忙,有一些本来设计中的没有实现,有些遗憾,细节处理的并不是很细致,但对我们来说已经殊为不易了。
2.结对照片展示
十一.说明结对编程的优点和缺点:
1.结对编程的优缺点
优点:是一次很好的团队合作的过程,从各个方面锻炼了两个人的合作以及两人的沟通交流能力。两个人之间可以相互交流学习,并且互相启发灵感,从而互相取长补短。在后期阶段共同完成项目时,充分地体现了1+1大于2的作用,顺利的完成任务。
缺点:前期磕磕绊绊,互相不熟悉,因此犯错频繁,极大地拖延了项目完成的时间。两个人初时沟通可能存在一些问题,对对方的想法理解的不好,导致了自己代码方面的一些错误,之后花了不少时间去纠正。
2.个人优点
郑书鸿 优点:(1)耐心,对于问题出现是先去解决,而不是拖延。
(2)比较专注,能够静下心来解决一些使人烦躁的问题。
(3)做自己力所能及的事情,比较有责任心。
缺点:编程能力不高,对模块化和界面设计等内容不怎么了解,往往花费大量时间在查看代码错误上。
师浩然 优点:(1)对java学习能力强,对于不会的内容看过几遍就掌握了。
(2)编程熟练度较高,对java知识理解深,能够实现项目主要要求。
(3)看问题比较透彻,能抓住项目要求中的一些关键要点并且对其有较强的执行力。
缺点:代码规范方面还存在一些问题,不够规范。
十二.PSP图(完成后):
PSP |
任务内容 |
计划共完成需要的时间 |
实际完成需要的时间 |
Planning |
计划 |
一周 |
一周 |
Estimate |
估计这个任务需要多少时间,并规划大致工作步骤 |
一周 |
一周 |
Development |
开发 |
4天 |
4天 |
Analysis |
需求分析 (包括学习新技术) |
3.5(h) |
3(h) |
Design Spec |
生成设计文档 |
2(h) |
2(h) |
Design Review |
设计复审 (和同事审核设计文档) |
1(h) |
1(h) |
Coding Standard |
代码规范 (为目前的开发制定合适的规范) |
1(h) |
40min |
Design |
具体设计 |
1h |
35min |
Coding |
具体编码 |
2天 |
2天 |
Code Review |
代码复审 |
1(h) |
1(h) |
Test |
测试(自我测试,修改代码,提交修改) |
2(h) |
2(h) |
Reporting |
报告 |
2h |
1.5h |
Test Report |
测试报告 |
1.5h |
1h |
Size Measurement |
计算工作量 |
30min |
30min |
Postmortem & Process Improvement Plan |
事后总结, 并提出过程改进计划 |
30min |
20min |
结对项目作业GUI的更多相关文章
- BUAA软工-结对项目作业
结对项目作业 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 结对项目作业 我在这个课程的目标是 通过这门课锻炼软件开发能力和经验,强化与他人合作 ...
- BUAA 2020 软件工程 结对项目作业
Author: 17373051 郭骏 3.28添加:4.计算模块接口的设计与实现过程部分,PairCore实现的细节 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) ...
- BUAA 软工 结对项目作业
1.相关信息 Q A 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 结对项目作业 我在这个课程的目标是 系统地学习软件工程开发知识,掌握相关流程和技术,提升 ...
- BUAA软件工程结对项目作业
BUAA软件工程结对项目 小组成员:16005001,17373192 1.教学班级和项目地址 项目 内容 这个作业属于哪个课程 博客园班级连接 这个作业的要求在哪里 结对项目作业 我在这个课程的目标 ...
- 结对项目——四则运算GUI项目
一.项目地址:https://git.coding.net/lvgx/wsz.git 二.PSP: PSP2.1 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min) Plannin ...
- 结对项目作业报告——四则运算web项目
成员:顾思宇2016011993 程羚2016012050 1.仓库地址:https://git.coding.net/DandelionClaw/WEB_Calculator.git 注: 本项 ...
- BUAA_2020_软件工程_结对项目作业
项目 内容 这个作业属于哪个课程 班级博客 这个作业的要求在哪里 作业要求 我在这个课程的目标是 掌握软件工程的思路方法 这个作业在哪个具体方面帮助我实现目标 学习结对编程 教学班级 006 项目地址 ...
- 四则运算结对项目之GUI
本次结对编程让我学到了许多许多知识,受益匪浅!在此之前,我没想过我能做出一个双击运行的小程序. 感谢我的队友与我同心协力,感谢室友宇欣告诉我操作符为“最多多少”而不是“多少”并教我使用效能分析工具,感 ...
- BUAA2020软工作业(四)——结对项目
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 结对项目作业 我在这个课程的目标是 进一步提高自己的编码能力,工程能力,团队协作能力 这个作业在哪 ...
随机推荐
- 【数据结构与算法】001—栈与队列(Python)
栈与队列 1.栈(stacks)是一种只能通过访问其一端来实现数据存储与检索的线性数据结构,具有后进先出(last in first out,LIFO)的特征 2.队列(queue)是一种具有先进先出 ...
- Source Insight 创建工程(linux-2.6.22.6内核源码)
1. 软件设置 安装完Source Insight,需要对其进行设置添加对“.S”汇编文件的支持: 2. 新建linux-2.6.22.6工程 1)选择工程存放的路径: 2)下载linux-2.6.2 ...
- Linux—rm命令
rm作用:用于删除一个文件或者目录,文件一旦通过rm命令删除,则无法恢复,所以必须格外小心地使用该命令.并且时刻清醒注意自己在哪个目录下面!! 命令格式:rm [选项] name 参数: -i 删除前 ...
- spring-data-jpa快速入门(一)——整合阿里Druid
一.概述 官网:https://projects.spring.io/spring-data-jpa/ 1.什么是spring-data-jpa Spring Data JPA, part of th ...
- c++ 字符串和字符串库函数
//有2个字符串定义如下: //char s1[38]="www.yjxsoft"; //char s2[]=".com"; //请编写一段代码,把字符串s2追 ...
- python基础学习1-迭代器
#!/usr/bin/env python # -*- coding:utf-8 -*- #自定义迭代器 需要 重写 __iter__()和__next__() 两个魔法方法 class Fibs: ...
- Deep Learning综述[上]
Deep-Learning-Papers-Reading-Roadmap: [1] LeCun, Yann, Yoshua Bengio, and Geoffrey Hinton. "Dee ...
- 【免费培训】腾讯WeTest&TesterHome WorkShop | 一起学压测
2019年,中国移动软件市场仍呈现快速增长趋势,移动新生态孕育而生.而移动软件质量问题越发受到用户的关注,成为用户体验的关键因素.目前移动软件测试人才稀缺,而性能测试作为一项高门槛.高技术的测试能力, ...
- 180801-Spring之定时任务基本使用篇
文章链接:https://liuyueyi.github.io/hexblog/2018/08/01/180801-Spring之定时任务基本使用篇/ Spring之定时任务基本使用篇 spring- ...
- 安装keystone时创建用户失败
系统:centos7.3 版本:openstack ocata 1.问题描述 安装keystone在创建用户时报错: The request you have made requires authen ...