码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-05-07 07:31:19      阅读:309      评论:0      收藏:0      [点我收藏+]

标签:

一、实验内容

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

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

3. 初步掌握UML建模

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

5. 了解设计模式

二、实验要求

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

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

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

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

三、实验步骤

(一)单元测试

(1) 以“百分制转五分制”为例,介绍三种代码

(1)伪代码  (2)产品代码  (3)测试代码

需求:我们要在一个MyUtil类中解决一个百分制成绩转成“优、良、中、及格、不及格”五级制成绩的功能。

 //伪代码:

百分制转五分制:

   如果成绩小于60,转成“不及格”

   如果成绩在60与70之间,转成“及格”

   如果成绩在70与80之间,转成“中等”

   如果成绩在80与90之间,转成“良好”

   如果成绩在90与100之间,转成“优秀”

   其他,转成“错误”

//产品代码:

翻译好的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 "错误";

   }

}

//测试代码:

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) TDD(Test Driven Devlopment, 测试驱动开发)

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

  • 明确当前要完成的功能,记录成一个测试列表
  • 快速完成编写针对此功能的测试用例
  • 测试代码编译不通过(没产品代码呢)
  • 编写产品代码
  • 测试通过
  • 对代码进行重构,并保证测试通过(重构下次实验练习)
  • 循环完成所有功能的开发

基于TDD,我们不会出现过度设计的情况,需求通过测试用例表达出来了,我们的产品代码只要让测试通过就可以了。 Java中有单元测试工具JUnit来辅助进行TDD,我们用TDD的方式把前面百分制转五分制的例子重写一次,体会一下有测试工具支持的开发的好处。 打开Eclipse,单击File->New->Java Project新建一个TDDDemo的Java项目:我们在TDDDemo项目中,把鼠标放到项目名TDDDemo上,单击右键,在弹出的菜单中选定New->Source Folder新建一个测试目录test,我们把鼠标放到test目录上,单击右键,在弹出的菜单中选定New->JUnit Test Case新建一个测试用例类MyUtilTest,

我们增加第一个测试用例testNormal,注意测试用例前一定要有注解@Test,测试用例方法名任意,输入以下代码:

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));

    }

}

 

输入完毕

红叉说明代码存在语法错误,原因很简单,MyUtil类还不存在,类中的percentage2fivegrade方法也不存在,我们在TDDDemo的src目录中新建一个MyUtil的类,并实现percentage2fivegrade方法

现在测试代码没有语法错误了,我们把鼠标放到MyUtilTest.java上,单击右键,选择Run as->JUnit Test

测试结果出现了一个绿条(green bar),说明测试通过了。

TDD的编码节奏是:

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

(二)面向对象三要素

(1)抽象

(2)封装、继承与多态

  • 步骤:
  • 用UML中的类图来描述类Dog,首先在实验楼的环境中打开shell,在命令行中输入umbrello,打开UML建模软件umbrello;

    先单击工具栏上的类图标,再在class diagram(类图)中单击一下,会弹出一个圣诞框,输入类名Dog;

    把鼠标放到Dog类上,单击右键,选择Properties,在弹出的对话框中的Display中去掉Public Only选项;

    把鼠标放到Dog类上,单击右键,选择New->Attribute,在弹出的对话框中的填好Type,Name,并选好Visibility;

    把鼠标放到Dog类上,单击右键,选择New->Operation,在弹出的对话框中的填好Type,Name,并选好Visibility。

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

    • +表示public
    • #表示 protected
    • -表示 private
  • (三)设计模式初步
  • (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,依赖倒置原则)

    (四)练习

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

     

    2.实验报告中统计自己的PSP(Personal Software Process)时间

    步骤

    耗时

    百分比

    需求分析

      1h

     10%

    设计

     1h  10%

    代码实现

     2h  20%

    测试

     1h  10%

    分析总结

     1h  10%

    3. 实现要有伪代码,产品代码,测试代码。

    4.总结单元测试的好处

  • 四、实验代码截图

  • 备注:建立文件夹保存代码最后的截图

    技术分享

    技术分享

    (一)三种代码

    一、伪代码

    技术分享

     

    二、测试码

    技术分享

    技术分享

    技术分享

    技术分享

    技术分享

    三、产品代码

    技术分享

    技术分享

     

    (二)、面向对象的三要素

    技术分享

    技术分享

    技术分享

