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

实验内容

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

(一)单元测试

1.三种代码

(1)伪代码:

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

(2)产品代码与测试代码

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

该产品代码的测试代码(比如输入为负分或大于100的成绩),代码如下:

public class MyUtilTest2 {
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!");
}
}

测试结果如下:

原因是判断不及格时没有要求成绩大于零,修改MyUtil.java,增加对负分的判断,代码如下:

public class MyUtil1 {
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 "错误";
}
}

MyUtil有测试边界情况,对输入为“0,60,70,80,90,100”这些边界情况进行测试的代码如下:

public class MyUtil1Test1 {
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!");
}
}

测试结果如下:

边界情况中输入100时有错,修改MyUtil.java,把判断优秀的条件中包含输入为100的情况,代码如下:

public class MyUtil2 {
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 "错误";
}
}

这时再利用刚才的MyUtil1Test1进行测试,得到测试结果如下:

(二)面向对象三要素

1.抽象

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

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

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

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

2.封装、继承与多态

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

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

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

(三)使用UML建模

建模截图如下:

(四)设计模式初步1.S.O.L.I.D原则

面向对象三要素是“封装、继承、多态”,任何面向对象编程语言都会在语法上支持这三要素。如何借助抽象思维用好三要素特别是多态还是非常困难的,S.O.L.I.D类设计原则是一个很好的指导。

(1)SRP(Single Responsibility Principle,单一职责原则)

(2)OCP(Open-Closed Principle,开放-封闭原则)

(3)LSP(Liskov Substitusion Principle,Liskov替换原则)

(4)ISP(Interface Segregation Principle,接口分离原则)

(5)DIP(Dependency Inversion Principle,依赖倒置原则)

2.模式与设计模式

(1)模式是某外在环境(Context) 下﹐对特定问题(Problem)的惯用解决之道。

(2)在面向对象中设计模式的地位可以和面向过程编程中的数据结构的地位相当。

(五)练习

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

(1)伪代码:

1. Z = a(实部) + bi(虚部);
2.相加:实数部与实部相加,虚部与虚部相加
3.相减:实部与实部相减,虚部与虚部相减
4.相乘
A*B=ac-bd+(ad+bc)i
A=a+bi, B=c+di
5.显示一个复数
虚部为负数情况,不显示前面的加号

(2)产品代码

public class Complex{// 1. Z = a(实部) + bi(虚部);

    private int RealPart;	// 实部
private int ImaginPart; // 虚部 public int getRealPart() {
return RealPart;
} public void setRealPart(int r) {
RealPart = r;
} public int getImaginPart() {
return ImaginPart;
} public void setImaginPart(int i) {
ImaginPart = i;
}
// 构造函数
public Complex() {}
public Complex(int r, int i) {
super();
RealPart = r;
ImaginPart = i;
} // 相加
public static String add(Complex a,Complex b){
Complex temp = new Complex();
temp.setRealPart(a.getRealPart()+b.getRealPart());
temp.setImaginPart(a.getImaginPart()+b.getImaginPart());
return show(temp);
} // 相减
public static String minus(Complex a,Complex b){
Complex temp = new Complex();
temp.setRealPart(a.getRealPart()-b.getRealPart());
temp.setImaginPart(a.getImaginPart()-b.getImaginPart());
return show(temp);
} //相乘
//A*B=ac-bd+(ad+bc)i
//A=a+bi, B=c+di
public static String Multi(Complex a,Complex b){
Complex temp = new Complex();
temp.setRealPart((a.getRealPart()*b.getRealPart())-(a.getImaginPart()*b.getImaginPart()));
temp.setImaginPart((b.getImaginPart()*a.getRealPart())+(b.getRealPart()*a.getImaginPart()));
return show(temp);
} // 显示输出
public static String show(Complex a){
StringBuffer sb = new StringBuffer();
sb.append(a.getRealPart());
if(a.getImaginPart()>0){
sb.append("+"+a.getImaginPart()+"i");
}else if(a.getImaginPart()<0){
sb.append(a.getImaginPart()+"i");
}
return sb.toString();
}
}

