当前位置: 首页 > news >正文

20145328 《Java程序设计》实验二实验报告

20145328 《Java程序设计》实验二实验报告

实验名称

Java面向对象程序设计

实验内容

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

实验步骤

(一)单元测试

用程序解决问题时,要会写三种码:

  1. 先按要求写出伪代码。
  2. 然后写出产品代码。
  3. 最后进行测试。

伪代码如下

百分制转五分制:
   如果成绩小于60,转成“不及格”
   如果成绩在60与70之间,转成“及格”
   如果成绩在70与80之间,转成“中等”
   如果成绩在80与90之间,转成“良好”
   如果成绩在90与100之间,转成“优秀”
   其他,转成“错误”

完成的产品代码如下

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 "错误";
   }
}

新建一个测试类,代码如下所示

885560-20160414233108785-1702216348.png

测试结果如下

885560-20160414233714629-30657626.png

测试正常情况的代码和运行结果如下所示

885560-20160414233806457-154088424.png

测试出错情况的代码和运行结果如下所示

885560-20160414234304035-1862894571.png

在这里发现输入值为负时出现错误,修改原代码后测试运行便如下所示通过了

885560-20160414234821676-1659477661.png

测试边界情况时也发现在当输入值为100时出现错误,修改原代码前后的测试运行结果如下所示

885560-20160414235052270-1511633879.png

885560-20160414235128629-1428025413.png

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

先根据需求写测试代码,然后再根据测试写产品代码,使产品代码通过测试。

  1. 先创建一个test文件夹,修改其属性用来存放测试代码。
  2. 在src中新建.java文件,用来编写产品代码。
  3. 创建产品代码中的测试类,并存放到测试文件夹text中。

885560-20160414235316535-1226170847.png

  1. 根据需求编写测试代码。

试验测试代码:

public class MyUtility {
    public static String percentage2fivegrade(int grade) {
            return "错误";
    }
}

输入测试代码:

package experiment_2.TDD;

import experiment_2.TDD.MyUtility;
import junit.framework.TestCase;
import org.junit.Test;

/**
 * Created by Administrator on 2016/4/12.
 */
public class MyUtilityTest extends TestCase {
    @Test
    public void testNormal(){
        assertEquals("不及格", MyUtility.percentage2fivegrade(55));
        assertEquals("及格", MyUtility.percentage2fivegrade(65));
        assertEquals("中等", MyUtility.percentage2fivegrade(75));
        assertEquals("良好", MyUtility.percentage2fivegrade(85));
        assertEquals("优秀", MyUtility.percentage2fivegrade(95));
    }
    @Test
    public void testException(){
        assertEquals("错误",MyUtility.percentage2fivegrade(105));
        assertEquals("错误",MyUtility.percentage2fivegrade(-55));
    }
    @Test
    public void testBoundary(){
        assertEquals("不及格",MyUtility.percentage2fivegrade(0));
        assertEquals("及格",MyUtility.percentage2fivegrade(60));
        assertEquals("中等",MyUtility.percentage2fivegrade(70));
        assertEquals("良好",MyUtility.percentage2fivegrade(80));
        assertEquals("优秀",MyUtility.percentage2fivegrade(90));
        assertEquals("优秀",MyUtility.percentage2fivegrade(100));
    }
}

5.因为没有产品代码,测试代码存在错误,接下来,输入产品代码。

885560-20160415000202707-1996012727.png

此时,测试代码运行成功

885560-20160415000351426-243128650.png

885560-20160415000507270-1752232.png

(三)用UML中的类图来描述类

该项实验于在实验楼上完成

885560-20160415000732691-1608849012.png

885560-20160415000804395-270123009.png

885560-20160415000813223-1331155338.png

885560-20160415000822520-1733399559.png

885560-20160415000832441-2046087789.png

885560-20160415000846816-1092539913.png

885560-20160415000857316-427986254.png

885560-20160415000911816-305617722.png

885560-20160415000936676-238350600.png

885560-20160415000948941-1859474809.png

885560-20160415001005176-1828555680.png

885560-20160415001016879-122740964.png

(四)练习

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

