2017-2018-2 20165309實驗二《Java面向對象程序設計》實驗報告
一、實驗內容
1. 初步掌握單元測試和TDD
2. 理解并掌握面向對象三要素:封裝、繼承、多態
3. 初步掌握UML建模
4. 熟悉S.O.L.I.D原則
5. 了解設計模式
二、實驗步驟
(一)單元測試
1.三種代碼:偽代碼、測試代碼、產品代碼
需求:在一個MyUtil類中解決一個百分制成績轉成“優、良、中、及格、不及格”五級制成績的功能。
先用自然語言寫出從意圖層面來解決問題的偽代碼:
百分制轉五分制:
如果成績小于60,轉成“不及格”
如果成績在60與70之間,轉成“及格”
如果成績在70與80之間,轉成“中等”
如果成績在80與90之間,轉成“良好”
如果成績在90與100之間,轉成“優秀”
其他,轉成“錯誤”
然后用Java語言將偽代碼“翻譯”成產品代碼MyUtil.java。
寫測試代碼MyUtilTest.java來檢驗產品代碼:
JUnit測試用例:
正常情況
錯誤情況(負數,超過100的數)
邊界情況(0,60,70,80,90,100)
在項目上右鍵選擇New->Directory建目錄test,右鍵單擊test目錄,在彈出的菜單中選擇Mark Directory as->Test Sources Root來設置SOURCEPATH環境變量。
測試通過的截圖如下:
完善產品代碼。
測試代碼和最終的產品代碼在代碼鏈接里。
2.測試驅動開發TDD(測試代碼->產品代碼)
在新目錄下創建StringBufferDemo類, 鼠標單擊類名旁出現的燈泡狀圖標,在彈出的菜單中Create Test。
測試StringBufferDemo類的方法charAt()、capacity()、indexOf()、length():
char charAt(int index)返回此序列中指定索引處的 char 值。
int capacity()返回當前容量。
int indexOf(String str)返回第一次出現的指定子字符串在該字符串中的索引。
int length()返回長度(字符數)。
測試結果如下:
(二)對設計模式示例進行擴充,讓其支持Long類
如果要求支持Long類,Document類要修改構造方法,這違反了OCP原則。封裝、繼承、多態解決不了問題,這時就需要設計模式了:
class Long extends Data
class LongFactory extends Factory
在MyDoc類中添加測試代碼: public class MyDoc {
static Document d;
public static void main(String[] args) {
d = new Document(new LongFactory());
d.DisplayData();
}
}
運行結果如下:
代碼在碼云鏈接里。
(三)以TDD的方式開發一個復數類Complex
偽代碼: Complex類要輸出實部、虛部,并按照a+bi的形式輸出復數。
Complex類中有兩個變量,實部A和虛部B。
方法:
getA(int a);返回實部
getB(int b);返回虛部
ComplexAdd(Complex c);實現復數相加
ComplexMinus(Complex c);實現復數相減
ComplexMulti(Complex c);實現復數相乘
ComplexDiv(Complex c);實現復數相除
toString(int a,int b);將復數輸出成a+bi的格式。
測試結果:
產品代碼和測試代碼在碼云鏈接。
(四)面向對象三要素
抽象
封裝、繼承與多態
使用UML對實驗二中代碼進行建模
代碼: 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圖(由網頁ProcessOn制作)
三、實驗中遇到的問題及解決
問題1:當時安裝IDEA的時候選擇的都是默認路徑,而且也不算是經常用,所以沒有找到Junit jar 包。
解決1:右鍵桌面上的IntelliJ IDEA Ultimate,點進屬性里面,復制地址再粘到“+”就方便找到了~
問題2:對StringBuffer的了解不夠。
解決2:可以參考學習這個網址:www.runoob.com/java/java-stringbuffer.html。
解決3:long型的范圍是-2147483648~2147483647
問題4:在設計實現復數類時不知道怎么去拼接字符串。
解決4:嘗試concat()方法后仍存在問題,突然又意識到可以直接+....
四、實驗收獲
這次的實驗讓我學會了如何去寫測試代碼,也讓我規范了編寫代碼的習慣。跟著老師的博客教程和藍墨云上的要求去做的同時,我也意識到了自己對一些基礎方面的知識還不夠熟悉...得認真看書才是。
步驟
耗時
百分比
需求分析
15min
12.5
設計
20min
16.7
代碼實現
40min
33.3
測試
25min
20.8
分析總結
20min
16.7