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

北京电子科技学院(BESTI)实验报告

课程:Java程序设计

班级:1452

指导教师:娄嘉鹏

实验日期:2016.04.12

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

一、实验内容

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

二、实验要求

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

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

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

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

三、实验步骤

一、三种代码

用程序解决问题时,要会写三种码:伪代码、产品代码、测试代码

我们通过一个例子说明如何写这三种代码。我们要在一个MyUtil类中解决一个百分制成绩转成“优、良、中、及格、不及格”五级制成绩的功能。
  • 1.伪代码

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

      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 "错误";
    }
    }
  • 3.测试代码

eg1:用50分测试时

  • 运行结果

eg2:测试正常情况时

  • 运行结果

eg3:输入负分或大于100时

  • 运行结果

eg4:增加对负分的判断后

  • 运行结果

eg5:测试边界情况

  • 运行结果

eg6:优秀成绩包含100时

  • 运行结果

二、TDD

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

      TDD的一般步骤如下:
    
      明确当前要完成的功能,记录成一个测试列表
    快速完成编写针对此功能的测试用例
    测试代码编译不通过(没产品代码呢)
    编写产品代码
    测试通过

eg:打开Eclipse,单击File->New->Java Project新建一个TDDDemoJava项目,在TDDDemo上新建一个SourceFolderFloder命名为test,在test目录上新建Junit Test Case新建一个测试用例类。

  • 运行结果

eg:增加第一个测试用例代码。输入完毕后,显示如下错误。由于MyUtil的类还不存在。

  • 运行结果

eg:在TDDDemosrc目录中新建一个MyUtil类,实现percentage2fivegrade方法。回到MyUtilTest错误消失。

  • 运行结果

eg:右键MyUtilTest.java,选择Run->JUnit Test。运行出现red bar

  • 运行结果

eg:返回MyUtil.java修改,红线消失。再运行测试。

  • 运行结果

eg:增加一个测试异常情况的用例testException

  • 运行结果

三、面向对象三要素

  • 1.抽象

      抽象就是抽出事物的本质特征而暂时不考虑他们的细节。
    抽象包括两个方面:过程抽象、数据抽象。
  • 2.封装、继承与多态

      面向对象(Object-Oriented)的三要素包括:封装、继承、多态。
    
      面向对象的思想涉及到软件开发的各个方面,如面向对象分析(OOA)、面向对象设计(OOD)、面向对象编程实现(OOP)。
    
      OOA根据抽象关键的问题域来分解系统,关注是什么(what)。
    
      OOD是一种提供符号设计系统的面向对象的实现过程,用非常接近问题域术语的方法把系统构造成“现实世界”的对象,关注怎么做(how),通过模型来实现功能规范。
    
      OOP则在设计的基础上用编程语言(如Java)编码。贯穿OOA、OOD和OOP的主线正是抽象。

eg:

四、UML

我们可以用UML中的类图来描述类Dog,首先我们在实验楼的环境中打开shell,在命令行中输入umbrello,打开UML建模软件umbrello

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

eg:

五、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.
软件实体(类,模块,函数等)应该对扩充开放,对修改封闭。

LSP的内容是:

Subtypes must be substitutable for their base types
Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it
子类必须可以被其基类所代
使用指向基类的指针或引用的函数,必须能够在不知道具体派生类对象类型的情况下使用它

ISP的内容是:

Clients should not be forced to depend upon interfaces that they do not use
客户不应该依赖他们并未使用的接口

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
高层模块不应该依赖于低层模块。二者都应该依赖于抽象
抽象不应该依赖于细节。细节应该依赖于抽象

六、练习

eg:使用TDD的方式设计关实现复数类Complex

  • 伪代码

      复数的加减运算:
    定义一个整型a作为实部;
    定义一个整型b作为虚部;
    运算后定义newA作为实部;
    运算后定义newB作为虚部;
    加法运算返回p1;
    减法运算返回p2;
    输出加、减运算结果;
  • 产品代码

  • 测试代码

七、我的PSP时间

步骤 耗时 百分比
需求分析 30分钟 10%
设计 两小时 40%
代码实现 一小时 20%
测试 一小时 20%
分析总结 30分钟 10%

单元测试的好处

单元测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试,可以查找错误、写出高质量的代码、提高编程水平。
使我们将软件模块写得易于测试和调用,从而有利于解耦、测试本身可作为被测代码的用法说明,从而替代了一部分文档功能。

实验心得

本次实验教会我们了一种方法,更方便检查自己的代码,使得之后的学习效率提高。

20145240 《Java程序设计》第二次实验报告的更多相关文章

  1. java程序设计第二次实验报告

    北京电子科技学院(BESTI) 实验报告 课程:数据结构    班级:1352    姓名:何伟钦     学号:20135223 成绩:            指导教师:娄嘉鹏      实验日期: ...

  2. 20145240 《Java程序设计》第一次实验报告

    20145240 <Java程序设计>第一次实验报告 实验内容 一.命令行下java程序开发 1.建立Code目录,输入mkdir 20145240命令建立实验目录,并使用dir命令查看目 ...

  3. 20155339《java程序设计》第一次实验报告

    20155339<java程序设计>第一次实验报告 实验一 java开发环境的熟悉 实验内容 1.使用JDK编译.运行简单的java程序: 2.使用IDEA编辑.编译.运行.调试java程 ...

  4. 20145330《Java程序设计》第一次实验报告

    20145330<Java程序设计>第一次实验报告 实验一Java开发环境的熟悉 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Ja ...

  5. 20145320《Java程序设计》第一次实验报告

    20145320<Java程序设计>第一次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.04.08 18: ...

  6. 学号20155311 2016-2017-2 《Java程序设计》第一次实验报告

    课程:Java程序设计 实验名称:Java开发环境的熟悉 实验目的与要求: 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程: 完成实验. ...

  7. 20145216史婧瑶《Java程序设计》第一次实验报告

    实验一 Java开发环境的熟悉(Linux + Eclipse) 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验要求 1.没 ...

  8. 20145238-荆玉茗 《Java程序设计》第一次实验报告

    实验一 Java开发环境的熟悉(Linux + Eclipse) 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验要求 1.没 ...

  9. 20145235 《Java程序设计》第一次实验报告

    实验一Java开发环境的熟悉 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验知识点 1.JVM.JRE.JDK的安装位置与区 ...

随机推荐

  1. dm8148 开发之---sii9022a hdmi传输器

    SiI9022A -HDMI 发送器    照相机.摄影机和便携式媒体播放器的高清解决方案   SiI9022a是一款超低功耗的HDMI发送器,集成度更高, 电源管理特性也更强,适用于手提式消费电子设 ...

  2. MySQL设计之三范式

    网上查找了一些资料,记录如下并加入自己的理解. 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小.但是有 ...

  3. 编写gulpfile.js文件:压缩合并css、js

    使用gulp一共有四个步骤: 1. 全局安装 gulp: $ npm install --global gulp 2. 作为项目的开发依赖(devDependencies)安装: $ npm inst ...

  4. Android自己主动化构建之Ant多渠道打包实践(下)

    前言 上一篇(Android自己主动化构建之Ant多渠道打包实践(上))已经介绍了Android的apk是怎样构建的,本篇博客继续Ant打包的实践过程. 集成友盟统计SDK 这里以友盟统计为例,对各个 ...

  5. IDLE崩溃:IDLE's subprocess didn't make connection. Either IDLE can't start a...

    今天在测试Python脚本的时候,突然间发现,脚本不能启动了,还弹出了“IDLE's subprocess didn't make connection. Either IDLE can't star ...

  6. ZOJ1119(SPF)

    题目链接:传送门 题目大意:一副无向图,问有多少个节点满足删除该节点后图不连通,对于每个满足条件的节点,输出节点编号及删除节点将图分为几个连通块.若没有节点满足则输出No SPF nodes 题目思路 ...

  7. C# Static修饰符的作用

    MSDN上的定义 Use the static modifier to declare a static member, which belongs to the type itself rather ...

  8. iOS 载入图片选择imageNamed 方法还是 imageWithContentsOfFile?

    Apple官方的文档为生成一个UIImage对象提供了两种方法: 1. imageNamed,其參数为图片的名字. 2. imageWithContentsOfFile,其參数也是图片文件的路径. 那 ...

  9. 004-mysql explain详解

    一.使用 使用explain + 查询语句 二.解释说明 1)id列[执行顺序] id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它 ...

  10. 第K层的结点数

    int GetNodeNumKthLevel(BiTNode * pRoot, int k) { if(pRoot == NULL || k < 1) return 0; if(k == 1) ...