20165218 實驗二 Java面向對象程序設計
實驗二 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 Classes
abstract 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 classes
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 ByteFactory());
d.DisplayData();
}
}
(四)練習
實驗內容
提交:單元測試代碼和運行成功截圖及碼雲上代碼鏈接,截圖要加上學號水印
參考http://www.cnblogs.com/rocedu/p/6736847.html
任務:以TDD的方式開發一個復數類Complex,要求如下:
//偽代碼
// 定義屬性並生成getter,setter
double RealPart;
double ImagePart;
// 定義構造函數
public Complex()
public Complex(double R,double I)
//Override Object
public 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面向對象程序設計