(3)测试代码:

import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals; import junit.framework.TestCase;
public class ComplexTest1 extends TestCase{
public void testNoral(){
assertEquals("4+1i",Complex.minus(new Complex(4,3),new Complex(0,2) ) );
assertEquals("5+5i",Complex.add(new Complex(4,3),new Complex(1,2) ) );
assertEquals("2+8i",Complex.Multi(new Complex(1,1),new Complex(5,3) ) );
}
public void testNoral1(){
assertEquals("4+2i",Complex.minus(new Complex(4,3),new Complex(0,1) ) );
assertEquals("5+5i",Complex.add(new Complex(3,4),new Complex(2,1) ) );
assertEquals("2+8i",Complex.Multi(new Complex(1,1),new Complex(5,3) ) );
}
public void testNoral2(){
assertEquals("-3-5i",Complex.minus(new Complex(0,0),new Complex(3,5) ) );
assertEquals("13+12i",Complex.add(new Complex(6,7),new Complex(7,5) ) ) ;
assertEquals("0",Complex.Multi(new Complex(0,0),new Complex(3,5) ) );
}
}

测试结果如下:

4)建模截图如下:

20145312 实验二《 Java面向对象程序设计》的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. JAVA课程实验报告 实验二 Java面向对象程序设计

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计  班级:1353  姓名:韩玉琪  学号:20135317 成绩:             指导教师:娄嘉 ...

  7. 20145225唐振远 实验二 "Java面向对象程序设计"

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

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

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

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

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

  10. 20162317袁逸灏 第八周实验报告:实验二 Java面向对象程序设计

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

随机推荐

  1. LeetCode-Count Bits

    Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the ...

  2. Ubuntu 安装 GNOME 之后开机进不了桌面

    折腾了两晚上,终于解决了这个问题,进入了桌面. 问题是这样产生的:我安装了 ubuntu-gnome-shell 这个包,然后出现配置 display manager 的选项,有 gdm3 和 lig ...

  3. node npm

    node.js -npm 查看npm版本号$ npm -v 全局安装npm$ npm install npm -g 安装模块$ npm install <module name> --本地 ...

  4. Jquery 中 .trigger 的用法

    项目中有个需求,数据加载完成后,默认模拟点击某个元素节点(选中某个元素节点)并触发事件 $('.course_list dd').on('click', function () {     //取当前 ...

  5. 【Python算法】归纳、递归、归简

    归简法(reduction) 指的是将某一问题转化成另一个问题,将一个未知问题归简成一个已解决的问题. 归纳法(induction) 首先要证明语句在某一基本情况下是成立的,然后证明他可以由一个对象推 ...

  6. mysql 创建函数ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_f

    mysql 创建函数的时候 报错 ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL D ...

  7. Spring Data 之 Repository 接口

    1. 介绍 Repository是一个空接口,即是一个标记性接口; 若我们定义的接口继承了Repository,则该接口会被IOC容器识别为一个 Repository Bean; 也可以通过@Repo ...

  8. 原型模式(Prototype Pattern)--对象的克隆

    定义:使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象; 原型类的核心在于如何实现克隆方法: 能够实现克隆的Java类必须实现一个标识接口Cloneable,表示这个类支持被复制; 通 ...

  9. 用Python爬虫爬取广州大学教务系统的成绩(内网访问)

    用Python爬虫爬取广州大学教务系统的成绩(内网访问) 在进行爬取前,首先要了解: 1.什么是CSS选择器? 每一条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/code ...

  10. Django接收自定义http header(转)

    add by zhj: Django将所有http header(包括你自定义的http header)都放在了HttpRequest.META这个Python标准字典中,当然HttpRequest. ...