20175212童皓桢 Java实验二-面向对象程序设计实验报告

实验内容

  • 初步掌握单元测试和TDD
  • 理解并掌握面向对象三要素:封装、继承、多态
  • 初步掌握UML建模
  • 熟悉S.O.L.I.D原则
  • 了解设计模式

实验步骤

(一)单元测试

  • 在IDEA中建一个项目MyUtil
  • 对于MyUtil类,建立一个MyUtilTest1.java的测试类:
新建一个test文件夹在根目录中->右键选择Mark Directory as->Test Sources Root



之后在test文件夹中建立一个MyUtilTest1.java的测试类

  • 在文件中输入如图代码并运行,测试结果如下:

正常情况

边界情况

异常情况

(二)TDD(Test Driven Devlopment, 测试驱动开发)

  • 按照教程安装Juit和JUnitGenerator V2.0

  • 点击源代码中的类名MyUtil,选择Junit3测试用例,建立一个MyUtilTest测试文件

  • 若TestCase是红色,则引入junit.jar包

  • 输入如图测试代码并运行,如果测试失败则出现如图提示

  • 根提示据修改源代码,注意边界异常情况,修改完善后测试通过

(三)以TDD方式研究学习StringBuffer

  • 按照老师给出的程序输入
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.length());
System.out.println(buffer.indexOf("tring"));
System.out.println("buffer = " + buffer.toString());
  • 将方法进行重写,添加返回值,以便于测试
public class StringBufferDemo{
StringBuffer buffer = new StringBuffer();
public StringBufferDemo(StringBuffer buffer){
this.buffer = buffer;
}
public Character charAt(int i){
return buffer.charAt(i);
}
public int capacity(){
return buffer.capacity();
}
public int length(){
return buffer.length();
}
public int indexOf(String buf) {
return buffer.indexOf(buf);
}
}
  • 利用API查出并猜测charAt(int i),indexOf(String s),capacity(),length()四种方法的功能。





  • 利用JUnit进行测试,并输入如图测试代码,test passed!

(四)面向对象的三要素

  • 面向对象(Object-Oriented)的三要素包括:封装、继承、多态。面向对象的思想涉及到软件开发的各个方面,如面向对象分析(OOA)、面向对象设计(OOD)、面向对象编程实现(OOP)。OOA根据抽象关键的问题域来分解系统,关注是什么(what)。OOD是一种提供符号设计系统的面向对象的实现过程,用非常接近问题域术语的方法把系统构造成“现实世界”的对象,关注怎么做(how),通过模型来实现功能规范。OOP则在设计的基础上用编程语言(如Java)编码。贯穿OOA、OOD和OOP的主线正是抽象。

(五)设计模式初步

  • S.O.L.I.D原则

    • SRP(Single Responsibility Principle,单一职责原则):决不要有一个以上的理由修改一个类
    • OCP(Open-Closed Principle,开放-封闭原则):软件实体(类,模块,函数等)应该对扩充开放,对修改封闭。
    • LSP(Liskov Substitusion Principle,Liskov替换原则)
      • 子类必须可以被其基类所代
      • 使用指向基类的指针或引用的函数,必须能够在不知道具体派生类对象类型的情况下使用它
    • ISP(Interface Segregation Principle,接口分离原则):客户不应该依赖他们并未使用的接口
    • DIP(Dependency Inversion Principle,依赖倒置原则)
      • 高层模块不应该依赖于低层模块。二者都应该依赖于抽象
      • 抽象不应该依赖于细节。细节应该依赖于抽象
  • 模式与设计模式
    • 设计模式有四个基本要素:

      • Pattern name:描述模式,便于交流,存档
      • Problem:描述何处应用该模式
      • Solution:描述一个设计的组成元素,不针对特例
      • Consequence:应用该模式的结果和权衡(trade-offs)
  • 其他面对对象原则
    • "组合替代继承":这是说相对于继承,要更倾向于使用组合;
    • "笛米特法则":这是说"你的类对其它类知道的越少越好";
    • "共同封闭原则":这是说"相关类应该打包在一起";
    • "稳定抽象原则":这是说"类越稳定,越应该由抽象类组成";

(六)对MyDoc类进行扩充,让其支持Byte类,初步理解设计模式

题目 :对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式,让系统支持Byte类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印

// Server Classes
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=127;
}
public void DisplayValue(){
System.out.println(value);
}
}
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();
}
}
class Document {
Data pd;
Document(Factory pf){
pd = pf.CreateDataObject();
}
public void DisplayData(){
pd.DisplayValue();
}
}
public class MyDoc {
static Document d;
static Document e;
public static void main(String[] args) {
e=new Document(new ByteFactory());
e.DisplayData();
}
}
  • 运行结果:

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

  • 任务:以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)

本道练习题基本考察TDD编码的节奏。因为本题中实部虚部很容易混淆,导致出错



