2018-2019-2 20175320实验二《Java面向对象程序设计》实验报告

一、实验步骤及内容

(一)了解使用JUint,并对示例代码MyUtil进行测试

1、先在IDEA中安装JUnit插件,并在IDEA中的项目中加入junit.jar包。

2、创建类MyUtil,输入示例代码MyUtil,点击类名会出现一个灯泡状图标,在弹出的菜单中选择Create Test,并选择JUnit3的测试用例 。



3、之后选中文件夹中的MyUtilTest类,编写测试用例,注意测试用例前一定要有注解@Test,如有代码标示为红色,则使用Alt+Enter并选择IDEA提供的解决办法。



4、右键点击测试测试类进行测试,测试结果如果为红色字体,说明测试没通过,可以在测试结果的窗口中查看实际输出与期望输出,并可点击下方的蓝色字体找到是哪个测试没通过。



5、排除错误之后,再进行测试,直到测试结果的字体为绿色。

(二)使用JUnit学习Java,以 TDD的方式研究学习StringBuffer

TDD即为 测试驱动开发,编写程序就好比建筑,先用工具制定好标准,按照标准逐步完成项目,最后所有标准符合了,工程就完成了,TDD就是就是这样一种开发方法,TDD一般步骤为:

  • 明确当前要完成的功能,记录成一个测试列表
  • 快速完成编写针对此功能的测试用例
  • 测试代码编译不通过
  • 编写产品代码
  • 测试通过
  • 对代码进行重构,并保证测试通过
  • 循环完成所有功能的开发

    而在本次实验中我们使用JUit,结合TDD原则来了解StringBuffer类的各种方法的作用。

    1、创建一个StringBufferDemo类,将老师提供的StringBufferDemo类的代码复制进去,也可使用空类。

    2、按第一阶段的步骤创建一个测试类,编写测试用例,并对StringBuffer类的charAt()、capacity()、indexOf()以及length()方法进行测试。

    3、在测试前想好期望输出的结果并写入测试用例,测试后,若测试不通过,则说明对StringBuffer类的某一方法的理解有误,找到出错的测试用例,结合实际的输出值对理解有误的方法进行学习。

    运行结果如下图:

(三)初步理解设计模式,体会OCP原则和DIP原则的应用,并对抽象工厂进行扩充

在面向对象的编程过程中我们需要注意三要素,其中包括:封装、继承、多态。面向对象的思想涉及到软件开发的各个方面,如面向对象分析(OOA)、面向对象设计(OOD)、面向对象编程实现(OOP)。而实现三要素可以使用S.O.L.I.D原则:

  • SRP(单一职责原则)
  • OCP(开放-封闭原则)
  • LSP(替换原则)
  • ISP(接口分离原则)
  • DIP(依赖倒置原则)

    而本次实验我们通过设计模式中的抽象工厂来体会OCP原则和DIP原则,在不改变原有类的情况下对功能进行扩充,使示例程序支持Boolean类。在看过示例代码后,我了解到Data类的功能是抽象数据类型,Factory类是抽象创建数据类型的对象,在这基础上,我编写了添加了对Boolean类的支持,代码如下:
abstract class Data {//抽象变量声明
abstract public void DisplayValue();
}
class Integer extends Data {
int value; Integer() {
value = 100;
} public void DisplayValue() {
System.out.println(value);
}
}
class Boolean extends Data {
boolean value; Boolean() {
value = true;
} public void DisplayValue() {
System.out.println(value);
}
}
abstract class Factory {//抽象不同数据类型对象的创建
abstract public Data CreateDataObject();
}
class BoolFactory extends Factory {//创建boolean数据类型的对象
public Data CreateDataObject() {
return new Boolean();
}
}
class IntFactory extends Factory { public Data CreateDataObject() {
return new Integer();
}
}
class Document {
Data pd; Document(Factory pf) {
pd = pf.CreateDataObject();
} public void DisplayData() {
pd.DisplayValue();
}
} //Test class
public class MyDoc {
static Document d, a; public static void main(String[] args) {
d = new Document(new IntFactory());
a = new Document(new BoolFactory());
d.DisplayData();
a.DisplayData();
}
}

