1)Coding.Net项目地址https://git.coding.net/day_light/GUIszysLL.git

2)在开始实现程序之前,在下述PSP表格记录下你估计将在程序的各个模块的开发上耗费的时间。

 

任务内容

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

Planning

计划

25

·        Estimate

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

10天

Development

开发

·        Analysis

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

90

·        Design Spec

·         生成设计文档

5

·        Design Review

·         设计复审 (和同事审核设计文档)

4

·        Coding Standard

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

10

·        Design

·         具体设计

10

·        Coding

·         具体编码

600

·        Code Review

·         代码复审

35

·        Test

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

60

Reporting

报告

9

·         Test Report

·         测试报告

60

·         Size Measurement

·         计算工作量

2

·         Postmortem & Process Improvement Plan

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

10

3)看教科书和其它资料中关于Information Hiding, Interface Design, Loose Coupling的章节,说明你们在结对编程中是如何利用这些方法对接口进行设计的。

信息隐藏(Information Hiding)

信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。信息隐藏有着独特的启发力,它能够激发出有效的设计方案。信息隐藏同样有助于设计类的公开接口。

我们的信息隐藏设计: 类的所有数据成员都是private,所有访问都是通过访问函数实现的;

接口设计(Interface Design)

接口可以降低耦合性,即可以让某个模块或功能能够重复利用。

我们的设计:可以了解对象的交互界面,而不需了解对象所对应的类。

松耦合(Loose Coupling)

松耦合:即降低功能模块之间的依赖度。

我们的设计: 采用模块化设计,将方法进行封装,每个类之间保持独立,降低耦合度

4)计算模块接口的设计与实现过程。

1.共三个大类,六个函数:分别为命令行测试和GUI界面测试。

2.命令行:Command类中包含主函数,主要负责命令行参数的接受及参数异常处理;同时调用Lib类中的Compute1,Compute2,Compute3,Compute4的四个方法,分别生成加减运算式,加减带括号运算式,加减乘除运算式,加减乘除带括号运算式。

3.GUI界面测试:GUI类中包含主函数,主要负责GUI的界面展示,同时设置监听器,分别调用buttonSubmit和buttonNext两个方法,进行出题和提交答案;同时buttonNext调用Lib类中的Compute1,Compute2,Compute3,Compute4的四个运算方法,生成运算式。

算法关键:通过复选框监听器实现调用四个运算函数

                  if (c ==0 && b == 0) {
                                 String answer = Lib2.compute1(ns, os, m1s, m2s);
                                 label.setText(answer);
                             }
                             if (c != 1 && b == 1) {
                                 String answer = Lib2.compute2(ns, os, m1s, m2s);
                                 label.setText(answer);
                             }
                             if (c == 1 && b != 1) {
                                 String answer = Lib2.compute3(ns, os, m1s, m2s);
                                 label.setText(answer);
                             }
                             if (c == 1 && b == 1) {
                                 String answer = Lib2.compute4(ns, os, m1s, m2s);
                                 label.setText(answer);
                             }

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

1.性能改进:为保证除法中不出现小数,当不满足改条件时,重新生成随机数,导致代码会出现很多无效循环,为改进这一问题,我们设置当遇到除法的时候,我们可以随机产生被除数的因数,以减少代码的无效循环。当遇到乘法的时候,减少乘数的大小,以保证可以产生较多的式子。
2.消耗最大函数:出题类Lib中的Compute4,主要实现加减乘除带括号的功能。

F4回收垃圾后,发现红色全部消失,资源全部被回收。证明没有资源泄露。程序性能良好。

6)计算模块部分单元测试展示。展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路。并将单元测试得到的测试覆盖率截图,发表在博客中。只需要测试命令行部分,且该部分覆盖率到90%以上。

单元测试代码:

 import static org.junit.Assert.*;

 import org.junit.Test;

 public class test {
     Lib2 lib = new Lib2();
     @Test
     public void test() {
         lib.compute1(12, 2, 1, 100);
         lib.compute2(12, 2, 1, 100);
         lib.compute3(12, 2, 1, 100);
         lib.compute4(12, 2, 1, 100);

     }

 }