根据需求先写出伪代码

    //ComplexNumber的属性
    //m_dRealPart 实部
    //m_dImaginaryPart 虚部
    //ComplexNumber的方法
    //ComplexNumber() 构造函数,将实部,虚部都置为0
    //ComplexNumber(double r,double i) 构造函数,创建复数对象的同时完成复数的实部、虚部
    //GetRealPart() 获取实部
    //GetImaginaryPart() 获取虚部
    //SetRealPart(double d) 设置实部
    //SetImaginaryPart(double d) 设置虚部
    //ComplexAdd(ComplexNumber c) 复数相加
    //ComplexAdd(double c) 复数相加
    //ComplexMinus(ComplexNumber c) 复数相减
    //ComplexMinus(double c) 复数相减
    //ComplexMulti(ComplexNumber c) 复数相乘
    //ComplexMulti(double c) 复数相乘
    //toString()把当前复数对象的实部,虚部组合成a+bi的字符串形式

先写出预期测试代码,代码如下所示

package experiment_2.Complex;

import junit.framework.TestCase;
import org.junit.Test;

import static org.junit.Assert.*;

/**
 * Created by Administrator on 2016/4/14.
 */
public class ComplexTest extends TestCase {
    @Test
    public void testAdd(){
        Complex testa = new Complex(1, 2);
        Complex testb = new Complex(3, 5);
        Complex testc;
        testc = testa.Add(testb);
        assertEquals("4.0+7.0i",testc.toString());
    }
    @Test
    public void testMinus(){
        Complex testa = new Complex(1, 2);
        Complex testb = new Complex(6, 5);
        Complex testc;
        testc = testa.Minus(testb);
        assertEquals("-5.0-3.0i",testc.toString());
    }
    @Test
    public void testMulti(){
        Complex testa = new Complex(1, 2);
        Complex testb = new Complex(4, 8);
        Complex testc;
        testc = testa.Multi(testb);
        assertEquals("-12.0+16.0i",testc.toString());
    }
}

然后根据测试代码和伪代码写出产品代码,产品代码如下所示

package experiment_2.Complex;

/**
 * Created by Administrator on 2016/4/14.
 */
public class Complex {
    //ComplexNumber的属性
    private double m_dRealPart;//m_dRealPart 实部
    private double m_dImaginaryPart;//m_dImaginaryPart 虚部
    public Complex(double m_dRealPart,double m_dImaginaryPart){
        this.m_dRealPart = m_dRealPart;
        this.m_dImaginaryPart = m_dImaginaryPart;
    }

    //ComplexNumber的方法
    public void Complex(){//ComplexNumber() 构造函数,将实部,虚部都置为0
        this.m_dRealPart = 0;
        this.m_dImaginaryPart = 0;
    }
    public void Complex(double r,double i){//ComplexNumber(double r,double i) 构造函数,创建复数对象的同时完成复数的实部、虚部的初始化
        this.m_dRealPart = r;
        this.m_dImaginaryPart = i;
    }
    public double GetRealPart(){//GetRealPart() 获取实部
        return this.m_dRealPart;
    }
    public double GetImaginaryPart(){//GetImaginaryPart() 获取虚部
        return this.m_dImaginaryPart;
    }
    public void SetRealPart(double d){//SetRealPart(double d) 设置实部
        this.m_dRealPart = d;
    }
    public void SetImaginaryPart(double d){//SetImaginaryPart(double d) 设置虚部
        this.m_dImaginaryPart = d;
    }
    public Complex Add(Complex c){//ComplexAdd(ComplexNumber c) 复数相加
        return new Complex(m_dRealPart+c.m_dRealPart,m_dImaginaryPart+c.m_dImaginaryPart);
    }
    //ComplexAdd(double c) 复数相加
    public Complex Minus(Complex c){//ComplexMinus(ComplexNumber c) 复数相减
        return new Complex(m_dRealPart-c.m_dRealPart,m_dImaginaryPart-c.m_dImaginaryPart);
    }
    //ComplexMinus(double c) 复数相减
    public Complex Multi(Complex c){//ComplexMulti(ComplexNumber c) 复数相乘
        return new Complex(m_dRealPart*c.m_dRealPart-m_dImaginaryPart*c.m_dImaginaryPart,
                m_dRealPart*c.m_dImaginaryPart+m_dImaginaryPart*c.m_dRealPart);
    }
    //ComplexMulti(double c) 复数相乘
    public String toString(){//toString()把当前复数对象的实部,虚部组合成a+bi的字符串形式
        String s;
        if (m_dRealPart != 0.0){
            if (m_dImaginaryPart > 0)
                s = new Float(m_dRealPart).toString() + "+" + new Float(m_dImaginaryPart).toString() + "i";
            else if (m_dImaginaryPart < 0)
                s = new Float(m_dRealPart).toString() + "-" + new Float(-1*m_dImaginaryPart).toString() + "i";
            else
                s = new Float(m_dRealPart).toString();
        }
        else {
            if (m_dImaginaryPart > 0)
                s = new Float(m_dImaginaryPart).toString() + "i";
            else if (m_dImaginaryPart< 0)
                s = new Float(-1*m_dImaginaryPart).toString() + "i";
            else
                s = new Float(m_dRealPart).toString();
        }
        return s;
    }
    public void putout(Complex c){
        System.out.printf("%s%n",toString());
    }
}

