標籤:開發 dea ide get pre setter 2.0 產品 turn
實驗二 Java物件導向程式設計課程:java程式設計姓名:趙冰雨學號:20165218指導教師:婁嘉鵬實驗日期:2018.4.16實驗密級:Java開發環境的熟悉實驗內容、步驟與體會:(一)單元測試
實驗要求
參考 http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST
參考http://www.cnblogs.com/rocedu/p/6736847.html
提交最後三個測試案例都通過的
- 根據虛擬碼編寫產品代碼
MyUtil.java
- 建立一個測試代碼
MyUtil.java
- 測試多種情況,包括正常情況,異常情況(負分或大於100的乘積),邊界情況,並根據測試結果調整產品代碼(以上是自己編寫測試代碼的過程)
- 建立測試檔案夾test,並將其改成可作為原始碼編譯
- 在test檔案夾下建立
MyUtilTest.jva,輸入代碼:
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)); }}
運行成功
出現語法錯誤時
File->Project Structure
在IDEA安裝地址下找到如下三個檔案並添加即可
(二)物件導向的三要素
實驗要求
參考 積極主動敲代碼,使用JUnit學習Java
(http://www.cnblogs.com/rocedu/p/4837092.html)
參考http://www.cnblogs.com/rocedu/p/6736847.html
以 TDD的方式研究學習StringBuffer,提交你的單元測試用例和測試通過的
- 編寫測試案例代碼
/** * Created by zby on 2018/4/16. */public class StringBufferDemo { public static void main(String[] args) { StringBuffer buffer = new StringBuffer(); buffer.append(‘S‘); buffer.append("tringBuffer"); System.out.println(buffer.charAt(1)); System.out.println(buffer.capacity()); System.out.println(buffer.indexOf("tring")); System.out.println("buffer = " + buffer.toString()); System.out.println(buffer.length()); }}
- 測試代碼
import junit.framework.TestCase;import org.junit.Test;/** * Created by zby on 2018/4/16. */import junit.framework.TestCase;import org.junit.Test;import static org.junit.Assert.*;public class StringBufferTest extends TestCase { StringBuffer string1 = new StringBuffer("hellojava");//測試9個字元 StringBuffer string2 = new StringBuffer("To be or not to be");//測試18個字元 StringBuffer string3 = new StringBuffer("Quando abbandonare ogni speranza");//測試32個字元 @Test public void testCharAt() { assertEquals(‘h‘, string1.charAt(0)); assertEquals(‘e‘, string2.charAt(4)); assertEquals(‘a‘, string3.charAt(7)); } @Test public void testCapacity() { assertEquals(25, string1.capacity()); assertEquals(34, string2.capacity()); assertEquals(48, string3.capacity()); } @Test public void testindexOf() { assertEquals(0, string1.indexOf("he")); assertEquals(9, string2.indexOf("not")); assertEquals(7, string3.indexOf("abbando")); } @Test public void testlength() { assertEquals(9, string1.length()); assertEquals(18, string2.length()); assertEquals(32, string3.length()); }}
- 如果顯示測試失敗(如),根據提示修改測試代碼
- 測試成功
(三)設計模式初步
實驗內容
參考http://www.cnblogs.com/rocedu/p/6736847.html
對設計模式樣本進行擴充,體會OCP原則和DIP原則的應用,初步理解設計模式
用自己的學號%6進行取餘運算,根據結果進行代碼擴充:
0: 讓系統支援Byte類,並在MyDoc類中添加測試代碼錶明添加正確,提交測試代碼和運行結的,加上學號浮水印
- 設計編寫代碼
Data.java和MyDoc.java
/** * Created by zby on 2018/4/16. */abstract class Data { abstract public void DisplayValue();}class Integer extends Data { int value; Integer() { value = 100; } public void DisplayValue() { System.out.println(value); }}class Byte extends Data { byte value; Byte() { value = (byte) 20165218; } public void DisplayValue() { System.out.println(value); }}// Pattern Classesabstract class Factory { abstract public Data CreateDataObject();}class IntFactory extends Factory { public Data CreateDataObject() { return new Integer(); }}class ByteFactory extends Factory { public Data CreateDataObject() { return new Byte(); }}//Client classesclass 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 ByteFactory()); d.DisplayData(); }}
(四)練習
實驗內容
提交:單元測試代碼和運行成功及碼雲上代碼連結,要加上學號浮水印
參考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)
- 產品代碼
/** * Created by zby on 2018/4/16. */public class Complex { // 定義屬性並產生getter,setter private double RealPart; private double ImagePart; // 定義建構函式 public Complex() { } public Complex(double R, double I) { this.RealPart = R; this.ImagePart = I; } public double getRealPart() { return RealPart; } public void setRealPart(double realPart) { RealPart = realPart; } public double getImagePart() { return ImagePart; } public void setImagePart(double imagePart) { ImagePart = imagePart; } //Override Object 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) { return new Complex(RealPart + a.RealPart, ImagePart + a.ImagePart); } Complex ComplexSub(Complex a) { return new Complex(RealPart - a.RealPart, ImagePart - a.ImagePart); } Complex ComplexMulti(Complex a) { return new Complex(RealPart * a.RealPart - ImagePart * a.ImagePart, ImagePart * a.RealPart + RealPart * a.ImagePart); } Complex ComplexDiv(Complex a) { Complex d = new Complex(); d.RealPart = (this.RealPart * a.RealPart + this.ImagePart * a.ImagePart) / (a.RealPart * a.RealPart + a.ImagePart * a.ImagePart); d.ImagePart = (this.ImagePart * a.RealPart - this.RealPart * a.ImagePart) / (a.RealPart * a.RealPart + a.ImagePart * a.ImagePart); return d; }}
- 測試代碼
/** * Created by zby on 2018/4/16. */import org.junit.*;import static org.junit.Assert.*;public class ComplexTest { Complex a = new Complex(1, 2); Complex b = new Complex(1, -4); @Test public void testAdd() { assertEquals("2.0 -2.0i", a.ComplexAdd(b).toString()); System.out.println(a.ComplexAdd(b)); } @Test public void testSub() { assertEquals("0.0+6.0i", a.ComplexSub(b).toString()); System.out.println(a.ComplexSub(b)); } @Test public void testMulti() { assertEquals("9.0 -2.0i", a.ComplexMulti(b).toString()); System.out.println(a.ComplexMulti(b)); } @Test public void testDiv() { assertEquals("-0.4117647058823529+0.35294117647058826i", a.ComplexDiv(b).toString()); System.out.println(a.ComplexDiv(b)); }}
- 測試結果
(五)UML圖繪製
實驗內容
使用WhiteStarUML對實驗二中的代碼進行建模,發類圖的,加上學號浮水印。
參考http://www.cnblogs.com/rocedu/p/6736847.html
- 開啟
StarUML後,File->New建立一個檔案
- 單擊
Class拖動到畫布上,修改類的名稱
斷行符號確認
按右鍵類,添加對象和方法()
雙擊對象或方法的名字可修改,單擊小加號可以添加一個新的對象或方法
點擊對象或方法,Properties->Visibility,修改存取權限
完成
代碼實現PSP時間圖
| 步驟 |
耗時 |
百分比 |
| 需求分析 |
20min |
6% |
| 設計 |
30min |
9% |
| 代碼實現 |
90min |
27.3% |
| 測試 |
120min |
36.4% |
| 分析總結 |
70min |
21% |
分析單元測試的好處
- 協助開發人員編寫代碼,提升品質、減少bug。
- 提升反饋速度,減少重複工作,提高開發效率。
- 保證你最後的代碼修改不會破壞之前代碼的功能。
- 讓代碼維護更容易。
- 有助於改進代碼品質和設計。
參考資料
- 實驗二《Java物件導向程式設計》的一點說明
- 為什麼要編寫單元測試?單元測試的優勢及優點
- 實驗二 Java物件導向程式設計
- Intellj IDEA 簡易教程
20165218 實驗二 Java物件導向程式設計