因此根据测试代码来修改产品代码的优越性得以体现。

  • 产品代码:
public class Complex{
private double a;
private double b; public Complex(double a, double b) {
this.a = a;
this.b = b;
} public static double getRealPart(double a) {
return a;
} public static double getImagePart(double b) {
return b;
} public Complex ComplexAdd(Complex c) {
return new Complex(a + c.a, b + c.b);
}
public Complex ComplexSub(Complex c) {
return new Complex(a - c.a, b - c.b);
}
public Complex ComplexMulti(Complex c) {
return new Complex(a * c.a - b * c.b, a * c.b + b * c.a);
}
public Complex ComplexDiv(Complex c) {
return new Complex((a * c.b + b * c.a)/(c.b * c.b + c.a * c.a), (b * c.b + a * c.a)/(c.b * c.b + c.a * c.a));
} public String toString() {
String s = " ";
if (b > 0)
s = a + "+" + b + "i";
if (b == 0)
s = a + "";
if (b < 0)
s = a + " " + b + "i";
return s;
}
}
  • 测试代码
import junit.framework.TestCase;
import org.junit.Test; public class ComplexTest extends TestCase {
Complex c1 = new Complex(0, 2);
Complex c2 = new Complex(-1, -1);
Complex c3 = new Complex(1,1);
@Test
public void testgetRealPart() throws Exception {
assertEquals(-3.0, Complex.getRealPart(-3.0));
assertEquals(3.0, Complex.getRealPart(3.0));
assertEquals(0.0, Complex.getRealPart(0.0));
}
@Test
public void testgetImagePart() throws Exception {
assertEquals(-3.0, Complex.getImagePart(-3.0));
assertEquals(3.0, Complex.getImagePart(3.0));
assertEquals(0.0, Complex.getImagePart(0.0));
}
@Test
public void testComplexAdd() throws Exception {
assertEquals("-1.0+1.0i", c1.ComplexAdd(c2).toString());
assertEquals("1.0+3.0i", c1.ComplexAdd(c3).toString());
assertEquals("0.0", c2.ComplexAdd(c3).toString());
}
@Test
public void testComplexSub() throws Exception {
assertEquals("1.0+3.0i", c1.ComplexSub(c2).toString());
assertEquals("-1.0+1.0i", c1.ComplexSub(c3).toString());
assertEquals("-2.0 -2.0i", c2.ComplexSub(c3).toString());
}
@Test
public void testComplexMulti() throws Exception {
assertEquals("2.0 -2.0i", c1.ComplexMulti(c2).toString());
assertEquals("-2.0+2.0i", c1.ComplexMulti(c3).toString());
assertEquals("0.0 -2.0i", c2.ComplexMulti(c3).toString());
}
@Test
public void testComplexComplexDiv() throws Exception {
assertEquals("-1.0 -1.0i", c1.ComplexDiv(c2).toString());
assertEquals("1.0+1.0i", c1.ComplexDiv(c3).toString());
assertEquals("-1.0 -1.0i", c2.ComplexDiv(c3).toString());
} }
  • 运行结果截图

(八)对实验二中的代码进行建模

  • 代码如下:
public abstract class Animal {
private String color;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public abstract String shout();
}
public class Dog extends Animal{
public String shout(){
return "汪汪";
}
public String toString(){
return "The Dog's color is " + this.getColor() +", and it shouts "+ this.shout() + "!";
}
}
public class Cat extends Animal{
public String shout(){
return "喵喵";
}
public String toString(){
return "The Cat's color is " + this.getColor() +", and it shouts "+ this.shout() + "!";
}
}
  • 创建的UML类图

实验中遇到的问题

  • 问题一:包名Junit提示错误

  • 解决办法一:参考同学的博客,摸索出方法,具体如下:
File -> Project Struct... -> Libraies -> 点击加号 -> Java -> 选择IDEA目录下的Lib中的junit-4.12 ->选择ok

另外的,如果当时安装是通过Toolbox,IDEA的安装目录则很有可能被隐藏,因此需搜索junit-4.12找到具体路径后,在管理员权限下解除隐藏才能选择。

  • 问题二:单元测试时提示找不到main方法。

  • 解决办法二: 尝试修改测试类名与JUnit测试类名不同,即可解决。

感悟和体会

  • 利用API可以查询并学习使用一些功能强大的类和方法。
  • 并跟随TDD方法的节奏设计出伪代码、产品代码和测试代码,有利于自己的程序除了正确性,在更高层面不容易出错
  • 之后可以考虑更加改善测试单元的写法,比如测试例子由计算机穷举生成。

参考博客

https://www.cnblogs.com/Vivian517/p/6741501.html#YI