产品代码运行结果如下

885560-20160415001231207-457508038.png

单元测试运行结果如下

885560-20160415001154520-519799581.png

心得体会

本次实验作为第二次实验,难度依旧适中,无论是单元测试还是利用UML建模,虽然原来没有接触过,感觉很新奇,但在接触过后也发现并没有预期中的那么困难,这两者从某些方面来说都算是在Java开发过程中的一种应用,更多的也是一种思想思路还有开发方法上的拓展,在练习通过TDD实现Complex类时不仅加深了对于TDD的了解,也逐渐掌握了TDD的应用,编写代码时的效率也比以前要快得多。

PSP(Personal Software Process)时间:

步骤耗时百分比
需求分析20min11.1%
设计20min11.1%
代码实现1h33.3%
测试1h33.3%
分析总结20min11.2%

转载于:https://www.cnblogs.com/rebrust/p/5393699.html

相关文章:

  • UNIX网络编程——经常使用的套接字选项
  • 【Mysql 学习】SQL服务器模式
  • struts-default.xml解读
  • 用POP动画编写带富文本的自定义动画效果
  • 〖Linux〗不知谁写的,很实用的Linux命令
  • 带动画渐进效果与颜色渐变的圆弧进度控件设计
  • [Android]Tool-Systrace
  • 抱歉,我不接私单了
  • Java中数据库连接池原理机制的详细讲解(转)
  • App安全之网络传输安全
  • 记录:C#编程的一点小细节
  • 8000端口下 调用pdo数据库连接的报错原因
  • MYSQL导入导出.sql文件
  • hadoop
  • 每日编译的入门实践
  • eclipse(luna)创建web工程
  • Fabric架构演变之路
  • JavaScript的使用你知道几种?(上)
  • linux学习笔记
  • log4j2输出到kafka
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Octave 入门
  • Ruby 2.x 源代码分析:扩展 概述
  • Sublime text 3 3103 注册码
  • vue脚手架vue-cli
  • Vultr 教程目录
  • WePY 在小程序性能调优上做出的探究
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 搭建gitbook 和 访问权限认证
  • 动态魔术使用DBMS_SQL
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 给Prometheus造假数据的方法
  • 给第三方使用接口的 URL 签名实现
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 经典排序算法及其 Java 实现
  • 力扣(LeetCode)22
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 试着探索高并发下的系统架构面貌
  • 算法---两个栈实现一个队列
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 原生 js 实现移动端 Touch 滑动反弹
  • 你对linux中grep命令知道多少?
  • PostgreSQL之连接数修改
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #13 yum、编译安装与sed命令的使用
  • (23)Linux的软硬连接
  • (31)对象的克隆
  • (4)Elastix图像配准:3D图像
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (利用IDEA+Maven)定制属于自己的jar包
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • .net framework4与其client profile版本的区别
  • .net mvc actionresult 返回字符串_.NET架构师知识普及