结对作业 -GUI四则运算

目录:

一.前言(及项目地址)

二.PSP(planning)

三.结对编程中对接口的设计

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

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

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

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

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

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

十.结对过程的描述

十一.结对编程的优缺点

十二.PSP(actual)


一、前言:

 队友:吕乐乐(很幸运找到性格如此好的队友,既有耐心又细心,脾气还这么好o(* ̄︶ ̄*)o

 在清明节假日中我参加了整整两天的志愿活动,基本没有时间做项目,基于老师给的题目要求还是乐乐完成的,我原本代码有的功能花费了好几天实在没琢磨出来,因此只参与了界面的编写和对接项目。很崩溃时间飞逝到了截止日期还在熬夜撰写博客。总的来说本次作业时间范围给的太短了,十天时间给了三个作业,不过收获很大,基于GUI的代码实现还是翻阅了书籍才编写出来的,又一次意识到了自己java的薄弱o(╥﹏╥)o。

Coding.net源码仓库地址:https://git.coding.net/francesca/Gui-Arithmatic.git

队友博客地址:http://www.cnblogs.com/symx/p/8767778.html

二、PSP(planning)

PSP

任务内容

计划时间(min)

Planning

计划

30

 Estimate

 估计这个任务需要多少时间,并规划大致工作步骤

10

Development

开发

780

Analysis

需求分析

23

Design Spec

生成文档

0

 Design Review

设计复审

0

Coding Standard

代码规范

7

Design

具体设计

40

Coding

具体编码

210

Code Review

代码复审

30

Test

测试

30

Reporting

报告

160

Test Report

测试报告

180

Size Measurement

计算工作量

40

Postmortem & Process Improvement Plan

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

60

 

三、结对编程中对接口的设计。

  

1、Information Hiding

  信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。信息隐藏是结构程序设计与面向对象设计的基础之一。在面向对象设计中,它又引出了封装和模块化的概念,并与抽象的概念紧密相关。信息隐藏是软件的首要技术使命中格外重要的一种启发式方法,因为它强调的就是隐藏复杂度。

我们的设计:进行模块化设计,通过对函数的封装。只可以调用方法,不可以改变内部变量。界面设计:只需要知道如何使用它,不需要知道界面内部是如何运行的。

 

2、Interface Design, Loose Coupling

 

 接口设计和低耦合是相辅相成的,接口化设计能大大降低程序的耦合度,低耦合一定离不开接口化设计。

个人理解: 一个完整的系统,模块与模块之间,尽可能的使其独立存在。也就是说,让每个模块,尽可能的独立完成某个特定的子功能。模块与模块之间的接口,尽量的少而简单。如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分。这样有利于修改和组合。

我们的设计:界面生成和算式生成是相互独立的,优先级判断、计算结果和算式生成又是相互独立的。

 

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

方法说明:

Command:调用其它方法,实现整个程序的功能;

arithmetic()方法:综合了不同定制要求的算式方法;

Simple()方法:产生满足定制需求的加减算式;

OnlyMD()方法:产生满足定制需求的加减乘除算式

OnlyBra()方法:产生满足定制需求的含括号的加减算式;

BothMDBra()方法:产生满足定制需求的含括号的加减乘除算式;

Youxianji()方法:处理计算结果过程中的优先级问题;

Stack()方法:处理后缀表达式的运算顺序问题;

login.java,ShowGridLayout.java,MyExGUI.java等实现GUI面板的Java文件。

 

五、计算模块接口部分的性能改进。记录在改进计算模块性能上所花费的时间,描述你改进的思路,并展示一张性能分析图,并展示你程序中消耗最大的函数。

   1.性能分析改进

  在整体编程结束后,进行性能分析与改进是非常有必要的。因为在小规模的数据下或者是一般情况下,功能的实现是不太会涉及到优化算法的。但是,个别特例或者是大规模的数据往往会导致程序报错,这就要求我们需要对程序进行性能的优化改进。比如,我们在生成算式过程中,由于上下限和算式个数选择上偏于极端情况,算式的结果“迟迟”无法生成,CPU占有率极大。因此我们在算法中做了异常处理,并且规范输入,这样一来,软件的使用性能上就得到了优化改进。

  2.性能分析截图

  项目总体分析图,从内存,多线程,CPU等方面分析了计算模块的性能,截图如下:

性能分析过程截图:

 

 

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

 测试Command.java类(下图的单元测试中的Main即代码中的Command,截图时未更名)

package test;

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;

public class CommandTest {

	private static Command con = new Command();
	@Before
	public void setUp() throws Exception {
	}

	@Test
	public void testSimple() {
		con.Simple(2,50,3);//产生2个50以内最多3个运算符的算式
	}

	@Test
	public void testOnlyMD() {
		con.OnlyMD(1,500,2);//产生1个500以内最多2个运算符的算式
	}

	@Test
	public void testOnlyBra() {
		con.OnlyBra(10,50,4,1);//故意输入参数错误,检验单元测试报错
	}

	@Test
	public void testBothMDBra() {
		fail("Not yet implemented");//未编写单元测试函数,单元测试失败
	}

}

 代码覆盖率:

 

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

 

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

  1.登录面板:

  单用户登录:username:1 password:1

 

对应部分代码展示:

JButton b_log=new JButton("登录");  
        b_log.addActionListener(new ActionListener() {  
            public void actionPerformed(ActionEvent e) {  
                // TODO Auto-generated method stub  
                //获取用户名和密码,进行校验  
                String myUsername=tf_name.getText(); 
                String myPassword=password.getText();  
                if(myUsername.equals("1")&&              myPassword.equals("1")){  
                    JOptionPane.showMessageDialog(null, "登陆成功!");  
                    f.dispose();
                    //new MyExGUI();
                    new ShowGridLayout();
                    
                }
                else{  
                    JOptionPane.showMessageDialog(null, "账号或密码错误!");  
                    tf_name.setText( "");  
                    password.setText( "");  
                }  
                  
            }  
        });

  2.定制面板:

   通过输入合理有效的数值,定制不同需求的题目

对应部分代码展示:

JButton b_enter=new JButton("进入");  
        b_enter.addActionListener(new ActionListener() {  
            public void actionPerformed(ActionEvent e) {
 
                String myNum=tf_num.getText(); 
                int n = Integer.parseInt(myNum);
                
                String myLow=tf_low.getText();
                int ml = Integer.parseInt(myLow);
                
                String myUp=tf_up.getText(); 
                int mu = Integer.parseInt(myUp);
                
                String myOp=tf_op.getText(); 
                int o = Integer.parseInt(myOp);
                
                String myMul=tf_mul.getText();
                
                String myBak=tf_bak.getText(); 
                
                if((n>0&& n<10001) && (ml>0&& ml<101) && (mu>=50&&mu<1001) && (o>0&&o<11) &&
                        ( myMul.equals("0")|| myMul.equals("1") )&& 
                        ( myBak.equals("0")|| myBak.equals("1") )
                  ){
                    JOptionPane.showMessageDialog(null, "欢迎使用!");
                        f.dispose();
                        new MyExGUI(n,ml,mu,o,myMul,myBak);
                    
                }
                else{  
                    JOptionPane.showMessageDialog(null, "你输入的数据有错!");  
                    tf_num.setText( "");
                    tf_low.setText( "");  
                    tf_up.setText( "");
                    tf_op.setText( "");  
                    tf_mul.setText( "");
                    tf_bak.setText( "");  
                }  
                  
            }  
        });

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

UI的整体设计思路:

        我们想设计登录,定制,菜单,统计4个面板:

(1)登陆页面包含用户的名称和密码以及多种语言的选择;

(2)定制页面包含具体不同需求的题目定制以及输入异常数据的提示处理;

(3)菜单页面包含启动开始答题项,文件的保存,本地文件的上传的功能;

(4)统计页面包含对答题结果的统计和分析,给出分数柱状图。

 

语言功能和主体界面展示如下:

文件的上传

题目解答:

 

十、描述结对的过程,提供非摆拍的两人在讨论的结对照片。

1.一开始本打算做网页版的,但是前端我们都不大熟悉,所以决定做GUI界面。此次结对编程中,一人负责内部功能的算法实现,一人负责界面,各自负责编写自己的那部分代码;对接过程中,我们一起合作,在这一阶段也充分感受到了结对编程的高效,也意识到好队友的挑选对项目的完成有很大的促进促进作用。

2.结对照片展示

 

十一、结对编程的优缺点

1.结对编程的优缺点

优点:充分锻炼了两个人的合作,沟通能力。两个人之间可以相互学习交流,从而取长补短。后期两人共同对接模块时,充分结合了两人的优点,使对接较为顺利的完成。

缺点:需要一段磨合时间,刚开始时效率不高,需要相互熟悉了解代码风格之后渐入佳境。

2.结对个人优缺点

吕乐乐  优点:(1)擅长算法,编码效率高。对项目进度的把握很有规划

              (2)编程思路清晰,能够尽最大的能力做到最好

       (3)很有耐心。在结对编程中能很快地处理bug

        缺点:不够细心。

我的    优点:(1)编程思路清晰,能够尽自己最大的能力实现自己能做到的最好.

              (2)耐心,不惧怕问题的出现.

       (3)出现问题时不骄不躁,能静下心来处理解决问题.

        缺点:在遇到问题时会过于执着,浪费很多时间,java基础还不够扎实,看待问题不够仔细理解得也不够深入。

十二、在你实现完程序之后,在附录提供的PSP表格记录下你在程序的各个模块上实际花费的时间。

PSP

任务内容

计划时间(min)

完成时间(min)

Planning

计划

30

30

 Estimate

 估计这个任务需要多少时间,并规划大致工作步骤

10

10

Development

开发

780

2700

Analysis

需求分析

23

40

Design Spec

生成文档

0

20

 Design Review

设计复审

0

20

Coding Standard

代码规范

7

15

Design

具体设计

40

60

Coding

具体编码

210

1800

Code Review

代码复审

30

45

Test

测试

30

700

Reporting

报告

160

840

Test Report

测试报告

180

780

Size Measurement

计算工作量

40

30

Postmortem & Process Improvement Plan

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

60

30

原文地址:https://www.cnblogs.com/tingjuanli/p/8746012.html