实验二《Java面向对象程序设计》

实验报告封面

课程:Java程序设计 班级:1752班 姓名:曾祥杰 学号:20175221

指导教师:娄嘉鹏 实验日期:2019年4月17日

实验时间:13:45 - 15:25 实验序号:21

实验名称:面向对象程序设计

一.实验内容

1. 初步掌握单元测试和TDD

2. 理解并掌握面向对象三要素:封装、继承、多态

3. 初步掌握UML建模

4. 熟悉S.O.L.I.D原则

5. 了解设计模式

二.实验步骤

  • 第一部分:初步掌握单元测试和TDD

  • 在IDEA中,我们首先创建一个项目 MyUtil.java ,并输入如图代码:
  • 针对 MyUtil 类我们写一个 MyUtilTest.java 的测试模块:
  • 在 IDEA中我们把产品代码放在 src 中,在 IDEA中我们把产品代码放在 test 中 ,右键单击项目,在弹出的菜单中选择 New->Directory 新建一个目录并输入目录名 test 。右键单击test目录,在弹出的菜单中选择 Mark Directory as->Test Sources Root ,随后运行 MyUtilTest.java
  • 在IDEA中运行结果如上,测试结果符合预期。
  • 然而只有一组输入的测试是不充分的,把一般情况都测试一下,运行结果如图,测试结果符合预期:
  • 我们不能只测试正常情况,下面看看异常情况如何,比如输入为负分或大于100的成绩,测试结果如下:
  • 运行程序发现负分时与期望不一致,终于找到了一个bug,原因是判断不及格时没有要求成绩大于零。我们修改 MyUtil.java ,增加对负分的判断,测试结果如下:
  • 一般代码在边界处最容易出错,我们还没有测试边界情况,我们对输入为“0,60,70,80,90,100”这些边界情况进行测试的代码如下:
  • 我们发现边界情况中输入100时有一个Bug。我们修改 MyUtil.java ,把判断优秀的条件中包含输入为100的情况,测试结果如下:

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

TDD的一般步骤如下:

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

随后我们下载并配置Junit,完成后新建一个项目 MyUtil 。单击类名会出现一个灯泡状图标,选择 Create Test

  • 随后选择创建JUnit3
  • 我们增加测试用例 MyUtilTest ,异常情况的用例 testException ,测试边界情况的用例 testBoundary ,代码如下:
  • public class MyUtil{
    public static String percentage2fivegrade(int grade){
    //如果成绩小于0,转成“错误”
    if ((grade < ))
    return "错误";
    //如果成绩小于60,转成“不及格”
    else if (grade < )
    return "不及格";
    //如果成绩在60与70之间,转成“及格”
    else if (grade < )
    return "及格";
    //如果成绩在70与80之间,转成“中等”
    else if (grade < )
    return "中等";
    //如果成绩在80与90之间,转成“良好”
    else if (grade < )
    return "良好";
    //如果成绩在90与100之间,转成“优秀”
    else if (grade <= )
    return "优秀";
    //如果成绩大于100,转成“错误”
    else
    return "错误";
    }
    }
    import org.junit.Test;
    import junit.framework.TestCase;
    public class MyUtilTest extends TestCase {
    @Test
    public void testNormal() {
    assertEquals("不及格", MyUtil.percentage2fivegrade());
    assertEquals("及格", MyUtil.percentage2fivegrade());
    assertEquals("中等", MyUtil.percentage2fivegrade());
    assertEquals("良好", MyUtil.percentage2fivegrade());
    assertEquals("优秀", MyUtil.percentage2fivegrade());
    }
    @Test
    public void testExceptions(){
    assertEquals("错误", MyUtil.percentage2fivegrade(-));
    assertEquals("错误", MyUtil.percentage2fivegrade());
    }
    @Test
    public void testBoundary(){
    assertEquals("不及格", MyUtil.percentage2fivegrade());
    assertEquals("及格", MyUtil.percentage2fivegrade());
    assertEquals("中等", MyUtil.percentage2fivegrade());
    assertEquals("良好", MyUtil.percentage2fivegrade());
    assertEquals("优秀", MyUtil.percentage2fivegrade());
    assertEquals("优秀", MyUtil.percentage2fivegrade());
    }
    }
  • 运行结果如下:
  • 第二部分:以 TDD的方式研究学习StringBuffer

  • StringBuffer的例子,代码如下:
  • import junit.framework.TestCase;
    import org.junit.Test; public class StringBufferDemoTest extends TestCase {
    StringBuffer a = new StringBuffer("StringBuffer");
    StringBuffer b = new StringBuffer("StringBufferStringBuffer");
    StringBuffer c = new StringBuffer("StringBufferStringBufferStringBuffer");
    @Test
    public void testcharAt() throws Exception {
    assertEquals('S',a.charAt(0));
    assertEquals('g',a.charAt(5));
    assertEquals('r',a.charAt(11));
    }
    @Test
    public void testcapacity() throws Exception {
    assertEquals(28,a.capacity());
    assertEquals(40,b.capacity());
    assertEquals(52,c.capacity());
    }
    @Test
    public void testlength() throws Exception {
    assertEquals(12,a.length());
    assertEquals(24,b.length());
    assertEquals(36,c.length());
    }
    @Test
    public void testindexOf() throws Exception {
    assertEquals(0,a.indexOf("Str"));
    assertEquals(5,a.indexOf("gBu"));
    }
    }
  • 运行结果如下

