1. 程式人生 > >20165218 實驗二 Java面向對象程序設計

20165218 實驗二 Java面向對象程序設計

dex ring http pen ref double 一點 主動 charat

實驗二 Java面向對象程序設計

課程:java程序設計

姓名:趙冰雨

學號:20165218

指導教師:婁嘉鵬

實驗日期:2018.4.16

實驗密級:Java開發環境的熟悉

實驗內容、步驟與體會:

(一)單元測試

  • 實驗要求

    參考 http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST

參考http://www.cnblogs.com/rocedu/p/6736847.html

提交最後三個測試用例都通過的截圖

  • 實驗步驟
  1. 根據偽代碼編寫產品代碼MyUtil.java
  2. 新建一個測試代碼MyUtil.java
  3. 測試多種情況,包括正常情況,異常情況(負分或大於100的乘積),邊界情況,並根據測試結果調整產品代碼(以上是自己編寫測試代碼的過程)
  4. 新建測試文件夾test,並將其改成可作為源代碼編譯
    技術分享圖片

技術分享圖片

  1. 在test文件夾下新建MyUtilTest.jva,輸入代碼:
import org.junit.Test;
import junit.framework.TestCase;
public class MyUtilTest extends TestCase {
    @Test
    public void testNormal() {
        assertEquals("不及格", MyUtil.percentage2fivegrade(55));
        assertEquals("及格", MyUtil.percentage2fivegrade(65));
        assertEquals("中等", MyUtil.percentage2fivegrade(75));
        assertEquals("良好", MyUtil.percentage2fivegrade(85));
        assertEquals("優秀", MyUtil.percentage2fivegrade(95));
    }
}
  1. 運行成功
    技術分享圖片

  2. 出現語法錯誤時
    File->Project Structure
    技術分享圖片

技術分享圖片

在IDEA安裝地址下找到如下三個文件並添加即可


(二)面向對象的三要素

  • 實驗要求

    參考 積極主動敲代碼,使用JUnit學習Java
    (http://www.cnblogs.com/rocedu/p/4837092.html)

參考http://www.cnblogs.com/rocedu/p/6736847.html

以 TDD的方式研究學習StringBuffer,提交你的單元測試用例和測試通過的截圖

  • 實驗步驟
  1. 編寫測試用例代碼
/**
 * Created by zby on 2018/4/16.
 */
public class StringBufferDemo {
    public static void main(String[] args) {
        StringBuffer buffer = new StringBuffer();
        buffer.append(‘S‘);
        buffer.append("tringBuffer");
        System.out.println(buffer.charAt(1));
        System.out.println(buffer.capacity());
        System.out.println(buffer.indexOf("tring"));
        System.out.println("buffer = " + buffer.toString());
        System.out.println(buffer.length());
    }
}
  1. 測試代碼
import junit.framework.TestCase;
import org.junit.Test;

/**
 * Created by zby on 2018/4/16.
 */

import junit.framework.TestCase;
import org.junit.Test;

import static org.junit.Assert.*;

public class StringBufferTest extends TestCase {
    StringBuffer string1 = new StringBuffer("hellojava");//測試9個字符
    StringBuffer string2 = new StringBuffer("To be or not to be");//測試18個字符
    StringBuffer string3 = new StringBuffer("Quando abbandonare ogni speranza");//測試32個字符

    @Test
    public void testCharAt() {
        assertEquals(‘h‘, string1.charAt(0));
        assertEquals(‘e‘, string2.charAt(4));
        assertEquals(‘a‘, string3.charAt(7));
    }

    @Test
    public void testCapacity() {
        assertEquals(25, string1.capacity());
        assertEquals(34, string2.capacity());
        assertEquals(48, string3.capacity());
    }

    @Test
    public void testindexOf() {
        assertEquals(0, string1.indexOf("he"));
        assertEquals(9, string2.indexOf("not"));
        assertEquals(7, string3.indexOf("abbando"));
    }

    @Test
    public void testlength() {
        assertEquals(9, string1.length());
        assertEquals(18, string2.length());
        assertEquals(32, string3.length());
    }
}
  1. 如果顯示測試失敗(如下圖),根據提示修改測試代碼技術分享圖片
  2. 測試成功技術分享圖片

(三)設計模式初步

  • 實驗內容

    參考http://www.cnblogs.com/rocedu/p/6736847.html

對設計模式示例進行擴充,體會OCP原則和DIP原則的應用,初步理解設計模式

用自己的學號%6進行取余運算,根據結果進行代碼擴充:

0: 讓系統支持Byte類,並在MyDoc類中添加測試代碼表明添加正確,提交測試代碼和運行結的截圖,加上學號水印

  • 實驗步驟
  1. 設計編寫代碼Data.javaMyDoc.java
/**
 * Created by zby on 2018/4/16.
 */
abstract class Data {
    abstract public void DisplayValue();
}

class Integer extends Data {
    int value;

    Integer() {
        value = 100;
    }

    public void DisplayValue() {
        System.out.println(value);
    }
}

class Byte extends Data {
    byte value;

    Byte() {
        value = (byte) 20165218;
    }

    public void DisplayValue() {
        System.out.println(value);
    }
}

// Pattern Classes
abstract class Factory {
    abstract public Data CreateDataObject();
}

class IntFactory extends Factory {
    public Data CreateDataObject() {
        return new Integer();
    }
}

class ByteFactory extends Factory {
    public Data CreateDataObject() {
        return new Byte();
    }
}

//Client classes
class Document {
    Data data;

    Document(Factory factory) {
        data = factory.CreateDataObject();
    }

    public void DisplayData() {
        data.DisplayValue();

    }
}
public class MyDoc {
    static Document d;

    public static void main(String[] args) {
        d = new Document(new ByteFactory());
        d.DisplayData();
    }
}
  1. 技術分享圖片

(四)練習

  • 實驗內容

    提交:單元測試代碼和運行成功截圖及碼雲上代碼鏈接,截圖要加上學號水印

參考http://www.cnblogs.com/rocedu/p/6736847.html

任務:以TDD的方式開發一個復數類Complex,要求如下:

//偽代碼
// 定義屬性並生成getter,setter
double RealPart;
double ImagePart;
// 定義構造函數
public Complex()
public Complex(double R,double I)

//Override Object
public boolean equals(Object obj)
public String toString()

// 定義公有方法:加減乘除
Complex ComplexAdd(Complex a)
Complex ComplexSub(Complex a)
Complex ComplexMulti(Complex a)
Complex ComplexDiv(Complex a)
  • 實驗步驟
  1. 產品代碼
/**
 * Created by zby on 2018/4/16.
 */
public class Complex {

    // 定義屬性並生成getter,setter
    private double RealPart;
    private double ImagePart;

    // 定義構造函數
    public Complex() {

    }

    public Complex(double R, double I) {
        this.RealPart = R;
        this.ImagePart = I;
    }

    public double getRealPart() {
        return RealPart;
    }

    public void setRealPart(double realPart) {
        RealPart = realPart;
    }

    public double getImagePart() {
        return ImagePart;
    }

    public void setImagePart(double imagePart) {
        ImagePart = imagePart;
    }

    //Override Object
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (!(obj instanceof Complex)) {
            return false;
        }
        Complex complex = (Complex) obj;
        if (complex.RealPart != ((Complex) obj).RealPart) {
            return false;
        }
        if (complex.ImagePart != ((Complex) obj).ImagePart) {
            return false;
        }

        return true;
    }

    public String toString() {
        String string = "";
        if (ImagePart > 0)
            string = RealPart + "+" + ImagePart + "i";
        if (ImagePart == 0)
            string = RealPart + "";
        if (ImagePart < 0)
            string = RealPart + " " + ImagePart + "i";
        return string;
    }

    // 定義公有方法:加減乘除
    Complex ComplexAdd(Complex a) {
        return new Complex(RealPart + a.RealPart, ImagePart + a.ImagePart);
    }

    Complex ComplexSub(Complex a) {
        return new Complex(RealPart - a.RealPart, ImagePart - a.ImagePart);
    }

    Complex ComplexMulti(Complex a) {
        return new Complex(RealPart * a.RealPart - ImagePart * a.ImagePart, ImagePart * a.RealPart + RealPart * a.ImagePart);
    }

    Complex ComplexDiv(Complex a) {
        Complex d = new Complex();
        d.RealPart = (this.RealPart * a.RealPart + this.ImagePart * a.ImagePart) / (a.RealPart * a.RealPart + a.ImagePart * a.ImagePart);
        d.ImagePart = (this.ImagePart * a.RealPart - this.RealPart * a.ImagePart) / (a.RealPart * a.RealPart + a.ImagePart * a.ImagePart);
        return d;

    }
}
  1. 測試代碼
