一、项目地址:https://git.coding.net/lvgx/wsz.git

二、PSP:

PSP2.1

任务内容

计划共完成需要的时间(min)

实际完成需要的时间(min)

Planning

计划

15

15

Estimate

估计这个任务需要多少时间

并规划大致工作步骤

15

15

Development

开发

4225

5350

Analysis

需求分析 (包括学习新技术)

15

20

Design Spec

生成设计文档

10

10

Coding Standard

代码规范

(为目前的开发制定合适的规范)

10

15

Design

具体设计

25

45

Coding

具体编码

4000

5000

Code Review

代码复审

45

60

Test

测试

(自我测试,修改代码,提交修改)

120

200

Reporting

报告

55

60

Test Report

测试报告

15

15

Size Measurement

计算工作量

10

5

Postmortem & Process Improvement Plan

事后总结, 并提出过程改进计划

30

40

三、说明在结对编程中是如何利用这些方法(Information Hiding, Interface Design, Loose Coupling)对接口进行设计的?

Information Hiding:对于面向对象的程序设计而言,信息隐藏是一种重要的软件开发手段,它与对象的封装(encapsulation)与模块化(modularity)密切相关。在我看来,信息隐藏使得一个类把复杂的、敏感的、一旦被外界捕获可能会引起不良后果的内容封装在自身内部,这个类以外的代码得不到此类信息(通过反射等手段可能对得到),以提高程序的安全性与健壮性。在本次作业中,对于这个部分我们进行了模块化设计,对函数进行了封装,只能调用方法,并且在GUI页面中我们将变量值设为私有的,只用使用它就可以。

Interface Design和Loose Coupling:这两个概念是相辅相成的,后者是前者的目的,前者是后者的实现手段。Loos Coupling的目标是最小化依赖。松耦合这个概念主要用来处理可伸缩性、灵活性和容错这些需求。松耦合要付出使系统更加复杂的代价。松耦合意味着更多的开发以及维护工作量。在本次作业中,由于我们的编程能力的问题我们并没有对这个部分进行设计。

四、计算模块接口的设计与实现过程

我们一共用了8个类,10多个函数,其中Main函数是负责接收参数判断参数是否合法(后以改为Command),Operation类是生成并计算不带括号的式子,Operation1是生成带括号并且带乘除的式子,Operation2是生成并计算带括号只带加减的式子,在GUI中用了两个监听器,是复选框监听器和按钮监听器,代码的特点是方法简单,实现起来很容易,但是缺点就是没有再细致地进行模块化,后期维护起来不太容易

五、计算模块接口部分的性能改

在性能分析这部分,原来我们因为项目的问题没有来得及做,后来在补充时我们花费了4个小时左右,在此我们还界面程序的性能进行分析,和优化,改进,尽量减少除法中随机数,以减少代码因随机数生成的无效循环,按F4再一次查看,内存占用率明显减少,但是仍有内存没释放,我们会继续改进的,性能分析结果如下。

六、计算模块部分单元测试展示

单元测试的代码如下

    private static int n=10;
private static int r1=1;
private static int r2=50;
private static int p=4;
private static int z=0;
private static String s="11+(43-(35-(14+26)))"; public static void main(String[] args) {
// TODO Auto-generated method stub
Main.main(null);// 主界面
System.out.println(Operation.Operation(n, r1, r2, p, z));
System.out.println(Operation.Operation(n, r1, r2, p, z));
System.out.println(Operation.Operation(n, r1, r2, p, z));
Gui.main(null); }

我们对五个类进行了测试,采用结合或者独立的测试方法,下面是代码覆盖率的展示;

1、Operation1生成带括号并且带乘除的式子:

2、GUi界面

3、Judge判断括号的优先级

4、Operationa2生成并计算带括号只带加减的式子

5、Choose简单的加减乘除

七、计算模块部分异常处理说明

1、判断输入的出题数、运算符个数、范围等是否合法或者超出其范围(展示了对数的范围的处理,代码结果如下)

try {
r=Integer.parseInt(args[i+1]);
r1=Integer.parseInt(args[i+2]);
if(r<=0||r>100) {
System.out.println("r不在范围[1,100]内");
return;
}
if(r1<50||r1>1000) {
System.out.println("r1不在范围[50,1000]内");
return;
}
}catch(Exception e) {
System.out.println("r的输入不合法,请重新输入");
}
}

2、文件处理异常

try {
PrintStream file=new PrintStream("../result.txt");
System.setOut(file);
}catch(Exception e) {
System.out.println("文件生成错误");
}

