结对作业
项目地址:https://git.coding.net/cuixh998/homework2.git
前言:
空闲时间一直在学java,一直在学java,和考虑这次作业怎么做,本来上次作业做的就很差,因为基础就在这,基础就很差,只能自己摸着石头过河,也有过熬夜做过,天赋实在是有限,也只是做出了个大概,弯沉了一部分,和那写作的好的同学相比简直是一毛不值,但对我自己来说,可能也是一种进步吧,然后可能对于我这种比较差的,结对也相对较难,最后我和其他两个人凑在了一起,有点不满足要求,我们三个只能自己慢慢来,相互鼓励吧!
1 和12psp表格:
PSP2.1 |
任务内容 |
计划共完成需要的时间(min) |
实际完成需要的时间(min) |
Planning |
计划 |
30 |
45 |
· Estimate |
· 估计这个任务需要多少时间,并规划大致工作步骤 |
9 |
15 |
Development |
开发 |
5000 |
4500 |
· Analysis |
· 需求分析 (包括学习新技术) |
900 |
8000 |
· Design Spec |
· 生成设计文档 |
5 |
10 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
400 |
600 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
50 |
200 |
· Design |
· 具体设计 |
680 |
900 |
· Coding |
· 具体编码 |
7000 |
8500 |
· Code Review |
· 代码复审 |
20 |
60 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
100 |
120 |
Reporting |
报告 |
30 |
40 |
· Test Report |
· 测试报告 |
6 |
15 |
· Size Measurement |
· 计算工作量 |
10 |
10 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
15 |
12 |
3对接口进行设计:
①信息隐蔽
是指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。在出题和计算的过程之中体现出了信息隐藏,
对于访问的人来说,代码的重要部分是不能随意修改的,private作为一种权限修饰符可以修饰类,属性和方法,用private修饰的类属性,方法,只能自己使用,对别的类是不能访问的,也就是说对于
别的类来说是隐藏不可见的,这样可以对代码进行保护。
②接口部件设计
对接口编程,减少了程序报错的可能性,可以更好地对内容进行扩展
③松散耦合
有关松散耦合与接口的使用
一个软件,它具有许多类,类与类之间需要互相调用,一旦某个类与另一个类具有紧密耦合关系的时候,这个软件的重用性就会大大降低。所以一个软件的重用性的高低就取决于它的耦合程度的高低。
而耦合度是指程序模块之间的关联、依赖程度;
为避免这种情况,需要降低A与B之间的耦合度,目的就在于,无论B的形式如何,只要B仍然能够实现A所需要的功能,A就不需要重写代码,
解决方法:令B实现某种接口I,定义 I.Method(); 同时A在调用B的方法时候直接调用I的方法即可;而从前会将B当作参数传给A,然后A再调用B的方法的地方:
- {
- A.AMethod( B b ) {
- b.BMethod();
- /*….*/
- }
- }
修改成:
- {
- A.AMethod( I i ) {
- i.Method();
- }
- }
在这里,B只需要实现I.Method()方法即可,完全隐藏了实现细节。
按照这种方法,既实现了类与类之间的松散耦合,大大增强了类的可重用性。回顾从前学过的设计模式,可以发现,这与Observer模式有相似之处。
分别在 awt.event. ActionEvent; awt.event.ActionListener; io.PrintStream; util.ArrayList; util.List; util.Scanner 几个函数之中实现,
在计算过程中的关键是要对表达式中的每个元素进行从左到右的遍历,如果元素是数字的话,输出,如果不是数字的话,就判断那个优先级比较高,然后按顺序进行输出,
awt.event.包含用于创建用户界面和绘制图形图像的所有类,创建出用户界面,
ActionEvent 是一种高级事件,比如鼠标点击按钮,菜单项;在有焦点的按钮上按下回车键等都会变成激发ActionEvent。创建出选择选项,PrintStream 是打印输出流,它继承于FilterOutputStream。
PrintStream 是用来装饰其它输出流。它能为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式,打印出数据。ArrayList是一种可变长列表,基于数组实现。在这个类中,实现了List接口
中定义的所有的可选方法,并且对其中可以放入的元素也没有限制。这些共同实现了输出模块。
5
项目 | 用时 |
使用JProfiler工具分析调试 | 6(h) |
查找影响性能的程序模块 | 3(h) |
性能改进 |
4(h) |
我发现程序中在计算之前每一步都要进行一下判定,但有些判定是并不需要的,于是我进行了程序的微改:
6
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Main {
int grade=0;
int number=1;
int all;
JFrame jf =new JFrame();
JPanel jp=new JPanel();
JLabel jl=new JLabel();
JLabel jl1=new JLabel("请输入答案");
JTextArea jt=new JTextArea();
JTextField jtf=new JTextField();
JButton jb=new JButton("确定并提交");
Font f=new Font("黑体", Font.BOLD, 30 );
List< String> list1=new ArrayList<>();//存放题目
List< String> list2=new ArrayList<>();//存放对应的答案
public Main(){
f1();
jp.setLayout(null);
jl.setText("第"+number+"题");
jf.setVisible(true);
jf.setResizable(false);
jf.setBounds(400, 200, 600, 600);
jl.setBounds(0, 0, 600, 60);
jt.setBounds(0, 60, 600, 300);
jt.setText(list1.get(number-1));
jl1.setBounds(0, 370, 600, 50);
jtf.setBounds(0, 430, 600, 50);
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
number++;
jl.setText("第"+number+"题");
System.out.println(list1.get(number-1));
jt.setText(list1.get(number-1));
if(jtf.getText().equals(list2.get(number-1))){
grade++;
}
if(number==all){
JOptionPane.showMessageDialog(null, "你做对了"+grade+"道题");
}
}
});
jb.setBounds(240, 500, 100, 30);
jp.add(jtf);
jp.add(jl1);
jp.add(jl);
jp.add(jt);
jp.add(jb);
jl.setFont(f);
jt.setFont(f);
jtf.setFont(f);
jl1.setFont(f);
jl.setForeground(Color.GREEN);
jf.add(jp);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void f1(){
int i,n;//循环变量,生成算式数n
Scanner in=new Scanner(
n=in.nextInt();
all=n;
try {
PrintStream ps = new PrintStream("result.txt");// 生成文件
System.setOut(ps);
} catch (Exception e) {
System.out.println("文件生成错误");// 提示
}
System.out.println("Pairing project");
System.out.println(n);
for(i=0;i<n;i++) {
work(n);
}
}
代码覆盖率:
主要在于对数字和符号的判定,还有对括号的判定,因此为了增加覆盖率,逐渐的引进加减乘除法,还有括号。
int grade=0;
int number=1;
int all;
JFrame jf =new JFrame();
JPanel jp=new JPanel();
JLabel jl=new JLabel();
JLabel jl1=new JLabel("请输入答案");
JTextArea jt=new JTextArea();
JTextField jtf=new JTextField();
JButton jb=new JButton("确定并提交");
Font f=new Font("黑体", Font.BOLD, 30 );
List< String> list1=new ArrayList<>();//存放题目
List< String> list2=new ArrayList<>();//存放对应的答案
public Main(){
f1();
jp.setLayout(null);
jl.setText("第"+number+"题");
jf.setVisible(true);
jf.setResizable(false);
jf.setBounds(400, 200, 600, 600);
jl.setBounds(0, 0, 600, 60);
jt.setBounds(0, 60, 600, 300);
jt.setText(list1.get(number-1));
jl1.setBounds(0, 370, 600, 50);
jtf.setBounds(0, 430, 600, 50);
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
number++;
jl.setText("第"+number+"题");
System.out.println(list1.get(number-1));
jt.setText(list1.get(number-1));
if(jtf.getText().equals(list2.get(number-1))){
grade++;
}
if(number==all){
JOptionPane.showMessageDialog(null, "你做对了"+grade+"道题");
}
}
});
jb.setBounds(240, 500, 100, 30);
jp.add(jtf);
jp.add(jl1);
jp.add(jl);
jp.add(jt);
jp.add(jb);
jl.setFont(f);
jt.setFont(f);
jtf.setFont(f);
jl1.setFont(f);
jl.setForeground(Color.GREEN);
jf.add(jp);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
搜索了界面是怎样做的,以我们的能力和水准,选择了较为简单的开始做起
对用户的题目进行正确与否判定
最后
10结对的过程
11结对编程的优缺点
优点:可以相互学习,曾进同学之间的感情,对于不常敲代码的我们来说更是一种督促,也是一种历练;
缺点:有时会在某一方面交流有点问题,可能是第一次结对,对很多问题还不会处理