# 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 "不及格";
//如果成績在60與70之間,轉成“及格”
else if (grade<70)
return "及格";
//如果成績在70與80之間,轉成“中等”
else if (grade<80)
return "中等";
//如果成績在80與90之間,轉成“良好”
else if (grade<90)
return "良好";
//如果成績在90與100之間,轉成“優秀”
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集成開發環境,感覺集成開發環境編程效率要高出很多,而且解決問題的效率也有很大提升,報錯過程中還會自動給出解決方案。
剛開始做實驗整個人完全處於懵的狀態,不知從何下手,也不知如何下手。先從婁老師的帖子看起,逐個問題解決的過程中了解到很多也學習到了很多。