点击出题时,如果文件生成错误,将不再生成。

3、文件过滤

FileNameExtensionFilter filter=new FileNameExtensionFilter("war", "xml", "txt", "doc", "docx");

在这里,我们只能找到文件类型相对应的文件,其余均被过滤,如图

八、界面模块的详细设计过程

1、出题GUI界面设计。

定义p1面板,添加r,r1,n,z组件,就是输入数字范围,出题数,运算符个数。

public static void main(String[] args) {
     Gui frame=new Gui();
     frame.pack();
     frame.setSize(500, 300);
     frame.setLocationRelativeTo(null);
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
     frame.setVisible(true);
    }
 
 public Gui() {
JPanel p1=new JPanel();
p1.setLayout(new GridLayout(4,2,5,5));
p1.add(new JLabel("请输入数字左范围(1~100)"));
p1.add(r);
p1.add(new JLabel("请输入数字右范围(50~1000)"));
p1.add(r1);
p1.add(new JLabel("请输入出题个数(1~10000)"));
p1.add(n);
p1.add(new JLabel("请输入运算符个数(1~10)"));
p1.add(z);
p1.setBorder(new TitledBorder("四则运算出题系统"));
JPanel p2=new JPanel();
p2.add(jbtArithmetic);
jbtArithmetic.setMnemonic('V');
jbtArithmetic.setToolTipText("出题");
setLayout(new BorderLayout());
add(p1,BorderLayout.CENTER);
add(p2,BorderLayout.SOUTH);
jchkMulandDiv.setMnemonic('C');
jchkBracket.setMnemonic('B');
JPanel p3=new JPanel();
p3.setLayout(new GridLayout(3,1));
p3.add(jchkMulandDiv);
p3.add(jchkBracket);
add(p3,BorderLayout.WEST);

2、答题GUI界面设计

定义p2面板,添加labe,taxt,jbNextquestion,jbRefer组件,就是所出题目,输入答案,提交和下一题按钮

       JFrame QuestionFrame=new JFrame();
       QuestionFrame.setTitle("题目");
       QuestionFrame.setSize(500,300);
       QuestionFrame.setLocationRelativeTo(null);
       QuestionFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       QuestionFrame.setVisible(true);
JPanel p4=new JPanel();
final JTextField text=new JTextField(10);
p4.setLayout(new GridLayout(3,2,5,5));
label.setText(addProblem());
p4.add(label);
p4.add(new JLabel("请回答"));
p4.add(new JLabel("输入答案"));
p4.add(text);
p4.add(jbNextquestion);
p4.add(jbRefer);
QuestionFrame.add(p4);

3、最终页面设计

定义p5面板,最后出现答题所用时间,答题总数,答题是否正确等。

                 JPanel p5=new JPanel();
p5.add(new JLabel("做题总数: " + xd + " " + " 正确数:" + rightkey + " 用时(S):" + (time2 - t1) / 1000));
setLayout(new GridLayout(100,1,5,5));
for(int i=0;i<xd;i++) {
p5.add(new JLabel(list.get(i)));
}
rFrame.add(p5)

九、界面模块与计算模块的对接

1、出题界面

它是通过按钮“出题”监听器来实现的,监听器是通过对不同按钮的点击事件进行监听,调用做题界面。

private class ButtonListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
try {
n1=Integer.parseInt(n.getText());
if(n1<=0||n1>10000) {
n.setText("n不在范围(1~10000)内,请重新输入");
return;
} final long t1=Calendar.getInstance().getTimeInMillis();
JFrame QuestionFrame=new JFrame();
QuestionFrame.setTitle("题目");
QuestionFrame.setSize(500,300);
QuestionFrame.setLocationRelativeTo(null);
QuestionFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
QuestionFrame.setVisible(true); public void eventOnImport(JButton Upload) {//文件上传
JFileChooser select=new JFileChooser();
select.setMultiSelectionEnabled(true);
FileNameExtensionFilter filter=new FileNameExtensionFilter("war", "xml", "txt", "doc", "docx");
select.setFileFilter(filter);
int backv=select.showOpenDialog(Upload);
if(backv==JFileChooser.APPROVE_OPTION) {
File[] opf=select.getSelectedFiles();
if(opf==null||opf.length==0) {
return;
}

2、做题界面

通过下一题按钮进行判断和再次出题,通过按钮调用统计界面。

                        long time2=Calendar.getInstance().getTimeInMillis();
JFrame rFrame=new JFrame();
rFrame.setSize(500,300);
rFrame.setTitle("结果");
rFrame.setLocationRelativeTo(null);
rFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
rFrame.setVisible(true);
int xd=list.size();
JPanel p5=new JPanel();
p5.add(new JLabel("做题总数: " + xd + " " + " 正确数:" + rightkey + " 用时(S):" + (time2 - t1) / 1000));

3、最终界面

                        JPanel p5=new JPanel();
p5.add(new JLabel("做题总数: " + xd + " " + " 正确数:" + rightkey + " 用时(S):" + (time2 - t1) / 1000));
setLayout(new GridLayout(100,1,5,5));

4、上传文件界面,它是通过按钮“上传文件”监听器来实现的,先判断文件是否已经上传,然后如果没有则上传文件成功

try {
for(File f:opf) {
File ma=new File(lu);
File[] na=ma.listFiles();
HashSet<String> she=new HashSet<String>();
for(File file:na) {
she.add(file.getName());

十、描述结对的过程

结对作业成员:王晓哲(2016012052)、祁晨(2016012057)

我(王晓哲)与队友(祁晨)是同寝室室友,所以我们之间的组队对于在项目进行时的沟通交流十分有利,我们每天几乎都能够见到对方,因此在项目的问题上可以随时交流。并且对方如果遇到不会不懂的地方,我们也可以及时去一起处理、解决。由于我的队友缺少项目经验,并且基础编程能力较弱,因此她负责此次项目的设计、测试以及简单编写。而我将承担此次项目中的结构框架、所用的技术等等。

十一、说明结对编程的优点和缺点

通过看邹欣老师的《构建之法》第四章两人合作的内容,初步的了解了我们“为什么要结对编程?”。在结对编程模式下,一对程序员肩并肩、平等地、互补地进行开发工作。他们并排坐在一台电脑前,面对同一个显示器,使用同一个键盘、同一个鼠标一起工作。他们一起分析,一起设计,一起写测试用例,一起编码,一起做单元测试,一起集成测试,一起写文档,等等。(选自《构建之法》第四章)

但是经过这次结对项目之后,我才能亲身感受到两个人一起合作的苦乐。我在此次作业完成后,对于结对项目的优缺点有以下几点想法。

结对项目的优点:①在项目设计阶段,我们不在局限于一个人的想法,两个人共同思考、设计,使这个项目有了多个开始方向,一一选择,最终确定了一个我们看来“最好的”方案;②在项目开发阶段,一个人编程实在是过于枯燥,并且工作量实在太大。但是结对编程能够减少自身的工作量,两个人配合完成;③在编程过程中,两个人彼此协助,能够在对方遇到困难处时及时给予帮助,由此提高工作效率。

结对项目的缺点:①由于之前都是自己一人编程,因此大家都有自己的习惯与方式,所以在结对项目中会产生摩擦与冲突;②结对项目就等于是给自己增加了一个帮手,但同时对于较弱的那个人来说就会产生依赖心理,从而较强的那个人会感到更加的负担。

十二、指出结对的每一个人的优点和缺点在哪里 (要列出至少三个优点和一个缺点)

1、队友(祁晨)

优点:①对于安排的工作能够及时完成;②善于沟通,常和我交流自己的想法与问题;③对于我的问题与错误能够及时指出。

缺点: 缺少耐心,不够细心

2、自己(王晓哲)

优点:①有责任心,对于自己的工作总是完成的及时并且有质量;②对于自己不懂的问题愿意去查阅资料和询问老师同学;③积极思考,对于项目的每一步都有自己的想法。

缺点:缺乏项目经验,能力不足

十三、项目总结

我还是想总结一下我此次的项目,虽然这个没有做要求。这次的项目刚开始的时候可以说一点头绪都没有,然后我们去询问了夏江华同学,他给了我们很多思路,告诉我们具体该怎么去做,在改代码部分我也借鉴了夏江华同学的很多思路,包括刚开始一点都不懂GUI,也开始慢慢学习,参考了夏江华同学的很多代码,他也告诉我们应该怎样去做,再自己慢慢的敲出来,感觉挺不容易的,遇到了很多阻碍,还有就是上传文件的功能也没有实现,代码覆盖率,效能分析的问题等等,再就是自己的编程能力太弱了,希望自己以后可以继续加油,努力学习,最后真的特别感谢夏江华同学。在后来的改进中,我们实现了文件上传的功能,和效能分析等问题,对我们的代码做出了很大的改进。

结对项目——四则运算GUI项目的更多相关文章

  1. 结对编程-四则运算GUI的实现

    一.项目成员以及coding地址: 洪灏捷(本人)201321122020  coding地址:https://git.coding.net/hoje/The-GUI-operation.git 白至 ...

  2. 结对作业-四则运算GUI

    目录: 一.项目地址二.PSP三.接口设计四.计算模块接口的设计与实现过程五.计算模块接口部分的性能改进六.计算模块部分单元测试展示七.计算模块部分异常处理说明八.界面模块的详细设计过程九.界面模块与 ...

  3. 结对编程四则运算gui

    码市地址:https://git.coding.net/linzhao/sizeyunsuangui.git 林 钊 -- 201421123105 吴世荣 -- 201421123119 王坤彬 - ...

  4. 结对编程-四则运算-GUI

     201421123022 王若凡        201421123026  欧阳勇 https://git.coding.net/ttoyy/sizeyunsuan-GUI.git a.需求分析: ...

  5. 结对编程项目——四则运算vs版

    结对编程项目--四则运算vs版 1)小伙伴信息:        学号:130201238 赵莹        博客地址:点我进入 小伙伴的博客 2)实现的功能: 实现带有用户界面的四则运算:将原只能在 ...

  6. 20175324王陈峤宇 2018-2019-2《Java程序设计》结对编程项目-四则运算 第一周 阶段性总结

    20175324王陈峤宇 2018-2019-2<Java程序设计>结对编程项目-四则运算 第一周 阶段性总结 需求分析 这次的结对作业是要求我们利用栈来设计一个计算器. 自动生成四则运算 ...

  7. 20175229许钰玮 2018-2019-2《Java程序设计》结对编程项目-四则运算 第一周 阶段性总结

    20175229许钰玮 2018-2019-2<Java程序设计>结对编程项目-四则运算 第一周 阶段性总结 需求分析 自动生成四则运算题目(加.减.乘.除). 既可以用前缀算法(波兰算法 ...

  8. 20175311胡济栋 2018-2019-2《Java程序设计》结对编程项目-四则运算 第二周 阶段性总结

    20175311胡济栋 2018-2019-2<Java程序设计>结对编程项目-四则运算 第二周 阶段性总结 需求分析 这是利用栈来设计一个计算器的第二阶段总结. 自动生成四则运算的题目( ...

  9. 四则运算结对编程(GUI)

    四则运算GUI coding地址:https://git.dev.tencent.com/qyj814/GUI.git 结对伙伴:李梦宇 一.题目要求 定制出题要求.每次出题时用户都可以在界面上定制如 ...

随机推荐

  1. 三、Python-列表

    一.序列:是一块用于存放多个值的连续内存空间,并且按一定顺序排列,可以通过索引取值 索引:从左到右的索引从0开始依次增加的正整数:从右到左的索引为-1开始的复数 切片(分片):一中获取序列中的元素的方 ...

  2. LeetCode 206. Reverse Linked List倒置链表 C++

    Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL Output: 5->4-> ...

  3. leetcode1033

    class Solution: def numMovesStones(self, a: int, b: int, c: int) -> 'List[int]': l = list() l.app ...

  4. Canvas 实现绘制图表

    这里用canvas实现了两个简单的图表,用到了canvas的基本用法,效果如下 新建 chart.js 文件,封装绘制方法 构造方法 function myChart(config){ this.wi ...

  5. jquery通过AJAX从后台获取信息并显示在表格上,并支持行选中

    不想用Easyui的样式,但是想要他的表格功能,本来一开始是要到网上找相关插件的,但是没找到就开始自己写,没想到这么简单. 后台代码:(这个不重要) public ActionResult GetDi ...

  6. 【转】BFG Repo-Cleaner: Removes large or troublesome blobs like git-filter-branch does, but faster.

    https://rtyley.github.io/bfg-repo-cleaner/ an alternative to git-filter-branch The BFG is a simpler, ...

  7. 【读书笔记】segment routing mpls数据平面-2

  8. celery (二) task调用

    调用 TASK 基础 task 的调用方式有三种: 类似普通函数的调用方式, 通过 __calling__ 调用 ,类似 function() 通过 apply_async() 调用,能接受较多的参数 ...

  9. 1、let const

    1.作用域的概念 es6之前 es5 分为 全局作用域 函数作用域 es6 新增块级作用域 2.let const 与 var 区别 用var 可以无报错 此代码报错 引出 块级作用域 用 {} 包起 ...

  10. 内网主机使用yum安装软件

    经常遇到这样的情况:有一台内网linux主机需要安装软件,但是主机又无法连接外网,通常情况下可以使用rpm包或者使用源码编译安装.但常常会遇到依赖缺少的情况,这就麻烦了,要一一找到缺少的软件包. 这种 ...