7)计算模块部分异常处理说明。在博客中详细介绍每种异常的设计目标。每种异常都要选择一个单元测试样例发布在博客中,并指明错误对应的场景。

样例1:n为非法字符(字母,符号等,这里以字母为例)。

@Test
public void testn1command() {
    String[] args={"-n","e","-m","1","100"};
    Command.main(args);
}

样例2:n超出预计范围(n小于1或大于10000,这里以-9为例)。

@Test
public void testn2command() {
    String[] args={"-n","-9","-m","1","100"};
    Command.main(args);
}

样例3:m1,m2超出预计范围(m1大于m2或者m1小于1大于100或者m2小于50大于1000,这里以m1为-8,m2为40为例)。

@Test
public void testm1command() {
    String[] args={"-n","10","-m","-8","40"};
    Command.main(args);
}

样例4:m为非法字符(字母,符号等,这里以字母为例)。

@Test
public void testm2command() {
    String[] args={"-n","10","-m","8","e"};
    Command.main(args);
}

样例5:m,n为空值

@Test
public void testmncommand() {
    String[] args={};
    Command.main(args);
}

8)界面模块的详细设计过程。在博客中详细介绍界面模块是如何设计的,并写一些必要的代码说明解释实现过程。

做题界面,设置监听器,当触发“下一题”的按钮事件时,根据用户定制的要求,进行出题。

     class ButtonListener implements ActionListener {
         public void actionPerformed(ActionEvent e) {
             Lib2 lib2 = new Lib2();
             int ns = Integer.parseInt(n.getText());
             int os = Integer.parseInt(o.getText());
             int m1s = Integer.parseInt(m1.getText());
             int m2s = Integer.parseInt(m2.getText());
             if (e.getSource() == jbtBeginCompute) {
                 JFrame frame2 = new JFrame();
                 frame2.setTitle("做题界面");
                 frame2.setSize(500, 500);
                 frame2.setLocationRelativeTo(null);
                 frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                 frame2.setVisible(true);
                 if (c ==0 && b == 0) {
                     String answer = Lib2.compute1(ns, os, m1s, m2s);
                     label.setText(answer);
                 }
                 if (c != 1 && b == 1) {
                     String answer = Lib2.compute2(ns, os, m1s, m2s);
                     label.setText(answer);
                 }
                 if (c == 1 && b != 1) {
                     String answer = Lib2.compute3(ns, os, m1s, m2s);
                     label.setText(answer);
                 }
                 if (c == 1 && b == 1) {
                     String answer = Lib2.compute4(ns, os, m1s, m2s);
                     label.setText(answer);
                 }

                 panel1.add(label);
                 JPanel panel2 = new JPanel();
                 panel2.add(new JLabel("请输入答案:"));
                 panel2.add(text);
                 JButton buttonSubmit = new JButton("提交答案");
                 JButton buttonNext = new JButton("下一题");
                 JPanel panel3 = new JPanel();
                 panel3.add(buttonNext);
                 panel3.add(buttonSubmit);

                 frame2.add(panel1, BorderLayout.NORTH);
                 frame2.add(panel2, BorderLayout.CENTER);
                 frame2.add(panel3, BorderLayout.SOUTH);
                 frame2.setSize(500, 500);
                 frame2.setLocationRelativeTo(null);
                 frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                 frame2.setVisible(true);
 }

核对答案:

 buttonNext.addActionListener(new ActionListener() {// 定义时间监听器
                     public void actionPerformed(ActionEvent e) {
                         System.out.println("下一题"+lib2.result);
                         String question = label.getText();
                         int count = 0;
                         double sum = Double.parseDouble(text.getText());
                         if (count < ns) {
                             String ifRight = "";
                             if (lib2.result == sum) {
                                 ifRight = "正确";
                                 rightSum++;
                                 count++;
                             } else {
                                 ifRight = "错误";
                                 count++;
                             }
                             String message = question + ", " + "你的答案:" + sum + ", " + "正确答案: " + lib2.result + ", 状态: "
                                     + ifRight;
                             list.add(message);
                             text.setText("");
                             if (c ==0 && b == 0) {
                                 String answer = Lib2.compute1(ns, os, m1s, m2s);
                                 label.setText(answer);
                             }
                             if (c != 1 && b == 1) {
                                 String answer = Lib2.compute2(ns, os, m1s, m2s);
                                 label.setText(answer);
                             }
                             if (c == 1 && b != 1) {
                                 String answer = Lib2.compute3(ns, os, m1s, m2s);
                                 label.setText(answer);
                             }
                             if (c == 1 && b == 1) {
                                 String answer = Lib2.compute4(ns, os, m1s, m2s);
                                 label.setText(answer);
                             }
                         }
                     }
                 });

9)界面模块与计算模块的对接。详细地描述UI模块的设计与两个模块的对接,并在博客中截图实现的功能。

界面模块共四个,出题界面选择用户上传或定制出题,选择定制出题时,在“四则运算”界面,选择输入题目数量、运算符个数、数值上下界范围、是否带乘除和括号时,UI模块将参数传到符合定制要求的计算模块中,计算模块将满足用户要求的题目生成,并返回到“做题界面”,用户在做题界面输入答案,首先判断是否为合法参数,若不合适则重新生成,若合适,则调用计算模块中生成的正确答案,与用户输入答案进行判断,生成错题库,当完成做题数量时,中止做题,按下提交答案按钮,跳转到错题库,查看做题情况。

输入“题目数量、运算符个数、数值上下界范围、是否带乘除和括号”后,选择开始做题。

有计算做题时间的功能。

如果选择“上传题目”

将用户上传的题目逐一展示出来,用户可在此界面做题。

答题完毕后,自动审核,展示错题库。

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

11)说明结对编程的优点和缺点。