/**
 * Created by zby on 2018/4/16.
 */

import org.junit.*;

import static org.junit.Assert.*;

public class ComplexTest {
    Complex a = new Complex(1, 2);
    Complex b = new Complex(1, -4);

    @Test
    public void testAdd() {
        assertEquals("2.0 -2.0i", a.ComplexAdd(b).toString());
        System.out.println(a.ComplexAdd(b));
    }

    @Test
    public void testSub() {
        assertEquals("0.0+6.0i", a.ComplexSub(b).toString());
        System.out.println(a.ComplexSub(b));
    }

    @Test
    public void testMulti() {
        assertEquals("9.0 -2.0i", a.ComplexMulti(b).toString());
        System.out.println(a.ComplexMulti(b));
    }

    @Test
    public void testDiv() {
        assertEquals("-0.4117647058823529+0.35294117647058826i", a.ComplexDiv(b).toString());
        System.out.println(a.ComplexDiv(b));
    }
}
  1. 測試結果
    技術分享圖片

(五)UML圖繪制

  • 實驗內容

    使用WhiteStarUML對實驗二中的代碼進行建模,發類圖的截圖,加上學號水印。

參考http://www.cnblogs.com/rocedu/p/6736847.html

  • 實驗步驟
  1. 打開StarUML後,File->New新建一個文件
  2. 單擊Class拖動到畫布上,修改類的名稱技術分享圖片

回車確認技術分享圖片

  1. 右鍵單擊類,添加對象和方法(如圖所示)技術分享圖片

  2. 雙擊對象或方法的名字可修改,單擊小加號可以添加一個新的對象或方法技術分享圖片

  3. 點擊對象或方法,Properties->Visibility,修改訪問權限技術分享圖片

  4. 完成技術分享圖片


代碼實現


PSP時間圖

步驟 耗時 百分比
需求分析 20min 6%
設計 30min 9%
代碼實現 90min 27.3%
測試 120min 36.4%
分析總結 70min 21%

分析單元測試的好處

  1. 幫助開發人員編寫代碼,提升質量、減少bug。
  2. 提升反饋速度,減少重復工作,提高開發效率。
  3. 保證你最後的代碼修改不會破壞之前代碼的功能。
  4. 讓代碼維護更容易。
  5. 有助於改進代碼質量和設計。

參考資料

  1. 實驗二《Java面向對象程序設計》的一點說明
  2. 為什麽要編寫單元測試?單元測試的優勢及優點
  3. 實驗二 Java面向對象程序設計
  4. Intellj IDEA 簡易教程

20165218 實驗二 Java面向對象程序設計