結對做業

1.Coding.Net項目地址https://git.coding.net/Meloody/jieduizuoye.git

2.PSP表格

在末尾。java

3.Information Hiding, Interface Design, Loose Coupling

Information Hiding(信息隱藏):指在設計和肯定模塊時,使得一個模塊內包含的特定信息(過程或數據),對於不須要這些信息的其餘模塊來講,是不可訪問的,是一種重要的軟件開發手段,它與對象的封裝(encapsulation)與模塊化(modularity)密切相關。git

咱們在實現的過程當中常常發生變量混亂的問題,致使常常會莫名的產生錯誤,致使咱們去查看前面編寫的代碼,後來就常常運用privite ,須要的話就經過訪問函數實現。算法

private String exe;
private Object answer;

Interface Design(接口設計):面向接口編程是軟件工程領域經常使用的設計手段編程

Loose Coupling(鬆耦合):容許改變或者當問題發生在「電線的一端時」來避免影響到其餘的端點,目標是最小化依賴。小程序

4.計算模塊接口的設計與實現過程

     Commandl類:GUI界面;less

     Calculate類:運行結果以及表達式中符號的轉換;ide

     Expression類:產生知足要求的「題目「;模塊化

     Judge類:將輸入數字與正確結果進行比較並記錄總共正確的題數;函數

     Change類:替換符號;佈局

     Answer類:GUI答題界面的後續模塊;

算法的關鍵對我本身來講就是輸入結果和正確結果的各類處理,剛開始因爲沒處理好,致使realyAnswe傳的空值,程序沒法正常運行,搗鼓了很久才弄好。至於獨到之處,咱們本來是想將「*「與」/「換成小學生所熟悉的計算符號,可是沒成功,有點惋惜。

5.計算模塊接口部分的性能改進

經過參數傳值,類間調用等實現模塊的對接(主要是Commandl類和Expression類)。參考Frofile教程,學習軟件用了約三小時,內存消耗如圖:分析可知相對穩定。

 

最初由項目的Commandl.java右鍵Profile As,進入性能分析,其次打開JVM虛擬機(能夠用教程的密碼破解Frofile軟件)。

而後進入Live memory,最初消耗變化如圖:

 等待兩分鐘後,出現紅色綠色並存現象:

性能分析排查後,發現代碼還有不足,進行優化處理。花費了約一小時,代碼優化改進了,而且把佔用內存的四則運算GUI小程序關閉,IO輸入流關閉,性能如圖明顯提升。

6.單元測試

7.異常處理

(一)Java標準褲內建了一些通用的異常,這些類以Throwable爲頂層父類:

(二)判斷參數範圍是否符合題意

public static boolean scope(int num){
        if(num<=0||num>=10001)
            return false;
        else{
            return true;
        }

}

(三)判斷參數的格式是否正確

try {
       num = Integer.parseInt(args[++i]);
  } catch (NumberFormatException e) {
       e.printStackTrace();
       return;
  }

 

8.界面模塊的詳細設計過程

咱們在設計的時候就想主要分紅三個界面

第一個界面是用來進行對題目數量的要求,包括題目數量,數值範圍,有無乘除法以及運算符的個數;

第二個界面是包括生成的題目,咱們須要輸入的答案,以及計時功能;

第三個界面則是提示咱們結果的正確,以及歷史全部的總正確數目;

import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Command extends JFrame {
    private static final long serialVersionUID = 1L;
    // 定義登陸界面的組件
    JButton jb1, jb2, jb3 = null;
    JPanel jp1, jp2, jp3, jp4,jp5,jp6= null;
    JTextField jtf = null;
    JTextField jpf = null;
    
    JTextField jpfM = null;
    
    JTextField jtf1 = null;
    JTextField jpf1= null;
    
    JLabel jlb1, jlb2,jlb3, jlb4= null;
    ButtonGroup bg = null;
    static int exepresionNum = 0;
    
    static int exepresionRangeNum;
    
    static int jtfNum = 0;
    static int jpfNum = 0;
    
    static int jpfMNum = 0;
    
    static int jtf1Num = 1;
    static int jpf1Num = 0;

    public static void main(String[] args) {
        new Command();
    }

    // 構造函數
    public Command() {
        // 建立組件
        jb1 = new JButton("確認");
        jb2 = new JButton("刷新");
        jb3 = new JButton("退出");
        // 設置監聽
        jb1.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                OK();
            }
        });
        jb2.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                clear(); 
            }
        });
        jb3.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });

        jp1 = new JPanel();
        jp2 = new JPanel();
        jp3 = new JPanel();
        jp4 = new JPanel();
        jp5 = new JPanel();
        jp6 = new JPanel();

        jlb1 = new JLabel("生成題目個數:");
        jlb2 = new JLabel("題目數值範圍:");
        jlb3 = new JLabel("操做符個數:");
        jlb4 = new JLabel("乘除法 0無1有:");

        jtf = new JTextField(10);
        jpf = new JTextField(4);
        
        jpfM = new JTextField(4);
        
        jtf1 = new JTextField(10);
        jpf1 = new JTextField(10);
        // 加入到JPanel中
        jp1.add(jlb1);
        jp1.add(jtf);

        jp2.add(jlb2);//jpfM是最大值
        jp2.add(jpf);
        jp2.add(jpfM);
        
        
        jp5.add(jlb3);
        jp5.add(jtf1);

        jp6.add(jlb4);
        jp6.add(jpf1);

        jp4.add(jb1);
        jp4.add(jb2);
        jp4.add(jb3);
        // 加入JFrame中
        this.add(jp1);
        this.add(jp2);
        this.add(jp5);
        this.add(jp6);
        this.add(jp3);
        this.add(jp4);
        

        // 設置佈局管理器
        jlb1.setFont(new java.awt.Font("Dialog", 0, 20));
        jlb2.setFont(new java.awt.Font("Dialog", 0, 20));
        jlb3.setFont(new java.awt.Font("Dialog", 0, 20));
        jlb4.setFont(new java.awt.Font("Dialog", 0, 20));
        jtf.setFont(new Font("宋體", Font.PLAIN, 20));
        jpf.setFont(new Font("宋體", Font.PLAIN, 20));
        
        jpfM.setFont(new Font("宋體", Font.PLAIN, 20));
        
        jtf1.setFont(new Font("宋體", Font.PLAIN, 20));
        jpf1.setFont(new Font("宋體", Font.PLAIN, 20));
        Font f = new Font("華文行楷", Font.BOLD, 20);
        jb1.setFont(f);
        jb2.setFont(f);
        jb3.setFont(f);
        this.setLayout(new GridLayout(4, 1));
        // 給窗口設置標題
        this.setTitle("小學生四則運算界面");
        // 設置窗體大小
        this.setSize(600, 300);
        // 設置窗體初始位置
        this.setLocation(700, 330);
        // 設置當關閉窗口時,保證JVM也退出
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 顯示窗體
        this.setVisible(true);
        this.setResizable(true);
    }

    // 清空文本框
    public void clear() {
        jtf.setText("");
        jpf.setText("");
        
        jpfM.setText("");
        
        jtf1.setText("");
        jpf1.setText("");
    }
