zoukankan      html  css  js  c++  java
  • 20145231《Java程序设计》第二次实验报告

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

    实验内容

    1. 初步掌握单元测试和TDD;
    2. 理解并掌握面向对象三要素;
    3. 初步掌握UML建模;
    4. 熟悉S.O.L.I.D原则;
    5. 了解设计模式;

    实验要求

    1. 实现并体会例子中代码的单元测试;
    2. 自己编写一个复数类,并对其进行单元测试;
    3. 利用UML进行测试建模,实现代码图形的相互生成;

    实验步骤

    (一)单元测试

    (1)三种代码

    •伪代码

    •产品代码

    •测试代码

    一般情况测试

    出错情况测试

    边界情况测试

    完善产品代码

    (2)TDD(测试驱动开发)

    先写测试代码,然后再写产品代码的开发方法叫“测试驱动开发”(TDD)。

    TDD的一般步骤如下:

    明确当前要完成的功能;

    记录成一个测试列表;

    快速完成编写针对此功能的测试用例;

    测试代码编译不通过;

    编写并完善产品代码;

    测试通过;

    对代码进行重构,并保证测试通过;

    循环完成所有功能的开发。

    TDD的编码节奏是:

    增加测试代码,JUnit出现红条;修改产品代码;JUnit出现绿条,任务完成。

    在IDEA中设置使得IDEA具备单元测试功能

    在实验楼中(即eclipse环境下)进行单元测试(按具体顺序)

    开始测试(发现产品代码bug)

    完善产品代码

    (二)面向对象三要素

    •抽象
    (1)抽象就是抽出事物的本质特征而暂时不考虑他们的细节,对于复杂系统问题人们借助分层次抽象的方法进行问题求解。

    (2)在抽象的最高层,可以使用问题环境的语言,以概括的方式叙述问题的解。在抽象的较低层,则采用过程化的方式进行描述。

    (3)在描述问题解时,使用面向问题和面向实现的术语。

    (4)程序设计中,抽象包括两个方面,一是过程抽象,二是数据抽象。过程抽象的结果是函数,数据抽象的结果是抽象数据类型。

    使用UML建模

    •封装、继承与多态

    (1)面向对象(Object-Oriented)的三要素包括:封装、继承、多态。

    (2)封装实际上使用方法(method)将类的数据隐藏起来,控制用户对类的修改和访问数据的程度,从而带来模块化和信息隐藏的好处。

    (3)接口是封装的准确描述手段。

    实例代码如下:

    •封装

    public class Dog {
        private String color;
        public String getColor() {
            return color;
        }
        public void setColor(String color) {
            this.color = color;
        }
        public String bark(){
            return "汪汪";
        }
        public String toString(){
            return "The Dog's color is " + this.getColor() +", and it shouts "+ this.bark() + "!";
        }
    }
    

    •继承

    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() + "!";
        }
    }
    
    

    运行结果如图:

    •设计模式初步

    (1)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,依赖倒置原则)

    (三)练习

    使用TDD的方式设计关实现复数类Complex。

    实验代码

    •伪代码

    •产品代码

    class complex 
    {
    double re,im;
    complex()
    {
    this.re=0;
    this.im=0;
    }
    complex(double re)
    {
    this.re=re;
    this.im=0;
    }
    complex(double re,double im)
    {
    this.re=re;
    this.im=im;
    }
    complex add(complex p1,complex p2)
    {
    complex p=new complex(p1.re+p2.re,p1.im+p2.im);
    return p;
    }
    complex minus(complex p1,complex p2)
    {
    complex p=new complex(p1.re-p2.re,p1.im-p2.im);
    return p;
    }
    void print()
    {
    System.out.println("复数的值为:");
    if(this.im!=0)
    System.out.println(this.re+"+"+this.im+"i");
    else
    System.out.println(this.re);
    }
    }
    public class Song
    {
    public static void main(String[] args)
    {
    complex c=new complex();
    complex c1=new complex(2,7);
    complex c2=new complex(5,2);
    c1.print();
    c2.print();
    System.out.println("这两个复数的和为:");
    System.out.println((c.add(c1,c2).re+"+"+
    c.add(c1, c2).im+"i").toString());
    
    System.out.println("这两个复数的差为:");
    System.out.println((c.minus(c1,c2).re+"+"+
    c.minus(c1, c2).im+"i").toString());
    }
    }
    
    

    测试运行结果如图

    遇到的问题及解决方法

    使用IDEA进行单元测试时花了很长时间,完全按照步骤执行,查了很多资料试了很久,还是无法顺利完成,junit4以后出来的@Test都是报错的,不明白到底为什么。然后想通过实验楼来完成,好不容易找到了老师的课程结果是私有课,没有邀请码无法在该环境下实验,跟我一起的同学就可以直接进入实验环境中做,我很不解啊。事先编好的代码无法通过单元测试进行完善,最终还是借用了同学的电脑勉强完成,不容易。

    出错如图:

    体会单元测试的好处:

    1.帮助开发人员编写代码,提升质量、减少bug。

    2.提升反馈速度,减少重复工作,提高开发效率。

    3.保证最后的代码修改不会破坏之前代码的功能。

    4.使代码更容易维护。

    (以上实验除单元测试部分均在IDEA中完成)

    Personal Software Process Time

    步骤 耗时 百分比
    需求分析 30min 12%
    设计代码实现 2hours 46%
    测试 50min 19%
    分析总结 1hours 23%
  • 相关阅读:
    教你一个vue小技巧,一般人我不说的
    分享一个好用的函数吧,将js中的对象转成url参数
    Vue源码探究-源码文件组织
    后端分布式系列:分布式存储-HDFS DataNode 设计实现解析
    Android Animation动画详解(二): 组合动画特效
    后端分布式系列:分布式存储-HDFS NameNode 设计实现解析
    Android开源框架ViewPageIndicator和ViewPager实现Tab导航
    解决某些手机RadioGroup中的RadioButton不居中(右移)问题
    Android Animation动画详解(一): 补间动画
    后端分布式系列:分布式存储-HDFS 架构解析
  • 原文地址:https://www.cnblogs.com/xzh20145231/p/5398006.html
Copyright © 2011-2022 走看看