北京电子科技学院(BESTI)

实 验 报 告

课程:程序设计与数据结构
班级: 1623
姓名: 石亚鑫
学号:20162303

成绩: 2分
指导教师:娄家鹏 王志强
实验日期:4月14日

实验密级: 非密级
预习程度: 已预习
实验时间:10:10-12:00

必修/选修: 必修
实验序号: cs_03

实验内容

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

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

  3. 初步掌握UML建模

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

  5. 了解设计模式初步掌握单元测试和TDD

实验步骤

(一)单元测试

(1) 三种代码

编程是智力活动,不是打字,编程前要把干什么、如何干想清楚才能把程序写对、写好。当想用程序解决问题时,要会写三种码:
伪代码
产品代码
测试代码

练习:

伪代码

百分制转五分制:
如果成绩小于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 "错误";
}
}
测试代码

1、50分:

public class MyUtilTest {
public static void main(String[] args) {
// 百分制成绩是50时应该返回五级制的“不及格”
if(MyUtil.percentage2fivegrade(50) != "不及格")
    System.out.println("test failed!");
else
    System.out.println("test passed!");
}
}

2、一般情况:

public class MyUtilTest {
public static void main(String[] args) {
    //测试正常情况
    if(MyUtil.percentage2fivegrade(55) != "不及格")
        System.out.println("test failed!");
    else if(MyUtil.percentage2fivegrade(65) != "及格")
        System.out.println("test failed!");
    else if(MyUtil.percentage2fivegrade(75) != "中等")
        System.out.println("test failed!");
    else if(MyUtil.percentage2fivegrade(85) != "良好")
        System.out.println("test failed!");
    else if(MyUtil.percentage2fivegrade(95) != "优秀")
        System.out.println("test failed!");
    else
        System.out.println("test passed!");
}
}

在Eclipse中运行结果如下,测试结果符合预期:

3、为负分或大于100的成绩:

public class MyUtilTest {
public static void main(String[] args) {
    //测试出错情况
    if(MyUtil.percentage2fivegrade(-10) != "错误")
        System.out.println("test failed 1!");
    else if(MyUtil.percentage2fivegrade(115) != "错误")
        System.out.println("test failed 2!");
    else
        System.out.println("test passed!");
}
}

4、运行程序发现负分时与期望不一致,原因是判断不及格时没有要求成绩大于零。增加对负分的判断:

public class MyUtil{
public static String percentage2fivegrade(int grade){
   //如果成绩小于0,转成“错误”
   if ((grade < 0))
       return "错误";
   //如果成绩小于60,转成“不及格”
   else 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 "优秀";
   //如果成绩大于100,转成“错误”
   else
       return "错误";
}
}

再次运行测试,测试结果符合预期,成功通过。

5、测试边界情况,我们对输入为“0,60,70,80,90,100”这些边界情况进行测试:

public class MyUtilTest {
public static void main(String[] args) {
    //测试边界情况
    if(MyUtil.percentage2fivegrade(0) != "不及格")
        System.out.println("test failed 1!");
    else if(MyUtil.percentage2fivegrade(60) != "及格")
        System.out.println("test failed 2!");
    else if(MyUtil.percentage2fivegrade(70) != "中等")
        System.out.println("test failed 3!");
    else if(MyUtil.percentage2fivegrade(80) != "良好")
        System.out.println("test failed 4!");
    else if(MyUtil.percentage2fivegrade(90) != "优秀")
        System.out.println("test failed 5!");
    else if(MyUtil.percentage2fivegrade(100) != "优秀")
        System.out.println("test failed 6!");
    else
        System.out.println("test passed!");
}
}

测试结果如下:

6、我们发现边界情况中输入100时有一个Bug。把判断优秀的条件中包含输入为100的情况:

public class MyUtil{
public static String percentage2fivegrade(int grade){
   //如果成绩小于0,转成“错误”
   if ((grade < 0))
       return "错误";
   //如果成绩小于60,转成“不及格”
   else 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 "优秀";
   //如果成绩大于100,转成“错误”
   else
       return "错误";
}
}

(2)TDD

先写测试代码,然后再写产品代码的开发方法叫“测试驱动开发”(TDD)。
TDD的一般步骤如下:

  • 1、明确当前要完成的功能,记录成一个测试列表

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

  • 3、测试代码编译不通过(没产品代码呢)

  • 4、编写产品代码

  • 5、测试通过

  • 6、对代码进行重构,并保证测试通过(重构下次实验练习)

  • 7、循环完成所有功能的开发

TDD的编码节奏是:

  • 1、增加测试代码,JUnit出现红条

  • 2、修改产品代码

  • 3、JUnit出现绿条,任务完成

(二)练习

