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

本文档详细介绍了Java面向对象程序设计的实验内容,包括单元测试、TDD实践、面向对象三要素的理解与应用,以及设计模式的基础。通过具体示例讲解了如何进行单元测试和实施测试驱动开发(TDD),并提供了面向对象设计的基本原则与实践案例。

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

实验内容

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

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

  3. 初步掌握UML建模

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

  5. 了解设计模式

实验要求

1.没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程

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

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

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

实验步骤

(一)单元测试

(1) 三种代码

·伪代码可以是中文,自己程序的架构理解
·产品代码

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的测试模块

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

编译结果如下:
886809-20160416203240441-911329303.png

·只有一组输入的测试是不充分的,我们把一般情况都测试一下,代码如下:

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

·代码运行结果如下:
886809-20160416203315723-1840950238.png

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

(1)a.先写测试代码,然后再写产品代码的开发方法叫“测试驱动开发”(TDD)。
TDD的一般步骤如下:
·明确当前要完成的功能,记录成一个测试列表
·快速完成编写针对此功能的测试用例
·测试代码编译不通过(没产品代码呢)
·编写产品代码
·测试通过
·对代码进行重构,并保证测试通过(重构下次实验练习)
·循环完成所有功能的开发
b.基于TDD,我们不会出现过度设计的情况,需求通过测试用例表达出来了,我们的产品代码只要让测试通过就可以了。 Java中有单元测试工具JUnit来辅助进行TDD, 红叉说明代码存在语法错误,原因很简单,MyUtil类还不存在,类中的percentage2fivegrade方法也不存在,我们在TDDDemo的src目录中新建一个MyUtil的类,并实现percentage2fivegrade方法
c.测试结果出现了一个绿条(green bar),说明测试通过了。
886809-20160416203532629-1437055664.jpg

(2)TDD的编码节奏是:
增加测试代码、JUnit出现红条、修改产品代码、JUnit出现绿条,任务完成。

(二)面向对象三要素

(1)抽象
(2)封装、继承与多态

(三)设计模式初步

(1)S.O.L.I.D原则

面向对象三要素是“封装、继承、多态”,任何面向对象编程语言都会在语法上支持这三要素。如何借助抽象思维用好三要素特别是多态还是非常困难的,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,依赖倒置原则)

·范例代码如下

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

886809-20160416203823051-1706219882.png

(四)练习

练习内容:

写一个类测试编写的复数类的方法
构造函数,将实部,虚部都置为0
构造函数,创建复数对象的同时完成复数的实部,虚部的初始化
设置实部,设置虚部:复数相加、复数相减、复数相乘

产品代码:

public class Complex {

protected int a;

protected int b;

public Complex(int a, int b) {
    this.a = a;
    this.b = b;
}

public String toString() {
    return this.a + " + " + this.b + "i";
}

public static Complex addition(Complex complex1, Complex complex2) {
    int a = complex1.a + complex2.a;
    int b = complex1.b + complex2.b;
    return new Complex(a, b);
}

public static Complex subtract(Complex complex1, Complex complex2) {
    int a = complex1.a - complex2.a;
    int b = complex1.b - complex2.b;
    return new Complex(a, b);
}

public static Complex multiplication(Complex complex1, Complex complex2) {
    int a = complex1.a * complex2.a - complex1.b * complex2.b;
    int b = complex1.b * complex2.a + complex1.a * complex2.b;
    return new Complex(a, b);
}

}

import java.util.Scanner;

public class ComplexMain {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入两个复数的实部和虚部:(a+bi、c+di)");
System.out.printf("a =");
int a=scanner.nextInt();
System.out.printf("b =");
int b=scanner.nextInt();
System.out.printf("c =");
int c=scanner.nextInt();
System.out.printf("d =");
int d=scanner.nextInt();
Complex fushu1=new Complex(a,b);
Complex fushu2=new Complex(c,d);
while(true) {
System.out.println("请输入需要进行的运算:1、ADD 2、SUBTRACT 3、MULTIPLY ");
int choice = scanner.nextInt();
switch (choice) {
case 1:
System.out.println(Complex.addition(fushu1, fushu2));
break;
case 2:
System.out.println(Complex.subtract(fushu1, fushu2));
break;
case 3:
System.out.println(Complex.multiplication(fushu1, fushu2));
break;

            default:System.out.println("ERROR!!!");
        }
    }
}

}
```

886809-20160416203932441-1757076948.png
886809-20160416203948566-2086405343.png
886809-20160416204203895-1396573738.png

PSP(Personal Software Process)

步骤耗时百分比
需求分析2 mins10%
设计4 mins20%
代码实现8 mins40%
测试6 mins30%
分析总结10 mins50%

转载于:https://www.cnblogs.com/20145224kevs/p/5392292.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值