博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
20165223 实验二 面向对象程序设计
阅读量:4952 次
发布时间:2019-06-12

本文共 8646 字,大约阅读时间需要 28 分钟。

目录

一、实验报告封面

北京电子科技学院(BESTI)

实 验 报 告

课程 Java程序设计 班级 1652班
姓名 蔡霓 学号 20165223
成绩 指导教师 娄嘉鹏
实验日期 2018年4月16日 实验密级 非密级
预习程度 已预习 实验时间 13:45 - 15:25
必修/选修 选修 实验序号

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

实验内容

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

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

3.初步掌握UML建模

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

5.了解设计模式

实验要求

1.没有Linux基础的同学建议先学习和 课程

2.完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导

3.严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。

4.请大家先在实验楼中的~/Code目录中用自己的学号建立一个目录,代码和UML图要放到这个目录中,截图中没有学号的会要求重做,然后跟着下面的步骤练习。

二、具体实验内容

(一)初步掌握单元测试和TDD

1.参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST 完成单元测试的学习

2.提交最后三个JUnit测试用例(正常情况,错误情况,边界情况)都通过的截图,截图上要有画图加水印,输入自己的学号

3.本提交点考查JUnit会不会使用,测试用例至少要包含正常情况,错误情况,边界情况的测试

(1)实验步骤

  • 新建类:MyUtil.java,输入代码
  • 新建一个测试用例类:MyUtilTest,输入代码

    Java编程时,程序员对类实现的测试叫单元测试。

    我们一般新建一个XXXXTest的类用作类XXXX的测试模块。
    这种先写测试代码,然后再写产品代码的开发方法叫“测试驱动开发”(TDD)

  • 进行基于TDD的JUnit测试

(2)实验代码

  • MyUtil.java
public class MyUtil{    public static String percentage2fivegrade(int grade){        //如果成绩小于60,转成“不及格”        if (grade < 60)            return "不及格";        //如果成绩在60与70之间,转成“及格”        else if (grade < 70)            return "及格";        //如果成绩在70与80之间,转成“中等”        else if (grade < 80)            return "中等";        //如果成绩在80与90之间,转成“良好”        else if (grade < 90)            return "良好";        //如果成绩在90与100之间,转成“优秀”        else if (grade < 100)            return "优秀";        //其他,转成“错误”        else            return "错误";    }}
  • MyUtilTest
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 testException() {        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));    }}

(3)实验截图

  • 增加测试代码,JUnit出现红条(显示2个错误)

1047360-20180416150150224-541471870.jpg

1047360-20180416150150178-746531136.jpg

  • 根据提示修改产品代码,JUnit出现绿条,任务完成

1047360-20180416150325292-1989661316.jpg

(二)以TDD的方式研究学习StringBuffer

参考

以TDD的方式研究学习StringBuffer
提交你的单元测试用例和测试通过的截图,截图要加上学号水印
测试自己会不会写JUnit测试用例

(1)实验步骤

  • 编写StringBufferDemo
  • 快速编写测试代码StringBufferDemoTest
  • TDD运行报错、更正代码
  • 出现绿条,成功

(2)实验代码

  • StringBufferDemo
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());    }}
  • 测试代码StringBufferDemoTest
import junit.framework.TestCase;import org.junit.Test;import java.lang.management.BufferPoolMXBean;public class StringBufferDemoTest extends TestCase {    StringBuffer str=new StringBuffer("StringBuffer");    @Test    public void testcharAt (){        assertEquals('S',str.charAt(0));        assertEquals('B',str.charAt(6));    }    @Test    public void testcapacity(){        assertEquals(28,str.capacity());    }    @Test    public void testindexof(){        assertEquals(6,str.indexOf("Buffer"));    }    @Test    public void testtoString(){        assertEquals("str:StringBuffer","str:"+str.toString());    }}

(3)实验截图

1047360-20180422144835143-733633897.jpg

1047360-20180422144841228-658303404.jpg

(三)面向对象程序设计-3 OCP原则和DIP原则的应用

参考

对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式
用自己的学号%6进行取余运算,根据结果(结果是5)进行代码扩充:
5: 让系统支持Double类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印

(1)实验步骤

  • 对设计模式示例进行扩充,扩充出DoubleDoubleFactory

(2)实验代码

abstract class Data {    abstract public void DisplayValue();}class Double extends Data{    double value;    Double(){        value=5;    }    public void DisplayValue(){        System.out.println(value);    }}abstract class Factory {    abstract public Data CreateDataObject();}class DoubleFactory extends Factory{    public Data CreateDataObject(){        return new Double();    }}class Document {    Data pd;    Document(Factory pf){        pd = pf.CreateDataObject();    }    public void DisplayData(){        pd.DisplayValue();    }}public class MyDoc {    static Document d;    public static void main(String[] args) {        d = new Document(new DoubleFactory());        d.DisplayData();    }}

