2016-2017-2 20155326實驗二《Java面向對象程序設計》實驗報告

2016-2017-2 20155326實驗二《Java面向對象程序設計》實驗報告

實驗內容

初步掌握單元測試和TDDjava

理解並掌握面向對象三要素:封裝、繼承、多態程序員

初步掌握UML建模編程

熟悉S.O.L.I.D原則設計模式

瞭解設計模式編程語言

實驗要求

1.參考Intellj IDEA 簡易教程
提交最後三個測試用例都經過的截圖,截圖上要有畫圖加水印,輸入本身的學號。模塊化

2.參考 積極主動敲代碼使用JUnit學習Java,以 TDD的方式研究學習StringBuffer,提交你的單元測試用例和測試經過的截圖,截圖要加上學號水印。函數

3.實驗二 Java面向對象程序設計工具

對設計模式示例進行擴充,體會OCP原則和DIP原則的應用,初步理解設計模式用本身的學號%6進行取餘
運算,根據結果進行代碼擴充:單元測試

讓系統支持Boolean類,並在MyDoc類中添加測試代碼代表添加正確學習

4.以TDD的方式開發一個複數類Complex支持加減乘除。

5.使用StarUML對實驗二中的代碼進行建模,發類圖的截圖,加上學號水印。類圖中至少兩個類。

實驗步驟

(一)單元測試

編程是智力活動,不是打字,編程前要把幹什麼、如何幹想清楚才能把程序寫對、寫好。因此當想用程序解決問題時,要會寫三種碼:僞代碼、產品代碼、測試代碼。
  • 僞代碼

  • 產品代碼

  • 測試代碼

基本瞭解三種代碼後,開始編譯各類測試代碼測試程序是不是徹底正確的。測試及結果以下圖:

(2) TDD(Test Driven Devlopment, 測試驅動開發)

TDD的通常步驟以下:

明確當前要完成的功能,記錄成一個測試列表

快速完成編寫針對此功能的測試用例

測試代碼編譯不經過(沒產品代碼呢)

編寫產品代碼

測試經過

對代碼進行重構,並保證測試經過(重構下次實驗練習)

循環完成全部功能的開發

基於TDD,咱們不會出現過分設計的狀況,需求經過測試用例表達出來了,咱們的產品代碼只要讓測試經過就能夠了。

基本瞭解完TDD後開始進行實驗,實驗結果以下圖所示:

(三)面向對象三要素:封裝、繼承、多態

(1)抽象

抽象一詞的本意是指人在認識思惟活動中對事物表象因素的捨棄和對本質因素的抽取。抽象是人類認識復瑣事物和現象時常用的思惟工具,抽象思惟能力在程序設計中很是重要,"去粗取精、化繁爲簡、由表及裏、異中求同"的抽象能力很大程度上決定了程序員的程序設計能力。

抽象就是抽出事物的本質特徵而暫時不考慮他們的細節。對於複雜系統問題人們藉助分層次抽象的方法進行問題求解;在抽象的最高層,可使用問題環境的語言,以歸納的方式敘述問題的解。在抽象的較低層,則採用過程化的方式進行描述。在描述問題解時,使用面向問題和麪向實現的術語。

程序設計中,抽象包括兩個方面,一是過程抽象,二是數據抽象。
咱們舉個例子說明一下。好比有了如下Java代碼:

System.out.println(1);

System.out.println(2);

System.out.println(3);

能夠打印出「1,2,3」,想打引「1,2,3,4」怎麼辦?同窗們的作法大可能是把上面的代碼拷貝下來,再加一行:

System.out.println(1);

System.out.println(2);

System.out.println(3);

System.out.println(4);

這就是沒有學會過程抽象的作法「拷貝粘貼」式開發。解決問題沒?解決了,但有問題,好比想打印出「1..100"怎麼辦?粘貼100行?這兩段代碼有三行重複的代碼,違反了常見的一個編程原則DRY(Don't Repeat Yourself),解決的方法是進行過程抽象,寫一個函數printn:

public void printn(int n){
    for(int i=1;  i<=n; i++)
        System.out.println(n);
}

上面兩段代碼就能夠用;

printn(3);
printn(4);

代替了,打印出「1..100"也很簡單,只要調用printn(100);就好了。

  • 面向對象(Object-Oriented)的三要素包括:封裝、繼承、多態。

面向對象的思想涉及到軟件開發的各個方面,如面向對象分析(OOA)、面向對象設計(OOD)、面向對象編程實現(OOP)。OOA根據抽象關鍵的問題域來分解系統,關注是什麼(what)。OOD是一種提供符號設計系統的面向對象的實現過程,用很是接近問題域術語的方法把系統構形成「現實世界」的對象,關注怎麼作(how),經過模型來實現功能規範。OOP則在設計的基礎上用編程語言(如Java)編碼。貫穿OOA、OOD和OOP的主線正是抽象。

OOD中建模會用圖形化的建模語言UML(Unified Modeling Language),UML是一種通用的建模語言,咱們實驗中使用umbrello進行建模,Windows中推薦你們使用 StarUML。

過程抽象的結果是函數,數據抽象的結果是抽象數據類型(Abstract Data Type,ADT),類能夠做具備繼承和多態機制的ADT。數據抽象纔是OOP的核心和起源。

OO三要素的第一個要素是封裝,封裝就是將數據與相關行爲包裝在一塊兒以實現信息就隱藏。

