实验二 Java面向对象程序设计
实验内容
1. 初步掌握单元测试和TDD
2. 理解并掌握面向对象三要素:封装、继承、多态
3. 初步掌握UML建模
4. 熟悉S.O.L.I.D原则
5. 了解设计模式
根据实验提交的规则,把实验为五个部分
面向对象程序设计-1
实验要求:
- 参考:> http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST
- 参考:> http://www.cnblogs.com/rocedu/p/6736847.html
- 提交最后三个测试用例都通过的截图,截图上要有画图加水印,输入自己的学号。
实验步骤:
在IDEA中新建一个工程,然后建立MyUtil类还有检查用的类,下图是最初的类(改了名,问题不大)
然后导入最初的程序
然后看看检验程序结果
果然出错了,检查出错原因是因为不及格的成绩不对啊
修改及格成绩为60,然后继续检测,这次通过了
然后来检测边界情况
看输出是满分出了问题这里输出时faild6遮住了
修改程序然后再检测通过
最终程序:
补一个用junit的,虽然这个实验要求上没有
测试代码如下:
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)); } }
代码全部通过!
面向对象程序设计-2
实验要求:
- 参考积极主动敲代码,使用JUnit学习Java >http://www.cnblogs.com/rocedu/p/4837092.html
- 参考>http://www.cnblogs.com/rocedu/p/6736847.html
- 以 TDD的方式研究学习StringBuffer,提交你的单元测试用例和测试通过的截图,截图要加上学号水印。
实验步骤:
其实我并不喜欢在idea上面编程,但是思考之后确实IDEA更便于发现错误,工具更多,比如这次的junit直接在IDEA中配置就可以了
还有TDD方法第一个例子
然后就开始用JUNIT对StringBufferDemo动手啦
1 正式代码
public class StringBufferDemo{ StringBuffer str=new StringBuffer(); StringBufferDemo(StringBuffer str){ this.str=str; } public char charAt(int i){ return str.charAt(i); } public int capacity(){ return str.capacity(); } public int length(){ return str.length(); } public int indexOf(String buf) { return str.indexOf(buf); } }
2 测试代码
import junit.framework.TestCase; import org.junit.Test; public class StringBufferDemoTest extends TestCase { StringBuffer a = new StringBuffer("StringBuffer");//测试12个字符(<=16) StringBuffer b = new StringBuffer("StringBufferStringBuffer");//测试24个字符(>16&&<=34) StringBuffer c = new StringBuffer("StringBufferStringBufferStringBuffer");//测试36个字符(>34) @Test public void testcharAt(){ assertEquals('S',a.charAt(0)); assertEquals('B',a.charAt(6)); assertEquals('r',a.charAt(11)); } @Test public void testcapacity(){ assertEquals(28,a.capacity()); assertEquals(40,b.capacity()); assertEquals(52,c.capacity()); } @Test public void testlength(){ assertEquals(12,a.length()); assertEquals(24,b.length()); assertEquals(36,c.length()); } @Test public void testindexOf(){ assertEquals(0,a.indexOf("Str")); assertEquals(6,a.indexOf("Buff")); assertEquals(10,a.indexOf("er")); } }
3 测试结果
ALLPASS
实验二 Java面向对象程序设计-3
实验要求:
参考http://www.cnblogs.com/rocedu/p/6736847.html
对设计模式示例进行扩充,体会OCP
原则和DIP
原则的应用,初步理解设计模式
让系统支持Float
类,并在MyDoc
类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
实验步骤:
代码:
abstract class Data { abstract public void DisplayValue(); } class Integer extends Data { int value; Integer() { value=100; } public void DisplayValue(){ System.out.println (value); } } class Float extends Data { float value; Float() { value=2.017531F; } 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 FloatFactory extends Factory { public Data CreateDataObject(){ return new Float(); } } class Document { //Client classes Data pd; Document(Factory pf){ pd = pf.CreateDataObject(); } public void DisplayData(){ pd.DisplayValue(); } } //Test class public class MyDoc { static Document d,f; public static void main(String[] args) { d = new Document(new IntFactory()); d.DisplayData(); f = new Document(new FloatFactory()); f.DisplayData(); } }
correct
实验二 面向对象程序设计-4
实验要求:
提交:单元测试代码和运行成功截图及码云上代码链接,截图要加上学号水印
参考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)
实验步骤:
代码:
import java.util.Objects; import java.lang.Integer; public class Complex { double RealPart; double ImagePart; public Complex() { } public Complex(double R,double I) { RealPart = R; ImagePart = I; } public double getterRealPart(){ return RealPart; } public double getterImagePart(){ 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 s = ""; if(getterRealPart()==0&&getterImagePart()==0){ s="0"; } else if(getterRealPart()!=0&&getterImagePart()==0){ s=s+getterRealPart(); } else if (getterRealPart()==0&&getterImagePart()!=0){ s=s+getterImagePart()+"i"; } else { if(getterImagePart()<0){ s = s+getterRealPart()+getterImagePart()+"i"; } else { s = s+getterRealPart()+"+"+getterImagePart()+"i"; } } return s; } 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,RealPart*a.ImagePart + ImagePart*a.RealPart); } Complex ComplexDiv(Complex a) { return new Complex((RealPart * a.ImagePart + ImagePart * a.RealPart) / (a.ImagePart * a.ImagePart + a.RealPart * a.RealPart), (ImagePart * a.ImagePart + RealPart * a.RealPart) / (a.RealPart * a.RealPart + a.RealPart * a.RealPart)); } }
测试代码
import junit.framework.TestCase; import org.junit.Test; public class ComplexTest extends TestCase { Complex b = new Complex(3,7); Complex c = new Complex(2,-5); @Test public void testComplexAdd(){ assertEquals("5.0+2.0i",b.ComplexAdd(c)+""); } @Test public void testComplexMulti(){ assertEquals("41.0-1.0i",b.ComplexMulti(c)+""); } @Test public void testComplexDiv(){ assertEquals("-0.034482758620689655-3.625i",b.ComplexDiv(c)+""); } @Test public void testComplexSub(){ assertEquals("1.0+12.0i",b.ComplexSub(c)+""); } }
这个Div是因为选数不慎,但是已经修改了
全部过关
五:
实验要求:
使用[WhiteStarUML](http://whitestaruml.sourceforge.net/)对实验二中的代码进行建模,发类图的截图,加上学号水印。
参考http://www.cnblogs.com/rocedu/p/6736847.html
类图中只少两个类。
实验步骤:
实验过程中遇到的问题及其解决
1:无论如何junit没有效果总是红字显示我没有junit
后来发现是因为我在一个文件夹里面总是考了两个相同的类(一个用来@TEST)
解决方法:删除一个
2:做TDD例子的时候总是会便用找不到类??
后来发现是类名写错了,,卡了我好久想想觉得好笑