(3)实验截图

1047360-20180422143810459-898493204.jpg

(四)面向对象程序设计-4 以TDD的方式开发一个复数类Complex

参考

任务:以TDD的方式开发一个复数类Complex

(1)实验步骤

  • 定义属性并生成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)

(2)实验代码

  • Complex
public class Complex {    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;    }    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;    }}
  • 测试代码ComplexTest
import org.junit.*;import static org.junit.Assert.*;public class ComplexTest {    Complex a = new Complex(0, 2);    Complex b = new Complex(2, -1);    @Test    public void testAdd() {        assertEquals("2.0+1.0i", a.ComplexAdd(b).toString());        System.out.println(a.ComplexAdd(b));    }    @Test    public void testSub() {        assertEquals("-2.0+3.0i", a.ComplexSub(b).toString());        System.out.println(a.ComplexSub(b));    }    @Test    public void testMulti() {        assertEquals("2.0+4.0i", a.ComplexMulti(b).toString());        System.out.println(a.ComplexMulti(b));    }    @Test    public void testDiv() {        assertEquals("-0.4+0.8i", a.ComplexDiv(b).toString());        System.out.println(a.ComplexDiv(b));    }}

(3)实验截图

1047360-20180422144402085-319830018.jpg

(五)面向对象程序设计-5 对代码进行UML类图建模

使用对实验二中的代码(选其一)进行建模,发类图的截图,加上学号水印。

参考,类图中至少有两个类。

(1)实验步骤

  • 打开StarUML,选择对MyDoc.java进行UML类图建模
  • 注意MyDoc中各变量和方法的名字

(2)实验截图

1047360-20180422144415063-1175041874.jpg

三、实验总结

  • 遇到的问题

1047360-20180422150249208-1100615760.png

刚开始使用TDD测试代码的时候还不太熟练,看到出现红条后一位运行失败了,仔细参考老师所给教程后得知可以直接在测试代码上进行修改,只需要看下端提示栏中显示的错误,就能直接点击跳转过去,并且按照给出的结论修改代码即可最终成功。另外还要查缺补漏,将各种可能性都包含在内,才能将代码进一步完善。

  • 分析与总结

这次实验蛮难的……涉及到的内容也挺多,主要是新增了单元测试和TDD的使用,从未接触过有些措手不及,所以刚开始的时候犯了挺多错误做了无用功。后来跟着教程了解到快速创建测试代码test的方法,发现IDEA真的很方便啊,增添了测试用例的使用就能更快的找出错误的地方,还能自动报错,直接帮你指出错误应该怎么修改,只需要动动手改正就行。这个实验考验了我的思维能力,毕竟要想使自己的代码显得完美无缺,就要将方方面面的漏洞都考虑到,再加上测试代码这个辅助,才能在有效时间里高效的操作,更正,完善带密码。当然以后也希望能用上这个方法对代码进行检查,特别是长代码就更需要机器帮忙识别报错了。

  • 参考资料

四、PSP时间

实验步骤 耗时 百分比
题目分析 1h 10%
思路设计 2h 20%
代码实现 5h 50%
调试测试 1h 10%
实验总结 1h 10%

转载于:https://www.cnblogs.com/moddy13162201/p/8855512.html

你可能感兴趣的文章
面试题 小结 转载
查看>>
CentOS上安装spark standalone mode(转载)
查看>>
BZOJ4550 小奇的博弈 【Nimk游戏 + dp + 组合数】
查看>>
BZOJ4916 神犇和蒟蒻 【欧拉函数 + 杜教筛】
查看>>
android开发------响应用户事件
查看>>
.net学习之委托和事件
查看>>
iOS热更新实现方式
查看>>
Android UI:看看Google官方自定义带旋转动画的ImageView-----RotateImageView怎么写(附 图片淡入淡...)...
查看>>
Swift - 多层无缝循环滚动背景(SpriteKit游戏开发)
查看>>
调用系统相机和图库,裁剪图片
查看>>
探究requestDisallowInterceptTouchEvent失效的原因
查看>>
mySQLyog 创建表格时引擎的选择与区别
查看>>
收银钱箱弹出设置
查看>>
【VC++积累】之八、PreTranslageMessage;TranslageMessage;GetMessage和PeekMessage的区别
查看>>
置顶结构[置顶] C++中hash map的用法
查看>>
方法类struts2环境搭建
查看>>
文件系统扩容工具
查看>>
HDOJ 1106 排序 (字符串处理)
查看>>
XMLHttpRequest post 传递多个参数及服务器端读取
查看>>
录音函数网络对讲机C#服务器 Android客户端(二) C#服务器代码分析 附加
查看>>