標籤:city 利用 head tag 步驟 scanner tin ase ati
實驗二 Java物件導向程式設計課程:Java程式設計班級:1652姓名:孔月學號:20165208指導教師:婁嘉鵬實驗日期:2018.4.16實驗名稱:Java物件導向程式設計實驗內容及要求:
- 初步掌握單元測試和TDD
- 理解並掌握物件導向三要素:封裝、繼承、多態
- 初步掌握UML建模
- 熟悉S.O.L.I.D原則
- 瞭解設計模式
實驗內容、步驟與體會
目錄:
- (一)初步掌握單元測試和TDD
- (二)以TDD的方式研究學習StringBuffer
- (三)對MyDoc類進行擴充,讓其支援Boolean類,初步理解設計模式
- (四)以TDD的方式開發一個複數類Complex
- (五)使用StarUML對實驗中的代碼進行建模
(一)在一個MyUtil類中解決一個百分製成績轉成“優、良、中、及格、不及格”五級製成績的功能。
根據需求虛擬碼應如下
如果成績小於60,轉成“不及格”如果成績在60與70之間,轉成“及格”如果成績在70與80之間,轉成“中等”如果成績在80與90之間,轉成“良好”如果成績在90與100之間,轉成“優秀”其他,轉成“錯誤”
根據虛擬碼寫出產品代碼
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 "錯誤"; }}
為測試產品代碼的正確性我們需寫出測試代碼,此處根據實驗要求將3種測試情況均寫入MyutilTest中,分別包括邊界測試,非法輸入以及正常情況。
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(103)); assertEquals("錯誤", MyUtil.percentage2fivegrade(-5)); } @Test public void testBoundary() { assertEquals("不及格", MyUtil.percentage2fivegrade(0)); assertEquals("及格", MyUtil.percentage2fivegrade(60)); }}
經測試三種情況均能通過,實驗效果如
返回目錄
(二)以TDD的方式研究學習StringBuffer
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); }}
通過網上查閱資料學習得出了以上四種的功能
charAt(int i)的功能為返回此序列中指定索引處的 char 值。第一個 char 值在索引 0 處,第二個在索引 1 處,依此類推,這類似於數組索引。
capacity()返回的是字串緩衝區的容量
length()針對字串String說的,用來求數組中某個元素的字串長度
indexOf(Strings)為返回輸入的子字串的第一個字母在母字串的位置。
根據四個方法的功能,編寫出一個測試代碼來看斷言值與方法傳回值是否相等。
import org.junit.Test;import junit.framework.TestCase;import static org.junit.Assert.*;public class StringBufferDemoTest extends TestCase { StringBuffer a = new StringBuffer("kongyue"); StringBuffer b = new StringBuffer("kongyue studied JAVA"); StringBuffer c = new StringBuffer("Now kongyue is studying JAVA");@Testpublic void testcharAt() throws Exception{ assertEquals(‘k‘,a.charAt(0)); assertEquals(‘y‘,a.charAt(4)); assertEquals(‘e‘,a.charAt(6));}@Testpublic void testcapacity() throws Exception{ assertEquals(23,a.capacity()); assertEquals(36,b.capacity()); assertEquals(44,c.capacity());}@Testpublic void testlength() throws Exception{ assertEquals(7,a.length()); assertEquals(20,b.length()); assertEquals(28,c.length());}@Test public void testindexOf() throws Exception{ assertEquals(0,a.indexOf("kon")); assertEquals(8,b.indexOf("stu")); assertEquals(24,c.indexOf("JAVA"));}}
經運行測試代碼通過,效果
(三)對MyDoc類進行擴充,讓其支援Boolean類,初步理解設計模式
我的題目為:讓系統支援Boolean類,並在MyDoc類中添加測試代碼錶明添加正確,代碼如下:
abstract class Data { abstract public void DisplayValue();}class Integer extends Data { int value; Integer() { value=5208; } public void DisplayValue(){ System.out.println (value); }}class Boolean extends Data { boolean flag; Boolean() { flag = true; } public void DisplayValue(){ System.out.println (flag); }}// Pattern Classesabstract class Factory { abstract public Data CreateDataObject();}class IntFactory extends Factory { public Data CreateDataObject(){ return new Integer(); }}class BooleanFactory extends Factory { public Data CreateDataObject(){ return new Boolean(); }}class Document { Data data; Document(Factory factory) { data = factory.CreateDataObject(); } public void DisplayData() { data.DisplayValue(); }}public class MyDoc { static Document d; public static void main(String[] args) { d = new Document(new IntFactory()); d.DisplayData(); d = new Document(new BooleanFactory()); d.DisplayData(); }}
最終運行效果
(四)以TDD的方式開發一個複數類Complex
測試代碼
public class ComplexTest extends TestCase { Complex c1 = new Complex(0, 3); Complex c2 = new Complex(-1, -1); Complex c3 = new Complex(2,1); @Test public void testgetRealPart() throws Exception { assertEquals(-1.0, Complex.getRealPart(-1.0)); assertEquals(5.0, Complex.getRealPart(5.0)); assertEquals(0.0, Complex.getRealPart(0.0)); } @Test public void testgetImagePart() throws Exception { assertEquals(-1.0, Complex.getImagePart(-1.0)); assertEquals(5.0, Complex.getImagePart(5.0)); assertEquals(0.0, Complex.getImagePart(0.0)); } @Test public void testComplexAdd() throws Exception { assertEquals("-1.0+2.0i", c1.ComplexAdd(c2).toString()); assertEquals("2.0+4.0i", c1.ComplexAdd(c3).toString()); assertEquals("1.0", c2.ComplexAdd(c3).toString()); } @Test public void testComplexSub() throws Exception { assertEquals("1.0+4.0i", c1.ComplexSub(c2).toString()); assertEquals("-2.0+2.0i", c1.ComplexSub(c3).toString()); assertEquals("-3.0 -2.0i", c2.ComplexSub(c3).toString()); } @Test public void testComplexMulti() throws Exception { assertEquals("3.0 -6.0i", c1.ComplexMulti(c2).toString()); assertEquals("-3.0+9.0i", c1.ComplexMulti(c3).toString()); assertEquals("-1.0 -3.0i", c2.ComplexMulti(c3).toString()); } @Test public void testComplexComplexDiv() throws Exception { assertEquals("-1.5 -1.5i", c1.ComplexDiv(c2).toString()); assertEquals("1.2+0.6i", c1.ComplexDiv(c3).toString()); assertEquals("-0.6 -0.6i", c2.ComplexDiv(c3).toString()); }}
產品代碼
import java.util.Scanner;import java.lang.String;public class Complex{ double RealPart; double ImagePart; public Complex(double R, double I) { this.RealPart = R; this.ImagePart = I; } public static double getRealPart(double RealPart) { return RealPart; } public static double getImagePart(double ImagePart) { return ImagePart; } public boolean equals(Object obj) { if(this==obj){ return true; } if(!(obj instanceof Complex)) { return false; } Complex complex=(Complex)obj; if(complex.RealPart!=((Complex)obj).RealPart){ return false; } if(complex.ImagePart!=((Complex)obj).ImagePart){ return false; } return true; } public String toString() { String string=""; if(ImagePart>0) string=RealPart+"+"+ImagePart+"i"; if(ImagePart==0) string=RealPart+""; if(ImagePart<0) string=RealPart+" "+ImagePart+"i"; return string; } Complex ComplexAdd(Complex a) { double RealPart2=RealPart+ a.RealPart; double ImagePart2=ImagePart + a.ImagePart; return new Complex(RealPart2,ImagePart2); } Complex ComplexSub(Complex a) { double RealPart2=RealPart - a.RealPart; double ImagePart2=ImagePart - a.ImagePart; return new Complex(RealPart2,ImagePart2); } Complex ComplexMulti(Complex a) { double RealPart2= RealPart* a.RealPart- ImagePart * a.ImagePart; double ImagePart2=ImagePart * a.ImagePart+ImagePart * a.RealPart; return new Complex(RealPart2,ImagePart2); } Complex ComplexDiv(Complex a) { double RealPart2= (RealPart * a.ImagePart+ ImagePart * a.RealPart)/(a.ImagePart * a.ImagePart + a.RealPart * a.RealPart); double ImagePart2=(ImagePart * a.ImagePart + RealPart * a.RealPart)/(a.ImagePart * a.ImagePart + a.RealPart * a.RealPart); return new Complex(RealPart2,ImagePart2); }}
測試效果如
(五)使用StarUML對實驗中的代碼進行建模
利用工具WhiteStarUML進行建模,效果如
原有上交
注意對於抽象類別和抽象方法要用斜體表明,這點在做實驗時是我沒有考慮到的,更改後的
問題總結與體會
- 問題1:本次實驗大量利用JUnit測試案例來校正代碼,在這個過程中我按照老師部落格的操作進行,但是僅顯示Test passed而不會產生green bar,當我故意改寫代碼使其出錯時,運行會出現代碼錯誤提示,故而測試代碼應該是沒有問題,這個問題我也有與同學探討過,但是沒有得出一個合理的解釋,在網上查詢了有關不會出現green bar的原因後,發現解決方案也並不適用於我的實驗問題。
- 問題2:對於Complex複數類,在檢測時只能通過3個測試案例,根據反饋查錯發現原代碼在
string=RealPart+ImagePart+"i"中預設將前兩個變數先進行了求和運算,未起到原有目的,後改進為string=RealPart+" "+ImagePart+"i"即可進行運算
-
問題3:除了代碼編寫上的問題,在導包時我也遇到了問題,在安裝下載時我未找到和實驗要求一樣的下載包,選擇了最相近的,所以也不是很確定後續實驗中操作的green bar沒有及時出現是否與此有關
-
除此之外儘管實驗過程中在程式的編寫上我遇到了很多困難,譬如在對MyDoc類進行擴充,讓其支援Boolean類時如何合法定義有關變數的類型,以及複數類Complex的編寫,過程很痛苦,但是學會了這種通過先寫虛擬碼再利用測試代碼輔助完成產品代碼的方法,對於編程來說真的很方便,而且對於各種情況的監測利用Junit測試十分方便。
| 步驟 |
耗時 |
百分比 |
| 需求分析 |
25 min |
8.3% |
| 設計 |
70 min |
23.3% |
| 代碼實現 |
120 min |
40% |
| 測試 |
40 min |
13.3% |
| 分析總結 |
45 min |
15% |
實驗二 Java物件導向程式設計