五、练习题

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

//伪代码
//复数类
类有虚部实部
复数的加法运算
复数的减法运算
复数的乘法运算
复数的除法运算

//产品代码
public class ComplexDemo {
// main方法
public static void main(String[] a) {
  Complex b = new Complex(2, 5);
  Complex c = new Complex(3, -4);
  System.out.println(b + "+" + c + "=" + b.add(c));
  System.out.println(b + "-" + c + "=" + b.minus(c));
  System.out.println(b + "*" + c + "=" + b.multiply(c));
  System.out.println(b + "/" + c + "=" + b.divide(c));
}
}

// Complex类
class Complex {
private double m;// 实部
private double n;// 虚部

public Complex(double m, double n) {
  this.m = m;
  this.n = n;
}

// add
public Complex add(Complex c) {
  return new Complex(m + c.m, n + c.n);
}

// minus
public Complex minus(Complex c) {
  return new Complex(m - c.m, n - c.n);
}

// multiply
public Complex multiply(Complex c) {
  return new Complex(m * c.m - n * c.n, m * c.n + n * c.m);
}

// divide
public Complex divide(Complex c) {
  double d = Math.sqrt(c.m * c.m) + Math.sqrt(c.n * c.n);
  return new Complex((m * c.m + n * c.n) / d, Math.round((m * c.n - n * c.m) / d));
}

public String toString() {
  String rtr_str = "";
  if (n > 0)
   rtr_str = "(" + m + "+" + n + "i" + ")";
  if (n == 0)
   rtr_str = "(" + m + ")";
  if (n < 0)
   rtr_str = "(" + m + n + "i" + ")";
  return rtr_str;
}
}
//测试代码

public static ComplexTest{
public static void main(String[] args){
class Complex {

private double m;// 实部
private double n;// 虚部

public Complex(double m, double n) {
this.m = m;
this.n = n;
}

public String toString() {
String rtr_str = "";
if (n > 0)
rtr_str = "(" + m + "+" + n + "i" + ")";
if (n == 0)
rtr_str = "(" + m + ")";
if (n < 0)
rtr_str = "(" + m + n + "i" + ")";
return rtr_str;
  }

}

}

}

二、实验报告中统计自己的PSP(Personal Software Process)时间

步骤

耗时

百分比

需求分析

  1h

 14.2%

设计

 1。5h  21。4%

代码实现

 2h  28.6%

测试

 1.5h  21.4%

分析总结

 1h  14.2%
 
 六、实验中遇到的问题及解决办法
1、在实验一中,由于网络不稳定,经常出现卡网、断网的情况,在做测试3代码的时候由于时间不够又不小心错过延时只能重新再做。刚开始测试代码运行不出来,后来发现只有当伪代码和测试代码同时存在时才能运行。
    在进行产品代码调试的时候,第一次assertEquals出现问题,后来又重新做了一遍,发现是TextCase填写错误。
2、在实验二中,shell不知道如何打开,后来请教了同学才顺利的完成了实验。
七、实验总结及体会
  本次实验比起第一次实验我有了很大的突破,更加熟练的运用了虚拟机。单元测试对我的帮助也很大,更加突破了自己,在遇到问题的时候自己学会了一步一步的反复调试解决,敢于尝试的同时也培养了自己的恒心和耐心,对TDD这种具有一定难度的代码有了认识和了解。面向对象的三要素之前在视频中学习过,通过这次实验又温习巩固了一遍,更好的掌握和运用这方面的知识。在以后的实验中,我也会按照老师黑出的步骤先需求分析,再设计,不能急于求快的一味编写代码。
  通过这次实验,我更敢于去编写代码了,并且打牢了运用虚拟机的基础知识,在学习编程的过程中,更培养了自己持之以恒的品质。
 
 
    
 

 

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

标签:

原文地址:http://www.cnblogs.com/gyt0520/p/4483715.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!