import javax.swing.*;

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Answer extends JFrame {
    private static final long serialVersionUID = 1L;

    private static final String INITIAL_LABEL_TEXT = "00:00:00 000";
    // 線程
    private CountingThread thread = new CountingThread();
    // 開始時間
    private long programStart = System.currentTimeMillis();
    // 程序暫停
    private JLabel label = new JLabel(INITIAL_LABEL_TEXT);

    JButton button, quit = null;
    JPanel yh, yh1, yh2 = null;
    JLabel question = null;
    static JTextField answer = null;
    Expression exp;
if (answer.getText().isEmpty()) {
            JOptionPane.showMessageDialog(null, "請輸入答案!", "提示消息",
                    JOptionPane.WARNING_MESSAGE);
        } else if (jud.judge(this.exp.getAnswer(), answer.getText())) {
            JOptionPane
                    .showMessageDialog(
                            null,
                            "正確答案爲"
                                    + this.exp.getAnswer()
                                    + ".  "
                                    + "恭喜你答對了.  耗時"
                                    + (System.currentTimeMillis() - programStart)
                                    + "ms"
                                    + ".  "
                                    + "本次答對"
                                    + Judge.rightnum
                                    + ",共答對"
                                    + (Integer.parseInt(WriteReader.reader()
                                            .trim()) + Judge.rightnum) + "道題"/*+(Integer.parseDouble(Judge.rightnum/Four.jtfNum))*/,
                            "提示消息", JOptionPane.WARNING_MESSAGE);
            Command.create();
            dispose();
        } else { 
            JOptionPane
                    .showMessageDialog(
                            null,
                            "正確答案爲"
                                    + this.exp.getAnswer()
                                    + ".  "
                                    + "很遺憾答錯了.  耗時"
                                    + (System.currentTimeMillis() - programStart)
                                    + "ms"
                                    + ".  "
                                    + "本次答對"
                                    + Judge.rightnum
                                    + ",共答對"
                                    + (Integer.parseInt(WriteReader.reader()
                                            .trim()) + Judge.rightnum) + "道題",
                            "提示消息", JOptionPane.WARNING_MESSAGE);
            Command.create();
            dispose();
        }
    }

9.界面模塊與計算模塊的對接

經過依靠參數傳值實現模塊的對接(主要是Command類和Expression類)

界面具體介紹:

(1)第一個界面對題目要求的限制

(2)要求信息輸入完整(不完整)的界面

(3)題目界面

(4)答案正確(錯誤)的提示界面

(5)不輸答案直接提交的界面

10.描述結對的過程

咱們在結對的過程當中花了不少時間在代碼上,也在分析的階段肯定了各自的須要分工的範圍,好比單元測試和性能分析的學習。

11.結對編程的優勢和缺點

遇到問題能夠更好更快的解決,並且對一些細節能夠進行分工,加快咱們的實現進程,可是咱們在結對的過程當中彼此的想法會產生分歧,這有時也會浪費許多時間來達成共識。

成員優缺點:

衛小瓊:代碼能力強,能鑽研,同窗關係好,解決不了的問題能找到人幫忙,可是有時會鑽牛角尖;

陳雙林:脾氣好,能堅持,有上進心,可是編碼能力弱。

12.PSP表格

 

SP2.1

    Personal Software

       Process Stages

            Time 

     SeniorStudentmin

 Time 

SDEmin

           Planning

                 計劃

30

      40

Estimate

  估計這個任務須要多少時間,規劃大體步驟

                      10

                    10

         Development

                  開發

                      1250

                  2375

           Analysis

   需求分析 (包括學習新技術)

                       300

                   400

         Design Spec

           生成設計文檔

                        20

                    30

        Design Review

               設計複審 

                         10

                    20

         Coding Standard

               代碼規範 

                        15

                    20

             Design

               具體設計

                        30

                    60

             Coding

               具體編碼

                       600 

                   1500

           Code Review

               代碼複審

                        30

                    45

              Test

                  測試

                        200

                    300

           Reporting

                  報告

                         490   

                    850

  • Test Report

                測試報告

                        420

                   780

  • Size Measurement

              計算工做量

                        40

                     40 

  • Postmortem& ProcessImprovement Plan

                過後總結

       並提出過程改進計劃

                         30

30

相關文章
相關標籤/搜索