(1)以 TDD的方式研究学习StringBuffer,程序及运行结果如下



(2)用UML中的类图来描述类Dog:

在UML 里,一个类的属性能显示它的名字,类型,初始化值,属性也可以显示private,public,protected。 类的方法能显示它们的方法名,参数,返回类型,以及方法的private,public,protected属性。其中:

+表示public
表示 protected
-表示 private
使用UML可以让我们不必关注细节。

Dog类和Cat类都有Color属性和相应的set和get方法,明显违反了前面提到的DRY原则,我们可以通过继承解决这个问题,把Color属性和相应方法放到父类Animal中,如以下UML较图所示:

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

伪代码:
1.输入两个复数的四个参数
2.两参数分别为实部与虚部
3.实现两复数的加法、减法、乘法、除法。

代码托管

测试结果:

(4)对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式
OCP是OOD中最重要的一个原则,OCP的内容是:
software entities (class, modules, function, etc.) should open for extension,but closed for modification.
软件实体(类,模块,函数等)应该对扩充开放,对修改封闭。
DIP的内容是:
High level modules should not depend upon low level modules. Both should depend upon abstractions
Abstractions should not depend upon details. Details should depend upon abstractions
高层模块不应该依赖于低层模块。二者都应该依赖于抽象
抽象不应该依赖于细节。细节应该依赖于抽象

(三)统计自己的PSP(Personal Software Process)时间

步骤 耗时 百分比
需求分析 30min 11.5%
设计 30min 11.5%
代码实现 130min 50%
测试 50min 19.2%
分析总结 20min 7.7%

(四)总结单元测试的好处

1.伪代码、测试代码和产品代码分开,实现了程序的逻辑清晰和设计高效
2.有利于维护和修改代码
3.编程思维更加清晰

(五)实验体会

这次实验时间还是比较紧张的,主要原因就是上次实验中没有详细理解idea 的用法,导致花费了大量的时间在研究idea上面。同时,我也理解到了,编写代码与测试代码同样重要,好的代码需要反复的调试才能准确运行。

20162303实验二 Java面向对象程序设计实验报告的更多相关文章

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

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

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

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

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

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

  4. 实验二Java面向对象程序设计实验报告(2)

    实验二 Java面向对象程序设计 实验概述: 课程:程序设计与数据结构 班级:1623班 姓名: 邢天岳 学号:2309 指导老师:娄老师 王老师 实验日期:2017.4.16 实验名称: Java面 ...

  5. 实验二 Java面向对象程序设计实验报告

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

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

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

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

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

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

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

  9. 20162305 实验二 Java面向对象程序设计 实验报告

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

  10. 20145239杜文超 《Java程序设计》实验二 Java面向对象程序设计实验报告

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

随机推荐

  1. 【CSS】凹槽的写法

    效果图: 实例代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...

  2. hdu 2717 Catch That Cow(广搜bfs)

    题目链接:http://i.cnblogs.com/EditPosts.aspx?opt=1 Catch That Cow Time Limit: 5000/2000 MS (Java/Others) ...

  3. hdu 2962 Trucking (二分+最短路Spfa)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2962 Trucking Time Limit: 20000/10000 MS (Java/Others ...

  4. hdu 3790 最短路径问题(双重权值,dijkstra算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 题目大意:题意明了,输出最短路径及其花费. 需要注意的几点:(1)当最短路径相同时,输出最小花费 ...

  5. 腻子脚本polyfill

    腻子脚本 具体是指一段可以给老版本浏览器(ie9以前的版本)带来新特性的javascript脚本代码.如轻量级的脚本代码或Modernizr,Modernizr除了能让ie支持html5新元素之外,还 ...

  6. Perl6 Bailador框架(6):获取用户输入

    use v6; use Bailador; get '/' => sub { ' <html> <head><title></title>< ...

  7. .gitignore 文件添加或更新后规则无效的解决方案

    项目已经提交之后,突然想忽略某个文件或目录 A,于是在 .gitignore 里添加了忽略规则.但是提交(commit)之后,发现一旦修改了 A,git 同样会检测到 A 的变化(changes) , ...

  8. Tabular DataStream protocol 协议

    Tabular DataStream protocol 协议 Freetds 创建过程 https://wenku.baidu.com/view/2076cbfaaef8941ea76e0576.ht ...

  9. 【bzoj4896】补退选

    傻逼题. 每个点维护下vector,然后随便做. #include<bits/stdc++.h> ; using namespace std; typedef long long ll; ...

  10. myeclipse安装插件phpeclipse后进行PHP代码编写

    平常一般写java代码,有时也捣腾一下php,原来安装过zend studio来编写php代码,无奈电脑越来越卡,于是卸载了zend,然后在myeclipse中安装phpeclipse这款插件来完成p ...