运行结果如图:

(四)以TDD的方式开发一个复数类Complex

根据需求,复数类需要以下数据类型和方法:

  • 存放实部与虚部的浮点型变量
  • 设置以及获取复数类的实部与虚部值的set以及get方法
  • 重写比较两个复数是否相等的equals方法以及获取复数信息的toString方法
  • 进行加减乘除的方法
  • 两种不同的构造方法

    根据需求需求我先编写了测试代码,依据测试代码我完成了复数类的编写,Complex类的代码如下:
import java.math.BigDecimal;

public class Complex {
double RealPart;
double ImagePart; public Complex() { } public Complex(double R, double I) {
RealPart = R;
ImagePart = I;
} public double getRealPart() {
return RealPart;
} public double getImagePart() {
return ImagePart;
} public void setImagePart(double i) {
ImagePart = i;
} public void setRealPart(double r) {
RealPart = r;
} public boolean equals(Object obj) {
if (this.RealPart == ((Complex) obj).RealPart && this.ImagePart == ((Complex) obj).ImagePart) {
return true;
} else {
return false;
}
} public String toString() {
if (RealPart != 0.0) {
if (ImagePart > 0.0) {
return RealPart + "+" + ImagePart + "i";
}
if (ImagePart < 0.0) {
return RealPart +""+ ImagePart + "i";
} else {
return String.valueOf(RealPart);
}
} else {
return ImagePart + "i";
}
} Complex ComplexAdd(Complex a) {
return new Complex(a.RealPart + this.RealPart, a.ImagePart + this.ImagePart);
} Complex ComplexSub(Complex a) {
return new Complex(RealPart - a.RealPart, ImagePart - a.ImagePart);
} Complex ComplexMulti(Complex a) {
return new Complex(this.RealPart * a.RealPart - this.ImagePart * a.ImagePart, this.RealPart * a.ImagePart + ImagePart * a.RealPart);
} Complex ComplexDiv(Complex a) {
BigDecimal bg = new BigDecimal((RealPart * a.ImagePart + ImagePart * a.RealPart) / (a.ImagePart * a.ImagePart + a.RealPart * a.RealPart));
BigDecimal ag = new BigDecimal((ImagePart * a.ImagePart + RealPart * a.RealPart) / (a.ImagePart * a.ImagePart + a.RealPart * a.RealPart));
return new Complex(ag.setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue(),bg.setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue());
}
}

运行结果如图:

(五)使用StarUML对实验二中的代码进行建模

我选择了抽象工厂的相关代码绘制UML图,图片效果如下:

二、实验时遇到的问题:

  • 问题1:在引入Test类后注释@Test任显示为红色。
  • 问题1解决方法:点击注释,再点击灯泡装图标,选择IDEA提供的解决方法即可。
  • 问题2:复数类的除法输出的浮点数的小数位过长。
  • 问题2解决方法:引入了math类库中的BigDecimal类,控制输出的数保留一位小数。

三、实验感想

本次实验中了解了如何使用JUit进行测试,并认识了TDD方式开发程序的方法,这对我以后测试程序很有帮助,而S.O.L.I.D原则规范了我的编程方法,让我认识到自己以前写的程序都是比较杂乱的。并通过对抽象工厂的范例我大致了解了应如何实现对拓展开放,本次实验使我有了不少的收获。

附上PSP时间:

步骤 耗时 百分比
需求分析 20 15%
设计 12 12%
代码实现 35 27%
测试 45 35%
分析总结 15 11%

