实验二 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图绘制
实验内容
使用对实验二中的代码进行建模,发类图的截图,加上学号水印。
参考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。
- 提升反馈速度,减少重复工作,提高开发效率。
- 保证你最后的代码修改不会破坏之前代码的功能。
- 让代码维护更容易。
- 有助于改进代码质量和设计。