標籤:ide com AC exception 多態 理解 div 針對 sub()
20165308 實驗二 Java物件導向程式設計實驗二 Java物件導向程式設計一、實驗報告封面
實驗內容及要求:
- 初步掌握單元測試和TDD
- 理解並掌握物件導向三要素:封裝、繼承、多態
- 初步掌握UML建模
- 熟悉S.O.L.I.D原則
- 瞭解設計模式
實驗內容、步驟與體會目錄:
- (一)初步掌握單元測試和TDD
- (二)以TDD的方式研究學習StringBuffer
- (三)對MyDoc類進行擴充,讓其支援Boolean類,初步理解設計模式
- (四)以TDD的方式開發一個複數類Complex
(五)使用StarUML對實驗中的代碼進行建模
二、實驗內容及步驟
(一)使用JUnit 單元測試
參考 http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST 完成單元測試的學習提交最後三個JUnit測試案例(正常情況,錯誤情況,邊界情況)都通過的,上要有畫圖加浮水印,輸入自己的學號本提交點考查JUnit會不會使用,測試案例至少要包含正常情況,錯誤情況,邊界情況的測試。
產品代碼
public class MyUtil{ public static String percentage2fivegrade(int grade){ //如果成績小於0,轉成“錯誤” 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 "錯誤"; }}
測試代碼
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)); } @Test public void testExceptions () { assertEquals("錯誤",MyUtil.percentage2fivegrade(105)); assertEquals("錯誤",MyUtil.percentage2fivegrade(-55)); } @Test public void testBoundary () { assertEquals("不及格", MyUtil.percentage2fivegrade(0)); assertEquals("及格", MyUtil.percentage2fivegrade(60)); assertEquals("中等", MyUtil.percentage2fivegrade(70)); assertEquals("良好", MyUtil.percentage2fivegrade(80)); assertEquals("優秀", MyUtil.percentage2fivegrade(90)); assertEquals("優秀", MyUtil.percentage2fivegrade(100)); }}
測試
(二)以TDD的方式研究學習StringBuffer
TDD的一般步驟如下:
- 明確當前要完成的功能,記錄成一個測試清單
- 快速完成編寫針對此功能的測試案例
- 測試代碼編譯不通過(沒產品代碼呢)
- 編寫產品代碼
- 測試通過
- 對代碼進行重構,並保證測試通過(重構下次實驗練習)
- 迴圈完成所有功能的開發
產品代碼
public class StringBufferDemo{ StringBuffer buffer = new StringBuffer(); public StringBufferDemo(StringBuffer buffer){ this.buffer = buffer; } public Character charAt(int i){ return buffer.charAt(i); } public int capacity(){ return buffer.capacity(); } public int length(){ return buffer.length(); } public int indexOf(String buf) { return buffer.indexOf(buf); }}
測試代碼
import junit.framework.TestCase;import org.junit.Test;public class StringBufferDemoTest extends TestCase { StringBuffer a = new StringBuffer("StringBuffer"); //測試12個字元 StringBuffer b = new StringBuffer("StringBufferStringBuffer"); //測試24個字元 StringBuffer c = new StringBuffer("StringBufferStringBufferStringBuffer"); //測試36個字元 StringBuffer d = new StringBuffer("StringBufferStringBufferStringBufferStr"); //測試39個字元 @Test public void testcharAt() { assertEquals(‘S‘,a.charAt(0)); assertEquals(‘e‘,b.charAt(10)); assertEquals(‘f‘,c.charAt(20)); assertEquals(‘B‘,d.charAt(30)); } @Test public void testcapacity() { assertEquals(28,a.capacity()); assertEquals(40,b.capacity()); assertEquals(52,c.capacity()); assertEquals(55,d.capacity()); } @Test public void testindexOf() { assertEquals(0,a.indexOf("Str")); assertEquals(3,b.indexOf("ing")); assertEquals(6,c.indexOf("Buffer")); assertEquals(8,d.indexOf("ff")); } @Test public void testlength() { assertEquals(12,a.length()); assertEquals(24,b.length()); assertEquals(36,c.length()); assertEquals(39,d.length()); }}
測試
(三)設計模式樣本進行擴充,讓系統支援Boolean類
參考實驗二 Java物件導向程式設計對設計模式樣本進行擴充,體會OCP原則和DIP原則的應用,初步理解設計模式用自己的學號%6進行取餘運算,根據結果進行代碼擴充:0:讓系統支援Byte類,並在MyDoc類中添加測試代碼錶明添加正確,提交測試代碼和運行結的,加上學號浮水印1:讓系統支援Short類,並在MyDoc類中添加測試代碼錶明添加正確,提交測試代碼和運行結的,加上學號浮水印2:讓系統支援Boolean類,並在MyDoc類中添加測試代碼錶明添加正確,提交測試代碼和運行結的,加上學號浮水印3:讓系統支援Long類,並在MyDoc類中添加測試代碼錶明添加正確,提交測試代碼和運行結的,加上學號浮水印4:讓系統支援Float類,並在MyDoc類中添加測試代碼錶明添加正確,提交測試代碼和運行結的,加上學號浮水印5:讓系統支援Double類,並在MyDoc類中添加測試代碼錶明添加正確,提交測試代碼和運行結的,加上學號浮水印
產品代碼
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=true; } public void DisplayValue(){ System.out.println(value); }}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
參考http://www.cnblogs.com/rocedu/p/6736847.html任務:以TDD的方式開發一個複數類Complex,要求如下:// 定義屬性並產生getter,setterdouble RealPart;double ImagePart;// 定義建構函式public Complex()public Complex(double R,double I)//Override Objectpublic boolean equals(Object obj)public String toString()// 定義公有方法:加減乘除Complex ComplexAdd(Complex a)Complex ComplexSub(Complex a)Complex ComplexMulti(Complex a)Complex ComplexDiv(Complex a)
產品代碼
import java.lang.*;public class Complex { // 定義屬性並產生getter,setter public void setRealpart(double R){ RealPart=R; } public double getRealpart(){ return RealPart; } public void setImagePart(double I){ ImagePart=I; } public double getImagePart(){ return ImagePart; } double RealPart; double ImagePart; // 定義建構函式 public Complex(double R,double I){ RealPart=R; ImagePart=I; } //Override Object public boolean equals(Complex obj){ if(this.getRealpart()==obj.getRealpart() && this.getImagePart()==obj.getImagePart()) return true; else return false; } public String toString(){ return RealPart+"+"+ImagePart+"i"; } // 定義公有方法:加減乘除 public Complex ComplexAdd(Complex a){ return new Complex(this.RealPart+a.RealPart,this.ImagePart+a.ImagePart); } public Complex ComplexSub(Complex a){ return new Complex(this.RealPart-a.RealPart,this.ImagePart-a.ImagePart); } public Complex ComplexMulti(Complex a){ return new Complex(this.RealPart*a.RealPart-this.ImagePart*a.ImagePart, this.RealPart*a.ImagePart+this.ImagePart*a.RealPart); } public Complex ComplexDiv(Complex a){ double x=this.RealPart; double y=this.ImagePart; double m=a.RealPart; double n=a.ImagePart; return new Complex((x*m+y*n)/(m*m+n*n),(y*m-x*n)/(m*m+n*n)); }}
測試代碼
import junit.framework.TestCase;import org.junit.Test;public class ComplexTest extends TestCase { Complex p1=new Complex(1,1); Complex p2=new Complex(1,-1); @Test public void testAdd(){ assertEquals("2.0+0.0i",p1.ComplexAdd(p2).toString()); System.out.println(p1.ComplexAdd(p2)); } @Test public void testSub(){ assertEquals("0.0+2.0i",p1.ComplexSub(p2).toString()); System.out.println(p1.ComplexSub(p2)); } @Test public void testMulti(){ assertEquals("2.0+0.0i",p1.ComplexMulti(p2).toString()); System.out.println(p1.ComplexSub(p2)); } @Test public void testDiv(){ assertEquals("0.0+1.0i",p1.ComplexDiv(p2).toString()); System.out.println(p1.ComplexDiv(p2)); }}
測試
(五)UML
使用[WhiteStarUML](http://whitestaruml.sourceforge.net/)對實驗二中的代碼進行建模,發類圖的,加上學號浮水印。參考http://www.cnblogs.com/rocedu/p/6736847.html類圖中只少兩個類。
四、實驗體會與總結
實驗過程中,真的遇到了超級多的困難而且都真的很難去自己全部解決,例如在對MyDoc類進行擴充,讓其支援Boolean類時如何合法定義有關變數的類型,以及複數類Complex的編寫等,要得到多次同學的協助才能結果,雖然過程很艱難,但是學會了這種通過先寫虛擬碼再利用測試代碼輔助完成產品代碼的方法,這樣對於編程來說比較方便,而且對於各種情況的監測利用Junit測試也是真的方便。
20165308 實驗二 Java物件導向程式設計