结对编程的优点:

1)在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。

2)两个程序员之间可以相互教对方,进行优劣势的互补。

结对编程的缺点:

1)两个人在一起工作可能会出现工作精力不能集中的情况。程序员可能会交谈一些与工作无关的事情,反而分散注意力,导致效率比单人更为低下。

2)有时候,程序员们会对一个问题各执己见(代码风格可能会是引发技术人员口水战的地方),争吵不休,反而产生重大内耗。

搭档的优缺点:性格好,有耐心,心细,有规划。可以实现互帮互助,一起学习,有时候,会对一个问题很坚持,缺少变通性。

我的优缺点:好沟通,愿意共享,喜欢一起学习,耐性比较差,有时不够细心。

12)PSP

 

任务内容

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

Planning

计划

30

·        Estimate

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

10天

Development

开发

·        Analysis

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

45

·        Design Spec

·         生成设计文档

8

·        Design Review

·         设计复审 (和同事审核设计文档)

6

·        Coding Standard

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

15

·        Design

·         具体设计

30

·        Coding

·         具体编码

500

·        Code Review

·         代码复审

80

·        Test

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

120

Reporting

报告

6

·         Test Report

·         测试报告

90

·         Size Measurement

·         计算工作量

8

·         Postmortem & Process Improvement Plan

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

10

