一.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的更多相关文章

  1. BUAA软工-结对项目作业

    结对项目作业 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 结对项目作业 我在这个课程的目标是 通过这门课锻炼软件开发能力和经验,强化与他人合作 ...

  2. BUAA 2020 软件工程 结对项目作业

    Author: 17373051 郭骏 3.28添加:4.计算模块接口的设计与实现过程部分,PairCore实现的细节 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) ...

  3. BUAA 软工 结对项目作业

    1.相关信息 Q A 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 结对项目作业 我在这个课程的目标是 系统地学习软件工程开发知识,掌握相关流程和技术,提升 ...

  4. BUAA软件工程结对项目作业

    BUAA软件工程结对项目 小组成员:16005001,17373192 1.教学班级和项目地址 项目 内容 这个作业属于哪个课程 博客园班级连接 这个作业的要求在哪里 结对项目作业 我在这个课程的目标 ...

  5. 结对项目——四则运算GUI项目

    一.项目地址:https://git.coding.net/lvgx/wsz.git 二.PSP: PSP2.1 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min) Plannin ...

  6. 结对项目作业报告——四则运算web项目

    成员:顾思宇2016011993 程羚2016012050   1.仓库地址:https://git.coding.net/DandelionClaw/WEB_Calculator.git 注: 本项 ...

  7. BUAA_2020_软件工程_结对项目作业

    项目 内容 这个作业属于哪个课程 班级博客 这个作业的要求在哪里 作业要求 我在这个课程的目标是 掌握软件工程的思路方法 这个作业在哪个具体方面帮助我实现目标 学习结对编程 教学班级 006 项目地址 ...

  8. 四则运算结对项目之GUI

    本次结对编程让我学到了许多许多知识,受益匪浅!在此之前,我没想过我能做出一个双击运行的小程序. 感谢我的队友与我同心协力,感谢室友宇欣告诉我操作符为“最多多少”而不是“多少”并教我使用效能分析工具,感 ...

  9. BUAA2020软工作业(四)——结对项目

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 结对项目作业 我在这个课程的目标是 进一步提高自己的编码能力,工程能力,团队协作能力 这个作业在哪 ...

随机推荐

  1. 不安分的android开发者(小程序初尝试,前后台都自己做)

    前言 作为一个稍微有点想法的程序员来说,拥有一个自己开发,自己运营,完全属于自己的应用,应该是很多人的梦想.刚毕业那会,自己的工作是做游戏,于是也和朋友业余时间开发一些小游戏玩玩,可是终究不成气候,而 ...

  2. 20155325 2017-2018 1 课上测试、课下作业、实验——码云&博客链接汇总 《信息安全系统设计基础》

    第二周-课上 码云 https://gitee.com/bestiisjava2017/XinXiAnQuanXiTongSheJiJiChu20155325thl/tree/master/0927 ...

  3. BZOJ4145_The Prices_KEY

    题目传送门 看到M<=16经典状态压缩的数据范围,考虑题目. 一道类似于背包的题目. 设f[i][j]表示前i个商店,物品购买状态为j. 先将f[i][j]加上w[i](到i的路费),转移一次, ...

  4. cogs1885 [WC2006]水管局长数据加强版

    BZOJ卡不过灰常蛋疼(毕竟人蠢自带巨大常数 这和动态维护最小生成树很像,但加边变成了删边,似乎没法做了. 然后根据之前的套路离线做,删边变成加边,就可以做了orz 二分查找的:(慢 // It is ...

  5. xaf.domain object new 在属性上的用法

    有如下业务对象定义: using System; using System.Linq; using System.Text; using DevExpress.Xpo; using DevExpres ...

  6. Print Spooler 服务自动停止

    1)先在服务里停止并禁用Print Spooler : 2)删除此文件夹下的所有文件,C:\Windows\System32\spool\PRINTERS\ : 3)删除注册表 HKEY_LOCAL_ ...

  7. Bailian 2808 校门外的树(入门线段树)

    题目链接:http://bailian.openjudge.cn/practice/2808?lang=en_US 总时间限制: 1000ms 内存限制: 65536kB 描述 某校大门外长度为L的马 ...

  8. aws存储桶s3使用

    关于aws s3的使用说明: aws官方文档地址:https://docs.aws.amazon.com/s3/index.html#lang/zh_cn 创建s3与基础使用: 1.登陆aws控制台- ...

  9. 深入理解C/C++二维数组

    深入理解C/C++二维数组 前言 本来以为自己对二维数组的理解还可以,没感觉有什么,但是今天小伙伴问了一个问题感觉迷惑了好久,于是决定细致的记录一下,一步一步的探究各种关于二维数组的问题,巩固基础. ...

  10. Python3中isdigit(), isdecimal(), isnumeric()的区别和字符串的常用方法

    # 全部小写 string.lower() # 全部大写 string.upper() # 是否全部小写 string.islower() # 是否全部大写 string.isupper() # 首字 ...