结对作业

Posted 白雪儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结对作业相关的知识,希望对你有一定的参考价值。

前言:

四则运算结对项目成果展示,动手实现之前困惑忐忑,开发过程中劳累又收获,项目完成后满足又成长许多。

 

正文:

一:项目地址

Coding.net项目地址:https://git.coding.net/Meloody/jieduizuoye.git

 

二:预计时间

PSP表格展示:

 

 

任务内容

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

实际完成需要的时间

(min)

Planning

计划

30

*

· Estimate

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

10

*

Development

开发

1250

*

·Analysis

·需求分析 (含有学习新技术)

300

*

·Design Spec

·生成设计文档

20

*

·Design Review

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

10

*

·Coding Standard

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

15

*

·Design

·具体设计

30

*

·Coding

·具体编码

600

*

·Code Review

·代码复审

30

*

·Test

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

200

*

Modular

模块

600

*

·Computing module 计算模块 400 *
·Timing module 计时模块 200 *

Reporting

报告

490

*

·Test Report

·测试报告

420

*

·Size Measurement

·计算工作量

40

*

·Postmortem & Process Improvement Plan

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

30

*

三:接口设计

  结合Information Hiding, Interface Design, Loose Coupling的知识,说明在结对编程中是如何利用这些方法对接口进行设计的。(3\')

 

  Information Hiding方法的知识: 它是什么?是信息隐藏,指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。为什么要隐藏?首先可以隐藏复杂度:这样你就不用再去应付它,除非你要特别关注的时候;其次隐藏变化源:这样当变化发生时,其影响就能被限制在局部范围内。复杂度的根源包括复杂的数据类型、文件结构、布尔判断以及晦涩的算法等等。信息隐藏的价值:信息隐藏有着独特的启发力,它能够激发出有效的设计方案。信息隐藏同样有助于设计类的公开接口。在设计的所有层面上,都可以通过询问隐藏什么的方式达到好的设计决策。 

  

  Information Hiding方法的接口设计把类内数据误认为全局变量:为了避免全局数据可能带来的问题,可能会把类内数据误认为是全局数据并避免使用它,我们把Expression.java的answer变量由最初的全局变量变为类内数据,因为Judge.java里面有一个answer变量,为了避免Judge.java使用Expression.java的answer,我们把Judge.java的answer变量改为了ans变量名。其实只要Expression.java的answer变量的位置处于局部变量的位置就可以避免了。

 

  Interface Design方法的知识: 是什么?是接口设计,接口是一种与类相似的结构,只包含常量和抽象方法。一句简单又非常具有概括性的话:接口可以继承接口,类只能实现接口(参看博客1)。

 

   Interface Design方法的接口设计通过参数传值,类间调用等实现模块的对接(主要是Command类和Expression类)。

 

  Loose Coupling方法的知识:是什么?是松耦合,想让对象与对象间松耦合,通过增加抽象类(Abstract Class)或者接口来做到。松耦合主要用来处理可伸缩性、灵活性和容错这些需求。松耦合的目标是最小化依赖。要实现松耦合,通常的做法就是引入Mediator(中间层,也有翻译成中介者),在SOA中,这个中间层通常指的就是ESB(企业服务总线)。

 

四:计算模块

    计算模块接口的设计与实现过程。就是设计代码的组织方式,具体包括:有几个类,几个函数,他们之间的关系,画出关键函数流程图关键的算法(不展示源代码),以及独到之处。(4\')

 

(一) 整体上,模块划分如图:

(二)在project5项目/src下建立Commandl.java和Answer.java等文件。

类有七个,分别为Commandl类,Calculate类,Expression类,Judge类,Answer类,Change类和WriteReader 类。

 

Commandl:GUI首界面,选择生成怎样的算式,运算式数量,数字的范围,操作符个数以及有无乘除法等。

Calculate类,Calculate1类:分别是生成GUI界面的运行结果和命令窗口的算术表达式。

Expression类:生成GUI界面的算术表达式

Judge类:判断结果是否正确。

Answer类:小学生四则运算答题和计时界面(Thread类),反馈答题对错情况的界面。

Change类:

WriteToFile 类读取和写入用户使用四则运算的计算结果,还包含用户答题正确数量。

java.awt.Frame类,是顶级窗口,可以显示标题,重置大小。当frame被关闭的时候会产生windowevent事件,Frame无法直接监听键盘的输入事件。

java.awt.FlowLayout类,是流式布局管理器。

java.awt.TextArea类,是一个文本区组件。

 

GUI组件继承关系图如下:

 

 

(三)涉及重要函数和函数流程图及逻辑关系:

1.random()函数,生成随机数

 1 Random random=new Random(); 2 int s=random.nextInt(op); //随机选择某个运算符 

2.eval()函数,计算字符串内的运算式

 

1 double result=0;
2 try {
3      result = Double.parseDouble(String.valueOf(engine.eval(ex)));//字符型变为整型
4 } catch (ScriptException e) {
5     e.printStackTrace();
6 }

 3.createExp()函数,产生并返回计算表达式

 

 1 public String createExp() {
 2         
 3         char[] operator=new char[]{\'+\',\'-\',\'*\',\'/\'};
 4         Random random=new Random(); 
 5         int[] number=new int[Four.jtf1Num+1]; 
 6         String ex=new String();
 7         for(int j=0;j<=Four.jtf1Num;j++){
 8             number[j]=random.nextInt(Four.jpfMNum-Four.jpfNum+1)+Four.jpfNum; //运算数
 9         }
10         int q=0;
11         for(int j=0;j<Four.jtf1Num;j++){
12            int op=0;
13            if(Four.jpf1Num!=0)
14                op=4;    
15            else
16                op=2;
17         int s=random.nextInt(op); //随机选择某个运算符
18         while(s==q)   //至少两种运算符
19             s=random.nextInt(op);
20         q=s;                  
21         ex+=String.valueOf(number[j])+String.valueOf(operator[s]);
22         if(s==3){number[j+1]=decide(number[j],number[j+1],Four.jpfMNum,Four.jpfNum);}//避免出现小数
23         }
24         ex+=String.valueOf(number[Four.jtf1Num]);
25         double result=0;
26         try {
27              result = Double.parseDouble(String.valueOf(engine.eval(ex)));//字符型变为整型
28         } catch (ScriptException e) {
29             e.printStackTrace();
30         }
31         
32         if(Math.floor(result)==result&&result>0&&result<99999) {
33             return ex;
34         }else{
35             return createExp();
36         }
37         
38     }
View Code

 4.trim()函数,返回调用字符串对象的一个副本,删除起始和结尾的空格

1 Four.jtfNum = Integer.parseInt(this.jtf.getText().trim());//运算式个数
2 Four.jpfNum = Integer.parseInt(this.jpf.getText().trim());//lower            
3 Four.jpfMNum = Integer.parseInt(this.jpfM.getText().trim());//upper            
4 Four.jtf1Num = Integer.parseInt(this.jtf1.getText().trim());//sumOfOperation
5 Four.jpf1Num = Integer.parseInt(this.jpf1.getText().trim());//有无乘数法

 5.decide()函数,产生整数,防止出现分数

 1 private int decide(int x,int y,int max,int min){
 2         Random random=new Random();
 3         if(x%y!=0){
 4             y=random.nextInt(max-min+1)+min;
 5             return decide(x,y,max,min);
 6         }
 7         else{
 8             return y; 
 9         }
10     }

 6.start()方法,thread类的方法,真正实现了多线程运行,无需等待。run()方法必须是public访问权限,返回值类型为void

 1 thread.start(); // 计数线程一直运行

7.run()方法,thread类的方法,放有需要并行处理的代码,相当于普通方法的方式调用,程序顺序执行

 

1 public void run() { 2 while (true) { 3 if (!stopped) { 4 long elapsed = System.currentTimeMillis() - programStart; 5 label.setText(format(elapsed)); 6 } 7 try { 8 sleep(1); // 1毫秒就更新1次 9 } catch (InterruptedException e) { 10 e.printStackTrace(); 11 System.exit(1); 12 } 13 } 14 }

8.Commandl.java主界面,整体布局。

 

  1 public class Command extends JFrame {
  2     private static final long serialVersionUID = 1L;
  3     // 定义登录界面的组件
  4     JButton jb1, jb2, jb3 = null;
  5     JPanel jp1, jp2, jp3, jp4,jp5,jp6= null;
  6     JTextField jtf = null;
  7     JTextField jpf = null;
  8     
  9     JTextField jpfM = null;
 10     
 11     JTextField jtf1 = null;
 12     JTextField jpf1= null;
 13     
 14     JLabel jlb1, jlb2,jlb3, jlb4= null;
 15     ButtonGroup bg = null;
 16     static int exepresionNum = 0;
 17     
 18     static int exepresionRangeNum;
 19     
 20     static int jtfNum = 0;
 21     static int jpfNum = 0;
 22     
 23     static int jpfMNum = 0;
 24     
 25     static int jtf1Num = 1;
 26     static int jpf1Num = 0;
 27 
 28     public static void main(String[] args) {
 29         new Command();
 30     }
 31 
 32     // 构造函数
 33     public Command() {
 34         // 创建组件
 35         jb1 = new JButton("确认");
 36         jb2 = new JButton("刷新");
 37         jb3 = new JButton("退出");
 38         // 设置监听
 39         jb1.addActionListener(new ActionListener() {
 40 
 41             @Override
 42             public void actionPerformed(ActionEvent e) {
 43                 OK();
 44             }
 45         });
 46         jb2.addActionListener(new ActionListener() {
 47 
 48             @Override
 49             public void actionPerformed(ActionEvent e) {
 50                 clear(); 
 51             }
 52         });
 53         jb3.addActionListener(new ActionListener() {
 54 
 55             @Override
 56             public void actionPerformed(ActionEvent e) {
 57                 System.exit(0);
 58             }
 59         });
 60 
 61         jp1 = new JPanel();
 62         jp2 = new JPanel();
 63         jp3 = new JPanel();
 64         jp4 = new JPanel();
 65         jp5 = new JPanel();
 66         jp6 = new JPanel();
 67 
 68         jlb1 = new JLabel("生成题目个数:");
 69         jlb2 = new JLabel("题目数值范围:");
 70         jlb3 = new JLabel("操作符个数:");
 71         jlb4 = new JLabel("乘除法 0无1有:");
 72以上是关于结对作业的主要内容,如果未能解决你的问题,请参考以下文章

结对编程作业

结对编程第一次作业

《结对作业》——软件工程作业

结对-结对编程项目作业名称-结对项目总结

结对作业(软件工程第四次作业)

结对作业