结对作业:基于GUI实现四则运算的更多相关文章

  1. 结对作业--基于GUI的四则运算生成器

    组员:201421123015 陈麟凤 201421123019 张志杰 201421123020 黄海鸿 coding 地址 :https://coding.net/u/zhang1995/p/wo ...

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

    一.需求分析 1.题目要求: 我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序.进一步,本次要求把这个程序做成GUI(可以是Windows PC 上的,也可以是Mac.Linux,web ...

  3. 结对实验---基于GUI的四则运算

    详细代码:https://git.coding.net/wangluo24/NO.2.git 结对伙伴:吕志哲(201421123021) &本人.许明涛 201421123024 一.题目要 ...

  4. 基于GUI的四则运算

    基于GUI的四则运算 李志强 201421123028 连永刚 201421123014 林方言 201421123023 coding 地址 https://git.coding.net/lizhi ...

  5. 结队编程--基于GUI的四则运算

    coding地址 https://git.coding.net/lizhiqiang0x01/GUI-sizeyunsuan.git 李志强 201421123028 连永刚 201421123014 ...

  6. 结对作业(1)----基于GUI的四则运算

    小伙伴:201421123031 余洋 201421123044  潘志坚  题目要求: 我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序.进一步,本次要求把这个程序做成GUI(可以是W ...

  7. 结队编程-基于gui的四则运算生成器

    成员:卢少锐 201421123027.刘存201421033023 coding.net地址 1.需求分析:除了实现四则运算的功能外,还添加了计时器功能和语言选择功能 2.程序设计:这次作业是基于上 ...

  8. 结对编程1 (四则运算基于GUI)

    https://git.coding.net/Luo_yujie/sizeyunsuan.app.git 201421123034 201421123032 1. 需求分析 这次作业新引用了语言选择, ...

  9. 结对作业1----基于GUI的四则运算生成器

    组员:201421123015 陈麟凤 201421123019 张志杰 201421123020 黄海鸿 coding 地址:代码点这里 需求分析: 1.除了整数的四则运算还要支持分数的四则运算: ...

随机推荐

  1. 函数的返回值是void

    #include <stdio.h> void sub(int x,int y,int z){ z=y-x; } void main() { int a=1,b=2,c=3; sub(10 ...

  2. 2017-2018-2 20155315《网络对抗技术》Exp4:恶意代码分析

    实验目的 是监控你自己系统的运行状态,看有没有可疑的程序在运行. 是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sysinternals,systracer套件 ...

  3. python基础学习1-装饰器在登陆模块应用

    LOGIN_USER ={"islogin":False} def outer(func): def inner(*args,**kwargs): if LOGIN_USER[&q ...

  4. Dlib库中实现正脸人脸关键点(landmark)检测的测试代码

    Dlib库中提供了正脸人脸关键点检测的接口,这里参考dlib/examples/face_landmark_detection_ex.cpp中的代码,通过调用Dlib中的接口,实现正脸人脸关键点检测的 ...

  5. element-ui 点击行如何获取table的行索引

    文档中有一个tableRowClassName方法,可以获取到当前行的index, tableRowClassName ({row, rowIndex}) { //把每一行的索引放进row row.i ...

  6. VI ORB-SLAM初始化与VINS初始化对比(将vi orb-slam初始化方法移植到vins中)

    初始化时需要求出的变量:相机和imu外参r t.重力g.尺度s.陀螺仪和加速度计偏置ba bg. 下面对两种算法初始化的详细步骤进行对比: 求陀螺仪偏置bg 求解公式相同,求解方法不同.公式如下,VI ...

  7. 洛咕 P2447 [SDOI2010]外星千足虫

    一开始以为是异或高斯消元,实际上是简单线性基. 直接往线性基里插入,直到线性基满了就解出来了. // luogu-judger-enable-o2 #include<bits/stdc++.h& ...

  8. 使用cJSON库解析JSON

    cJSON库的下载 cJSON是一个基于C的JSON解析库,这个库非常简单,只有cJSON.c和cJSON.h两个文件,支持JSON的解析和封装,需要调用时,只需要#include "cJS ...

  9. Tomcat 下载与安装

    下载地址:http://tomcat.apache.org 根据自己电脑的系统下载Core节点下不同的版本.   Tomcat文件目录结构 bin:存放启动与关闭Tomcat的脚本文件 conf:存放 ...

  10. python 模块之 bisect

    python一个有趣的模块,bisect,感觉挺有趣,怎么有趣呢,下面来给你道来. 我们先生成一个list data=[4,8,7,1] data.sort() 打印这个list [1,4,7,8] ...