封裝實際上使用方法(method)將類的數據隱藏起來,控制用戶對類的修改和訪問數據的程度,從而帶來模塊化(Modularity)和信息隱藏(Information hiding)的好處;接口(interface)是封裝的準確描述手段。

public abstract class Animal {
    private String color;
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public abstract String shout();
}
public class Cat extends Animal{
    public String shout(){
        return "喵喵";
    }
    public String toString(){
        return "The Cat's color is " + this.getColor() +", and it shouts "+ this.shout() + "!";
    }
}
public class Dog extends Animal{
    public String shout(){
        return "汪汪";
    }
    public String toString(){
        return "The Dog's color is " + this.getColor() +", and it shouts "+ this.shout() + "!";
    }
}
  • 用UML展現

  • 設計模式

S.O.L.I.D原則
SRP(Single ResponsibilityPrinciple,單一職責原則)
OCP(Open-Closed Principle,開放-封閉原則)
LSP(Liskov Substitusion Principle,Liskov替換原則)
ISP(Interface Segregation Principle,接口分離原則)
DIP(Dependency Inversion Principle,依賴倒置原則)
設計模式:建立型,結構型,行爲型
設計模式實例
讓系統支持Boolen類

代碼以下:

abstract class Data{
    public abstract void DisplayValue();
}
class Integer extends Data {
    int value;
    Integer(){
        value=100;
    }
    public void DisplayValue(){
        System.out.println(value);
    }
}
class Boolean extends Data{
    boolean value;

    Boolean(){
        value=false;
    }

    public void DisplayValue(){

        if(value)
        {
            System.out.println("20155326true");
        }
        else {
            System.out.println("20155326false");
        }
    }
}
class Document {
    Data pd;
    Document() {
        pd=new Boolean();
    }
    public void DisplayData(){
        pd.DisplayValue();
    }
}
public class MyDoc {
    static Document d;
    public static void main(String[] args) {
        d = new Document();
        d.DisplayData();
    }
}

運行結果:

練習

使用TDD的方式設計關實現複數類Complex。

  • 僞代碼

Complex類

定義實部以及虛部;

方法Set設置實部,以及虛部:public double setRealPart(),public double setImagePart();

方法Get取得實部,以及虛部:public double getRealPart(),public double getImagePart();

方法加法Complex ComplexAdd(Complex a)

方法減法Complex ComplexSub(Complex a)

方法乘法Complex ComplexMultib(Complex a)

方法除法Complex ComplexDiv(Complex a)

方法toString()控制輸出格式

  • 產品代碼
import java.util.Scanner;
public class Complex {
    static int r;
    static int i;
    private double a;
    private double b;
    public static int getRealPart(int RealPart){
            r = RealPart;
        return r;
    }
    public static int getImaginePart(int ImaginePart){
            i = ImaginePart;
        return i;
    }
    public Complex(double a, double b) {
        this.a = a;
        this.b = b;
    }
    public Complex add(Complex c) { 
        return new Complex(a + c.a, b + c.b);
    }
    public Complex minus(Complex c) {    
        return new Complex(a - c.a, b - c.b);
    }
    public Complex multiply(Complex c) {
        return new Complex(a * c.a - b * c.b, a * c.b + b * c.a);
    }
    public String toString() {
        String rtr_str = "";
        if (a > 0)
            rtr_str = "(" + a + "+" + b + "i" + ")";
        if (b == 0)
            rtr_str = "(" + a + ")";
        if (b < 0)
            rtr_str = "(" + a + b + "i" + ")";
        return rtr_str;
    }
}
  • 測試代碼
import junit.framework.TestCase;
import org.junit.Test;
import static org.junit.Assert.*;
public class ComplexTest extends TestCase {
        Complex a=new Complex(1,2);
        Complex d=new Complex(0,-1);
        Complex e=new Complex(0,0); 
        @Test
        public void testgetRealPart() throws Exception {
            assertEquals(1, Complex.getRealPart(1));
            assertEquals(-1, Complex.getRealPart(-1));
            assertEquals(0, Complex.getRealPart(0));
        }
        @Test
        public void testgetImaginePart() throws Exception {
            assertEquals(1, Complex.getImaginePart(1));
            assertEquals(-1, Complex.getImaginePart(-1));
            assertEquals(2, Complex.getImaginePart(2));
            assertEquals(0, Complex.getImaginePart(0));
        }
        @Test
        public void testadd() throws Exception {
            assertEquals("(1.0-1.0i)", a.add(d).toString());
            assertEquals("(1.0+2.0i)", a.add(e).toString());
        }
        @Test
        public void testminus() throws Exception {
            assertEquals("(1.0+5.0i)", a.minus(b).toString());
            assertEquals("(1.0+2.0i)", a.minus(c).toString());
        }
        @Test
        public void testmultiply() throws Exception {
            assertEquals("(9.0-2.0i)", a.multiply(b).toString());
            assertEquals("(19.0-38.0i)", a.multiply(b).toString());
            assertEquals("(6.0-3.0i)", a.multiply(b).toString());
            assertEquals("(0.0)", a.multiply(e).toString());
        }
    }
  • 測試結果

分析總結:

此次的實驗比較複雜,涉及的內容較多,這周大部分的時間都花在了作實驗上,中途遇到的問題也都找同窗解決了。

PSP(Personal Software Process)時間

| 步驟 | 耗時 | 百分比 | | 需求分析 | 50min | 18.5% | | 設計 | 120min | 44.4% | | 代碼實現 | 30min | 11.1% | 測試 | 40min | 14.8% | | 分析總結 | 30min | 11.1% |

相關文章
相關標籤/搜索