第三部分:设计模式

面向对象的三要素

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

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

  • SRP(Single ResponsibilityPrinciple,单一职责原则)
  • OCP(Open-Closed Principle,开放-封闭原则)
  • LSP(Liskov Substitusion Principle,Liskov替换原则)
  • ISP(Interface Segregation Principle,接口分离原则)
  • DIP(Dependency Inversion Principle,依赖倒置原则

设计模式四个基本要素:

  • Pattern name:描述模式,便于交流,存档
  • Problem:描述何处应用该模式
  • Solution:描述一个设计的组成元素,不针对特例
  • Consequence:应用该模式的结果和权衡(trade-offs)

其他面对对象原则:

  • "组合替代继承":这是说相对于继承,要更倾向于使用组合
  • "笛米特法则":这是说"你的类对其它类知道的越少越好"
  • "共同封闭原则":这是说"相关类应该打包在一起"
  • "稳定抽象原则":这是说"类越稳定,越应该由抽象类组成"

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

代码如下:

// Server Classes
abstract class Data {
abstract public void DisplayValue();
}
class Integer extends Data {
int value;
Integer() {
value=;
}
public void DisplayValue(){
System.out.println (value);
}
}
class Long extends Data {
long value;
Long(){
value=;
}
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 LonFactory extends Factory {
public Data CreateDataObject(){
return new Long();
}
}
class Document {
Data pd;
Document(Factory pf){
pd = pf.CreateDataObject();
}
public void DisplayData(){
pd.DisplayValue();
}
}
public class MyDoc {
static Document zxj;
public static void main(String[] args) {
zxj=new Document(new LonFactory());
zxj.DisplayData();
}
}

运行结果:

第四部分:以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)

实验代码

public class Complex{
private double real;
private double image; public Complex(double real, double image) {
this.real = real;
this.image = image;
} public static double getRealPart(double real) {
return real;
} public static double getImagePart(double image) {
return image;
} public Complex ComplexAdd(Complex c) {
return new Complex(real + c.real, image + c.image);
}
public Complex ComplexSub(Complex c) {
return new Complex(real - c.real, image - c.image);
}
public Complex ComplexMulti(Complex c) {
return new Complex(real * c.real - image * c.image, real * c.image + image * c.real);
}
public Complex ComplexDiv(Complex c) {
return new Complex((real * c.image + image * c.real)/(c.image * c.image + c.real * c.real), (image * c.image + real * c.real)/(c.image * c.image + c.real * c.real));
} public String toString() {
String s = " ";
if (image > )
s = real + "+" + image + "i";
if (image == )
s = real + "";
if (image < )
s = real + " " + image + "i";
return s;
}
}

测试代码

import junit.framework.TestCase;
import org.junit.Test; public class ComplexTest extends TestCase {
Complex a = new Complex(0.0, 2.0);
Complex b = new Complex(-1.0, -1.0);
Complex c = new Complex(1.0,2.0);
@Test
public void testgetRealPart() throws Exception {
assertEquals(0.0, Complex.getRealPart(0.0));
assertEquals(-1.0, Complex.getRealPart(-1.0));
assertEquals(1.0, Complex.getRealPart(1.0));
}
@Test
public void testgetImagePart() throws Exception {
assertEquals(2.0, Complex.getImagePart(2.0));
assertEquals(-1.0, Complex.getImagePart(-1.0));
assertEquals(2.0, Complex.getImagePart(2.0));
}
@Test
public void testComplexAdd() throws Exception {
assertEquals("-1.0+1.0i", a.ComplexAdd(b).toString());
assertEquals("1.0+4.0i", a.ComplexAdd(c).toString());
assertEquals("0.0+1.0i", b.ComplexAdd(c).toString());
}
@Test
public void testComplexSub() throws Exception {
assertEquals("1.0+3.0i", a.ComplexSub(b).toString());
assertEquals("-1.0", a.ComplexSub(c).toString());
assertEquals("-2.0 -3.0i", b.ComplexSub(c).toString());
}
@Test
public void testComplexMulti() throws Exception {
assertEquals("2.0 -2.0i", a.ComplexMulti(b).toString());
assertEquals("-4.0+2.0i", a.ComplexMulti(c).toString());
assertEquals("1.0 -3.0i", b.ComplexMulti(c).toString());
}
@Test
public void testComplexComplexDiv() throws Exception {
assertEquals("-1.0 -1.0i", a.ComplexDiv(b).toString());
assertEquals("0.4+0.8i", a.ComplexDiv(c).toString());
assertEquals("-0.6 -0.6i", b.ComplexDiv(c).toString());
}
}

运行结果

码云链接(https://gitee.com/zxjacdl/zxj175221/tree/master/shiyan2)

第五部分:对实验二中的代码进行建模,发类图的截图

实验中遇到的问题

问题1:

在第一次使用TDD的那个实验中,增加MyUtil的测试类之后,TestCase显示红色的,但是不知道junit.jar在哪里

问题1解决方案:

上网查了才知道解决方案,步骤如下:

1.找到电脑中IDEA安装路径

2.File->Project Structure

3.点击Dependencies,单击右上角的+,然后选择第一个JARs or directories

4.复制刚才的路径名,找到junit-4.12 jar、 junit.jar

IDEA导入Junit4jar包(https://blog.csdn.net/zoozyy/article/details/78485965)

实验体会:

  • 这次的实验对我来说还是很有难度的。
  • 虽然每一步的教程都有,但期间无论是下载东西还是编写代码,都还是出现了很多难题。
  • 还是在和伙伴讨论合作下完成的。希望以后的实验也可以做好
步骤 耗时 百分比
需求分析 10min 6%
设计 30min 18%
代码实现 70min 41%
测试 20min 12%
分析总结 40min 23%

20175221曾祥杰 实验二《Java面向对象程序设计》的更多相关文章

  1. 20175221曾祥杰 实验四《Android程序设计》

    实验四<Android程序设计> 实验报告封面 课程:Java程序设计 班级:1752班 姓名:曾祥杰 学号:20175221 指导教师:娄嘉鹏 实验日期:2019年5月13日 实验时间: ...

  2. 实验二 Java面向对象程序设计

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

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

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

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

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

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

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

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

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

  7. JAVA课程实验报告 实验二 Java面向对象程序设计

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计  班级:1353  姓名:韩玉琪  学号:20135317 成绩:             指导教师:娄嘉 ...

  8. 20145225唐振远 实验二 "Java面向对象程序设计"

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

  9. 20145208 实验二 Java面向对象程序设计

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

随机推荐

  1. 《JavaScript高级程序设计》笔记:DOM扩展(十一)

    选择符API querySelector()方法 // 取得body元素 var tbody = document.querySelector('body'); // 取得ID为"myDIV ...

  2. OPPO realme 2在哪里打开Usb调试模式的简单步骤

    每当我们使用PC通过数据线链接到安卓手机的时候,如果手机没有开启USB调试模式,PC则没能成功识别我们的手机,这时我们需要找解决方法将手机的USB调试模式开启,下文我们记录一下OPPO realme ...

  3. 学习安卓开发[4] - 使用隐式Intent启动短信、联系人、相机应用

    在上一篇学习安卓开发[3] - 使用RecyclerView显示列表中了解了在进行列表展示时RecyclerView的使用,本次记录的是在应用中如何通过隐式Intent调用其它应用的功能,比如发短信. ...

  4. LEDE 虚拟机安装

    虽然我对路由器没什么兴趣,但是紧跟潮流还是有必要的,现在因为网络闭关锁国政策,很多人都想自己搭配一台私人的服务器,不想被商业公司左右数据安全.我感觉这个是一个商机,建议大家可以朝这个方向发展. 这里最 ...

  5. SQL Server 增加链接服务器

    exec sp_addlinkedserver '名称' , '' , 'SQLOLEDB' , '10.102.29.xxx' exec sp_addlinkedsrvlogin '名称' , 'f ...

  6. VirtualBox Network Config

    Sharing Host VPN with VirtualBox guest After looking for this solution everywhere, I finally found a ...

  7. Git 简单粗暴使用

    1.现在总结一下今天学的两点内容: 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file>,注意,可反复多次使用,添 ...

  8. 【心得】Lattice后端使用经验小结(ECP5UM,DDR3,Diamond3.10,Reveal逻辑分析)

    [博客导航] [导航]FPGA相关 背景 下边的内容,适合初次使用Lattice的.具备FPGA开发经验的同学. 1.初次使用,还真遇到不少的坑,Lattice的工具也有不少优缺点,通过总结,希望能缩 ...

  9. 解决CSDN需要登录才能看全文

    本来今天学习遇到一些问题,在网上翻着博客,突然在csdn里就提示要登录才能看全文. 看了下页面源码博客内容已经拿到本地了,只是加了一层罩,也是挺无语的,暂时先用这种方法解决吧: (function() ...

  10. shell 编程初级

    shell编程的简单代码 一些基础代码 直接上代码 #!/bin/bash myUrl="gggggggg" # 只读变量设置 # readonly myUrl echo &quo ...