實驗三 面向對象程序設計


# 20202315 2021-2022-1 《數據結構與面向對象程序設計》實驗報告

課程:《程序設計與數據結構》
班級: 2023
姓名:王夢欣
學號:20202315
實驗教師:王志強
實驗日期:2021年9月30日
必修/選修: 必修

 

參考《實驗二 Java面向對象程序設計》:http://www.cnblogs.com/rocedu/p/6736847.html
##1.實驗內容

下載安裝並使用IDEA,完成下面實驗(https://www.cnblogs.com/rocedu/p/6371315.html)。

1. 初步掌握單元測試和TDD

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

3. 初步掌握UML建模

4. 完成藍墨雲上 (1)-(5)實驗。

 

##2.實驗過程與結果

2.1 單元測試和TDD的掌握

第一個提交點:完成單元測試的學習

產品代碼及測試代碼

public class MyUtil {
public static String percentage2fivegrade(int grade){
if (grade<0)
return "錯誤";
//如果成績小於60,轉成不及格
else if (grade<60)
return "不及格";
//如果成績在6070之間,轉成及格
else if (grade<70)
return "及格";
//如果成績在7080之間,轉成中等
else if (grade<80)
return "中等";
//如果成績在8090之間,轉成良好
else if (grade<90)
return "良好";
//如果成績在90100之間,轉成優秀
else if (grade<=100)
return "優秀";
//如果成績大於100,轉成錯誤"
else
return "錯誤";
}
}


public class MyUtilTest {
@Test
public void testNormal() {
Assert.assertEquals("不及格", MyUtil.percentage2fivegrade(55));
Assert.assertEquals("及格", MyUtil.percentage2fivegrade(65));
Assert.assertEquals("中等", MyUtil.percentage2fivegrade(75));
Assert.assertEquals("良好", MyUtil.percentage2fivegrade(85));
Assert.assertEquals("優秀", MyUtil.percentage2fivegrade(95));
}
@Test
public void testException(){
Assert.assertEquals("錯誤", MyUtil.percentage2fivegrade(-55));
Assert.assertEquals("不及格", MyUtil.percentage2fivegrade(55));
}
@Test
public void testBoundary(){
Assert.assertEquals("不及格", MyUtil.percentage2fivegrade(0));
Assert.assertEquals("及格", MyUtil.percentage2fivegrade(60));
Assert.assertEquals("中等", MyUtil.percentage2fivegrade(70));
Assert.assertEquals("良好", MyUtil.percentage2fivegrade(80));
Assert.assertEquals("優秀", MyUtil.percentage2fivegrade(90));
Assert.assertEquals("優秀", MyUtil.percentage2fivegrade(100));
}
}

運行結果:正常情況、錯誤情況及邊界情況

 

 

 

 

 

 第二個提交點:

TDD的一般步驟如下:

  • 明確當前要完成的功能,記錄成一個測試列表
  • 快速完成編寫針對此功能的測試用例
  • 測試代碼編譯不通過(沒產品代碼呢)
  • 編寫產品代碼
  • 測試通過
  • 對代碼進行重構,並保證測試通過(重構下次實驗練習)
  • 循環完成所有功能的開發

以 TDD的方式研究學習StringBuffer

import junit.framework.TestCase;
import static org.junit.Assert.*;
import org.junit.Test;
public class StringBufferDemoTest extends TestCase {
    StringBuffer a = new StringBuffer("stringbuffer");//測試12個字符(<=16)
    StringBuffer b = new StringBuffer("stringbufferstringbuffer");//測試24個字符(>16&&(=34)
    StringBuffer c = new StringBuffer("stringbufferstringbufferstringbuffer");//測試36個字符(>=34)
    @Test
    public void testcharAt() throws Exception {
        assertEquals('s', a.charAt(0));
        assertEquals('g', a.charAt(5));
        assertEquals('r', a.charAt(11));
    }
    @Test
    public void testcapacity() throws Exception {
        assertEquals(28, a.capacity());
        assertEquals(40, b.capacity());
        assertEquals(52, c.capacity());
    }
    @Test
    public void testlength() throws Exception {
        assertEquals(12, a.length());
        assertEquals(24, b.length());
        assertEquals(36, c.length());
    }
    @Test
    public void testindexOf() throws Exception {
        assertEquals(0, a.indexOf("str"));
        assertEquals(5, b.indexOf("gbu"));
        assertEquals(8, c.indexOf("ff"));
    }
}

public class StringBufferDemo {
	public static void main(String [] args){
            StringBuffer buffer = new StringBuffer(20);
            buffer.append('S');
            buffer.append("tringBuffer");
            //		System.out.println(buffer.charAt(1));
            System.out.println(buffer.capacity());
            //		System.out.println(buffer.indexOf("tring12345"));
            System.out.println("buffer = " + buffer.toString());
            System.out.println(buffer.length());
    }
}

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

(1)封裝與繼承

    封裝:使用private關鍵字將類信息隱藏在類內部,不允許外部程序直接訪問、也不允許直接修改,只有讀取和賦值。

    繼承:子類繼承父類的特征和行為。

              多態:為不同的實體提供統一的接口。 

 如以下程序:

class Car {
    private String name;//私有成員,名稱
    private String color;//私有成員,顏色
    private String size;//私有成員,大小

    public String getName() {
        return name;
    }

    public String getColor() {
        return color;
    }

    public String getSize() {
        return size;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public void setSize(String size) {
        this.size = size;
    }
}

    public class Test {
        public static void main(String[] args) {
            Car b = new Car();//實例化操作
            b.setName("蘭博基尼");//賦值
            b.setColor("紫色");
            b.setSize("中型");

//很明顯這些過程看不到如何實現。
            String name = b.getName();//取值
            String color = b.getColor();
            String size = b.getSize();

//最后輸出結果
            System.out.println(name + ":" + color + ":" + size);
        }
    }

 

public class Animal {
        void shout(){
            System.out.println("動物喊叫!");
        }
    }
    class Dog extends Animal {
        void shout(){
            System.out.println("汪汪汪");
        }
    }
    class Cat extends Animal {
        void shout(){
            System.out.println("喵喵喵");
        }
    }
    class Hr extends Animal {
        void shout(){
        System.out.println("hhhhh");
    }
}
    class testanmial{
        public static void main(String[] args){
            Animal dog = new Dog();
            dog.shout();
            Animal cat = new Cat();
            cat.shout();
            Animal hr = new Hr();
            hr.shout();
        }
    }

 

 

 

 

簡單實現了繼承、復寫、多態。

 

 

2.3  初步掌握UML建模

 

 

 對測試中的Animal類 My'Util都使用starMUL進行了解讀和模型構建。

 

 

 2.4 完成藍墨雲上 (1)-(5)實驗。

 如圖:

 

 

## 3. 實驗過程中遇到的問題和解決過程

1.一開始一直沒有理解實驗三中第三個提交點,感覺很多語句可以寫到一起程序會更簡單,后來發現,分開寫使得程序更加有條理有邏輯。

Factory可以被理解為一種創造正確類型(子)類的策略。

2.程序編寫的過程中開始一直報錯,各種細節問題,在不斷搜索報錯原因及利用報錯的小紅點過程中逐步解決。

3.一開始不會使用starUML,但是通過學習b站和婁老師的帖子學會。

 

## 其他(感悟、思考等)

本次第一次使用了IDEA集成開發環境,感覺集成開發環境編程效率要高出很多,而且解決問題的效率也有很大提升,報錯過程中還會自動給出解決方案。

剛開始做實驗整個人完全處於懵的狀態,不知從何下手,也不知如何下手。先從婁老師的帖子看起,逐個問題解決的過程中了解到很多也學習到了很多。

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM