北京电子科技学院(BESTI)

实     验    报     告

课程:Java程序设计  班级:1352 姓名:贺邦  学号:20135208

成绩:             指导教师:娄嘉鹏    实验日期:2015.5.7

实验密级:         预习程度:         实验时间:15:50--20:50

仪器组次:         必修/选修: 选修            实验序号:2

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

实验目的与要求:

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

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

3. 初步掌握UML建模

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

5. 了解设计模式

实验仪器:

名称

型号

数量

PC

LenovoY510P

1

Eclipse

/

1

一、实验内容及步骤

(一)单元测试

1、 三种代码

需求:我们要在一个MyUtil类中解决如果成绩小于60,转成“不及格” 如果成绩在60与70之间,转成“及格” 如果成绩在70与80之间,转成“中等” 如果成绩在80与90之间,转成“良好” 如果成绩在90与100之间,转成“优秀” 其他,转成“错误” 。

(1)伪代码

(2)产品代码

(3)测试代码

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

(1)概念:先写测试代码,然后再写产品代码的开发方法叫“测试驱动开发”(TDD)。

(2)TDD的一般步骤如下:

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

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

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

•  编写产品代码

•  测试通过

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

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

(3)优势:基于TDD,我们不会出现过度设计的情况,需求通过测试用例表达出来了,我们的产品代码只要让测试通过就可以了。

(4)将百分制转五分制改写成TDD

代码层次结构:

运行:

(5)TDD的编码节奏是:

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

•  修改产品代码

(二)面向对象三要素

1、抽象

(1)“去粗取精、化繁为简、由表及里、异中求同”的能力

(2)过程抽象、数据抽象

2、封装、继承与多态

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

(2)面向对象的思想涉及到软件开发的各个方面,如面向对象分析(OOA)、面向对象设计(OOD)、面向对象编程实现(OOP)。OOA根据抽象关键的问题域来分解系统,关注是什么(what)。贯穿OOA、OOD和OOP的主线正是抽象。

OOD中建模会用图形化的建模语言UML(Unified Modeling Language),UML是一种通用的建模语言。

(3)封装

封装实际上使用方法(method)将类的数据隐藏起来,控制用户对类的修改和访问数据的程度,从而带来模块化(Modularity)和信息隐藏(Information hiding)的好处;接口(interface)是封装的准确描述手段。

3、例

(1)我们可以用UML中的类图来描述类Dog:

•  JUnit出现绿条,任务完成

(三)设计模式初步

(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,依赖倒置原则)

OCP是OOD中最重要的一个原则,OCP的内容是:

· software entities (class, modules, function, etc.) should open for extension,but closed for modification.

· 软件实体(类,模块,函数等)应该对扩充开放,对修改封闭。

三、遇到的问题及解决方法

出现的问题:在单元测试的编写中,由于网络信号不稳定,经常出现断网、卡机等问题,只能等待网络恢复,或者重新开启虚拟机重新进行实验,因此也耽误了很多时间

另外一大问题就是,测试代码的编写过程中因为不太熟悉程序的编写,最后是自己对照着产品代码来写的测试代码,所以测试代码出现了很多问题,花费了很多时间去修改。有的编写代码最终还是无法顺利运行。

四、实验收获

  这次实验尽管花了很多时间,但是我也收获了很多。首先,通过这次实验,我对虚拟机的使用更加熟悉,也更加适应这种实验模式。单元测试也帮助我提升了自己的能力,一步一步地引导我学会处理可能出现的种种问题,同时也教会我以后在编写程序的时候要考虑到各种可能性,以提高代码的安全性。

  通过这次实验,我还接触到了很多以前没有听说过的知识,例如TDD,虽然陌生,处理起来比较吃力,但对我来说还是比较开眼界的。我觉得通过每一次的java实验,不仅提高了我的学习能力,更培养了持之以恒的意识,虽然有些困难,仍然尽力去做,可能最后还是没有结果,但是也会去努力一下。

五、练习题

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

//产品代码
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;
  }

}

}

}

六、时间统计

步骤

耗时

百分比

需求分析

1h

16.7%

设计

1h

16.7%

代码实现

2h

33.2%

测试

1h

16.7%

20135208JAVA第二次试验的更多相关文章

  1. 20155210潘滢昊 Java第二次试验

    20155210潘滢昊 Java第二次试验 实验内容 学会JunitTest的使用 实验代码 MyUtilTest代码: import org.junit.*; import junit.framew ...

  2. JAVA第二次试验

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计 班级:1352  姓名:潘俊洋  学号:20135230 成绩:             指导教师:娄嘉鹏 ...

  3. 在 iPad 上试验从用算法生成法线贴图-到法线映射光照效果

    在 iPad 上试验从用算法生成法线贴图-到法线映射光照效果 目录 概述 一般来说, 法线贴图是用高模的法线图, 低模的纹理图, 来生成较好的渲染效果. 而法线图通常是通过图像处理软件来生成的, 这里 ...

  4. 当Azure里的虚拟机网卡被禁用了之后……

    这样的想法来自于一个假设,如果网卡被禁用之后,用户该如何处理,Azure又该如何处理,对于设置在虚拟机中的禁用网卡选项是否还有存在的意义?通常情况下,点选了禁用网卡对于你和虚拟机来说就一下之抓瞎了,瞬 ...

  5. 20145229&20145316《信息安全系统设计基础》实验一 开发环境的熟悉

    实验封面 实验内容 本次实验使用 Redhat Linux 9.0 操作系统环境,安装 ARM-Linux 的开发库及编译器.创建一个新目录,并在其中编写 hello.c 和 Makefile 文件. ...

  6. [stm32] 一个简单的stm32vet6驱动2.4寸240X320的8位并口tft屏DEMO

    书接上文: 最近在研究用低速.低RAM的单片机来驱动小LCD或TFT彩屏实现动画效果 首先我用一个16MHz晶振的m0内核的8位单片机nRF51822尝试驱动一个1.77寸的4线SPI屏(128X16 ...

  7. performSelector的原理以及用法

    一.performSelector调用和直接调用区别下面两段代码都在主线程中运行,我们在看别人代码时会发现有时会直接调用,有时会利用performSelector调用,今天看到有人在问这个问题,我便做 ...

  8. (转)原始图像数据和PDF中的图像数据

    比较原始图像数据和PDF中的图像数据,结果见表1.1.表1.1中各种“解码器”的解释见本文后续的“PDF支持的图像格式”部分,“PDF中的图像数据”各栏中的数据来自开源的PdfView.如果您有兴趣查 ...

  9. ffmpeg中的sws_scale算法性能测试

    经常用到ffmpeg中的sws_scale来进行图像缩放和格式转换,该函数可以使用各种不同算法来对图像进行处理.以前一直很懒,懒得测试和甄 别应该使用哪种算法,最近的工作时间,很多时候需要等待别人.忙 ...

随机推荐

  1. java Clob类型 转String

    1.我的数据库是oracle11g 遇到取出来的字段是clob类型,但是所需要的是string类型,写一个转换函数就可以解决问题了. // Clob类型 转String public String C ...

  2. 关于FusionCharts需要第一次点击切换才出现问题

    最近博住接到个任务 FusionCharts生成数据发现一个问题 只有点击才切换显示 而且加载不出现全部,改成这样 然后在生成部分添加如下代码 就ok了 每天记录一点感谢大家.

  3. laravel5.5源码阅读草稿——application

    构建方法传入整个项目根目录路径(public文件夹上一级)将其设为基础路径(存在本类basePath属性中). __construct > setBasePath > bindPathsI ...

  4. 第二篇:shell基础命令(部分)

    目录 一.shell命令规则 二.基础命令详解(部分) ls :列出目录内容 mkdir : 创建目录 rmdir :删除目录 touch:新建文件 mv:修改文件(目录)名.移动路径 cp:复制文件 ...

  5. Python学习之——Oracle数据库连接

    一.安装Oracle客户端 1.下载对应安装文件,官网地址:http://www.oracle.com/technetwork/database/database-technologies/insta ...

  6. 【转】 GATK--原始数据预处理

    1. 对原始下机fastq文件进行过滤和比对(mapping) 对于Illumina下机数据推荐使用bwa进行mapping. Bwa比对步骤大致如下: (1)对参考基因组构建索引: 例子:bwa i ...

  7. 旭日图(sunburst chart)绘制:R语言 & excel

    旭日图(sunburst chart)也叫太阳图,一种圆环镶接图,每一个圆环就代表了同一级别的比例数据,离原点越近的圆环级别越高,最内层的圆表示层次结构的顶级.除了圆环外,旭日图还有若干从原点放射出去 ...

  8. leetcode记录-组合两个表

    表1: Person +-------------+---------+ | 列名 | 类型 | +-------------+---------+ | PersonId | int | | Firs ...

  9. pyasn1 安装异常

    初探Scrapy 时,也不知道按照哪里的文档装的,由于安装低版本的pyasn1 后,使用pip uninstall 都 卸不了 步骤如下: 异常: pyasn1-modules has require ...

  10. PGP的原理与使用

    实验名称: PGP的原理与使用 姓名: 刘浩 20155307 任泓霖 20155319 班级: 1553 日期: 2017.10.16 一. 实验环境 Windows虚拟机下使用的是PKZIP2.0 ...