20175212童皓桢 Java实验二-面向对象程序设计实验报告的更多相关文章

  1. 20175316 盛茂淞 2018-2019-2 《Java程序设计》实验二 面向对象程序设计 实验报告

    20175316 盛茂淞 2018-2019-2 <Java程序设计>实验二 面向对象程序设计 实验报告 (一)单元测试 在 IDEA中我们把产品代码放在src目录中,把测试代码放在tes ...

  2. 20155220java实验二 面向对象程序设计 实验报告

    一.实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步骤 (一)单元测试 (1) 三种代码 伪代码 产 ...

  3. 20175212童皓桢 实验四 Android程序设计

    20175212童皓桢 实验四 Android程序设计 实验内容 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)>并完成相关 ...

  4. 20175212童皓桢 实验三敏捷开发与XP实践实验报告

    20175212童皓桢 实验三敏捷开发与XP实践实验报告 实验内容 XP基础 XP核心实践 相关工具 实验步骤 一.Code菜单功能的研究 Move Line/statement Down/Up:将某 ...

  5. 20175212童皓桢 《Java程序设计》第11周学习总结

    20175212童皓桢 <Java程序设计>第11周学习总结 教材学习内容总结 一.URL类 1.一个URL对象通常包含最基本的三部分信息:协议.地址.资源 2.构造方法: public ...

  6. 学号 20175212童皓桢 《Java程序设计》第8周学习总结

    学号 20175212童皓桢 <Java程序设计>第8周学习总结 教材学习内容总结 泛型 class People<E> 其中People是泛型类的名称,E是其中的泛型,也就是 ...

  7. 20175212童皓桢 《Java程序设计》第六周学习总结

    20175212童皓桢 <Java程序设计>第六周学习总结 教材学习内容总结 第七章 内部类与异常类 1.内部类 Java支持在一个类中定义另一个类,这样的类称作内部类,包含内部类的类称为 ...

  8. 2018-2019-2 20175306实验二面向对象程序设计《Java开发环境的熟悉》实验报告

    2018-2019-2 20175306实验二面向对象程序设计<Java开发环境的熟悉>实验报告 面向对象程序设计-1 实验要求: 参考:> http://www.cnblogs.c ...

  9. 2018-2019-20175205实验二面向对象程序设计《Java开发环境的熟悉》实验报告

    2018-2019-20175205实验二面向对象程序设计<Java开发环境的熟悉>实验报告 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)>< ...

随机推荐

  1. postman+newman+jenkins 接口自动化问题

    声明:个人原创,转载请注明 1.安装postman工具 下载地址:https://www.getpostman.com/点击下载,选择自己的系统,我的是windows系统,64位 2.postman ...

  2. liunx驱动----USB驱动

    现象:把usb设备接入电脑 1.Windows发现设备 2.跳出一个对话框提示安装驱动程序 问1:既然没有驱动程序,为什么了够知道是什么驱动了?? 答1:Windows里面已经有了usb总线驱动程序, ...

  3. mysql:数据库备份方案

    1. 数据库备份方案     1)没备份,跑路~     2)全量备份+增量备份 如果不小心“删库”,可以这么恢复: a. 将最近一次全量备份的全库找到,拷贝回来(文件一般比较大),解压,应用: b. ...

  4. Spring restful

    1. RESTful 不是一项技术,也不是一个标准,而是一种风格,跟servlet不在一个层面上,根本无法比较.一个基于servlet的application也是可以是符合RESTful风格的,换言之 ...

  5. ceph运维常用指令

    一.集群 1.启动一个ceph 进程 启动mon进程 service ceph start  mon.node1 启动msd进程 service ceph start mds.node1 启动osd进 ...

  6. es2018(es9)前瞻

    命名捕获 语法 : ?<name> 一:举个栗子 我们要把从2018-05-20取出年月日 1:普通方法 let str = '2018-05-20'; let reg1 = /(\d{4 ...

  7. window bat 切换目录并执行php文件

    新建一个 test.bat文件,输入一下命令并保存 cmd /k "cd /d D:\PHPWAMP_IN2\phpwamp\server\Nginx-PHPWNMP\htdocs\test ...

  8. 【codeforces 242E】XOR on Segment

    [原题题面]传送门 [题面翻译]传送门 [解题思路] 操作涉及到区间求和和区间异或,考虑到异或操作,我们对每个数二进制分解. 把每一位单独提出来做,异或要么取反要么变为不变,对于每一位建一颗线段树,那 ...

  9. 20165306 Exp4 恶意代码分析

    Exp4 恶意代码分析 一.实践概述 1.实践目标 1.1是监控你自己系统的运行状态,看有没有可疑的程序在运行. 1.2是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生 ...

  10. 将pip源设置为国内源的方法

    需要将pip源设置为国内源,阿里源.豆瓣源.网易源等 - windows (1)打开文件资源管理器(文件夹地址栏中) (2)地址栏上面输入 %appdata% (3)在这里面新建一个文件夹 pip ( ...