2018-2019-2 20175320实验二《Java面向对象程序设计》实验报告的更多相关文章

  1. 20145213《Java程序设计》实验二Java面向对象程序设计实验报告

    20145213<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装,继承,多态 初步掌握UML建模 熟悉S.O. ...

  2. 20145206《Java程序设计》实验二Java面向对象程序设计实验报告

    20145206<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...

  3. 20145308刘昊阳 《Java程序设计》实验二 Java面向对象程序设计 实验报告

    20145308刘昊阳 <Java程序设计>实验二 Java面向对象程序设计 实验报告 实验名称 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面相对象三要素:封 ...

  4. 20162311 实验二 Java面向对象程序设计 实验报告

    实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...

  5. 实验二Java面向对象程序设计实验报告(2)

    实验二 Java面向对象程序设计 实验概述: 课程:程序设计与数据结构 班级:1623班 姓名: 邢天岳 学号:2309 指导老师:娄老师 王老师 实验日期:2017.4.16 实验名称: Java面 ...

  6. 实验二 Java面向对象程序设计实验报告

    实验二 Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验 ...

  7. 20145326《Java程序设计》实验二Java面向对象程序设计实验报告

    20145326<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...

  8. 20155217 实验二 Java面向对象程序设计 实验报告

    20155217 实验二 Java面向对象程序设计 实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模 ...

  9. 20145219 《Java程序设计》实验二 Java面向对象程序设计实验报告

    20145219 <Java程序设计>实验二 Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S. ...

  10. 20162305 实验二 Java面向对象程序设计 实验报告

    20162305 实验二 Java面向对象程序设计 实验报告 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D ...

随机推荐

  1. RT-SA-2019-005 Cisco RV320 Command Injection Retrieval

    Advisory: Cisco RV320 Command Injection RedTeam Pentesting discovered a command injection vulnerabil ...

  2. AB PLC分类

    AB PLC产品更新速度还是挺快的,以前很多产品都停产了,所以分类也跟着调整,就目前而言: 一.主要类型 AB PLC按类型,主要分为三大类: • 小型:MicroLogix控制器 • 中型:Comp ...

  3. Java URLClassLoader 和 ClassLoader类加载器

    开始:看名字都带有ClassLoader,叫做类加载器,事实上是可以理解为动态的加载类,不过,也不是只能加载类,也可以加载其他形式的文件,比如说.properties属性文件. 区别:其实在两个类加载 ...

  4. 编程入门视频【 Python、PHP、ThinkPHP、Laravel、Mysql、微信小程序】

    免费分享 Python.PHP.ThinkPHP.Laravel.Mysql.微信小程序等学习视频 点击进入搜刮 免费分享 Python.PHP.ThinkPHP.Laravel.Mysql.微信小程 ...

  5. Python-Django 视图层

    1 request对象 method:请求方式 GET:get请求的参数(post请求,也可以携带参数) POST:post请求的参数(本质是从bdoy中取出来,放到里面了) COOKIES---&g ...

  6. vue源码分析之目录架构(一)

    compiler compiler 目录包含 Vue.js 所有编译相关的代码.它包括把模板解析成 ast 语法树,ast 语法树优化,代码生成等功能 core core 目录包含了 Vue.js 的 ...

  7. 在vue-cli3 中import引入一个没有export default{}的js文件

    如果这个js文夹,放在vue-cli3中搭建的项目中的,public文件夹下,通过 //.js可以省略不行 import '/public/xxx.js' 其实你在浏览器中看的时候,发现会报错误 :  ...

  8. ajax与后台交互案例

    BBS项目 //BBS项目,注册页面ajax请求 // 1.实现照片预览 $("#up_myhead").change(function () { // 获取input选择的文件 ...

  9. 【JavaScript】 使用extend继承对象的prototype方法

    之前有学习过通过prototype模式来构造类,并通过prototype来添加方法.好处大概有以下几点: 1.类方法可以都放在prototype中,可以提高性能效率. 2.可以用prototype来实 ...

  10. Python中append()与extend()的区别

    列表方法append()和extend()之间的差异: append:在最后追加对象 x = [1, 2, 3] x.append([4, 5]) print (x) 结果 [1, 2, 3, [4, ...