《Java程序设计》实验二(Java面向对象程序设计)实验报告

目录

  • 改变
  • Java面向对象程序设计实验要求
  • 实验成果
  • 课后思考

改变

看了下之前实验二的整体,很搞笑,大图+代码,没了。。。整体重改

Java面向对象程序设计实验要求

用程序解决问题时,要学会写以下三种代码:

  • 伪代码
  • 产品代码
  • 测试代码

正确的顺序应为:伪代码(思路)→ 测试代码(产品预期功能)→ 产品代码(实现预期功能),这种开发方法叫“测试驱动开发”(TDD)。TDD的一般步骤如下:

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

基于TDD,可以有效避免过度开发的现象,因为我们只需要让测试通过即可。

实验成果

任务一:实现百分制成绩转成“优、良、中、及格、不及格”五级制成绩的功能

以这个任务为例,我们来对TDD方法进行一次小小的实践。

首先要明白自己的程序需要进行哪些操作?要实现什么目标?伪代码可以帮我们理清思路。

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

伪代码不需要说明具体调用的方法名,甚至不需要强调你打算使用的语言,理清思路即可。

其次,选择一种语言把伪代码实现,也就成了产品代码

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

产品代码是为用户提供的,为了保证正确性,我们需要对自己的程序进行测试,考虑所有可能的情况,来判断结果是否合乎要求。这是我们就需要写测试代码

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

如果输出test passed!,那就代表通过测试咯~

输出test failed!即为不通过,Java中有单元测试工具JUnit来辅助进行TDD,我们用TDD的方式把前面百分制转五分制的例子重写一次,体会一下有测试工具支持的开发的好处。鼠标放在需要测试的类上单击,出现一个黄色灯泡,点击选择“Create 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)); } }

如果出现问题,IDEA就会提示我们具体是哪一步出错了。比如:

可以看出,IDEA提示我们究竟实际的结果以及预期的结果。

任务二:以TDD的方式研究学习StringBuffer

这个任务主要锻炼我们自己写JUnit测试用例的能力。老师在教程里给出的程序如下:

public static void main(String [] args){ StringBuffer buffer = new StringBuffer(); buffer.append('S'); buffer.append("tringBuffer"); System.out.println(buffer.charAt(1)); System.out.println(buffer.capacity()); System.out.println(buffer.length()); System.out.println(buffer.indexOf("tring")); System.out.println("buffer = " + buffer.toString());

首先我们需要对这个程序进行改写,写成上面的产品代码那种类型的,以便于我们进行测试。

产品代码如下:

public class StringBufferDemo{StringBuffer buffer = new StringBuffer();public StringBufferDemo(StringBuffer buffer){ this.buffer = buffer; } public Character charAt(int i){ return buffer.charAt(i); } public int capacity(){ return buffer.capacity(); } public int length(){ return buffer.length(); } public int indexOf(String buf) { return buffer.indexOf(buf); } }

接下来对调用各种方法的返回值进行猜测。。

我设置了长度不同的三个字符串进行测试,代码如下:

public class StringBufferDemoTest extends TestCase { StringBuffer a = new StringBuffer("StringBuffer");//测试12个字符(<=16) StringBuffer b = new StringBuffer("StringBufferStringBuffer");//测试24个字符(>16&&<=34) StringBuffer c = new StringBuffer("StringBufferStringBufferStringBuffer");//测试36个字符(>=34) @Test public void testcharAt() throws Exception{ assertEquals('S',a.charAt(0)); assertEquals('g',a.charAt(5)); assertEquals('r',a.charAt(11)); } @Test public void testcapacity() throws Exception{ assertEquals(28,a.capacity()); assertEquals(40,b.capacity()); assertEquals(52,c.capacity()); } @Test public void testlength() throws Exception{ assertEquals(12,a.length()); assertEquals(24,b.length()); assertEquals(36,c.length()); } @Test public void testindexOf() throws Exception{ assertEquals(0,a.indexOf("Str")); assertEquals(5,a.indexOf("gBu")); assertEquals(10,a.indexOf("er")); } }

可以看到,出现了“green bar”,说明测试通过了,我们对StringBuffer也有了更加深刻的认识

任务三:使用StarUML对实验二中的代码进行建模

UML是一种通用的建模语言,可以非常直观地表现出各个结构之间的关系。

基于以上学习,我们在UML中实现了类,继承和接口的组合:

当然,UML还可以实现更多更复杂的功能,只做了要求的,时间不大够

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

任务四:对MyDoc类进行扩充,让其支持Long类,初步理解设计模式

OCP是OOD中最重要的一个原则,要求软件实体(类,模块,函数等)应该对扩充开放,对修改封闭。也就是说,软件模块的行为必须是可以扩充的,在应用需求改变或需要满足新的应用需求时,我们要让模块以不同的方式工作;同时,模块的源代码是不可改动的,任何人都不许修改已有模块的源代码。OCP可以用以下手段实现:

(1)抽象和继承,

(2)面向接口编程。

以这道题为例,已有的支持Int型的代码如下:

abstract class Data{public abstract void DisplayValue(); } class Integer extends Data { int value; Integer(){ value=100; } public void DisplayValue(){ System.out.println(value); } } class Document { Data pd; Document() { pd=new Integer(); } public void DisplayData(){ pd.DisplayValue(); } } public class MyDoc { static Document d; public static void main(String[] args) { d = new Document(); d.DisplayData(); } }

如果要求支持Long类,Document类要修改构造方法,这还违反了OCP原则。封装、继承、多态解决不了问题了,这时需要设计模式了:

abstract class Data { abstract public void DisplayValue(); } class Integer extends Data { int value; Integer() { value=100; } public void DisplayValue(){ System.out.println (value); } } // Pattern Classes abstract class Factory { abstract public Data CreateDataObject(); } class IntFactory extends Factory { public Data CreateDataObject(){ return new Integer(); } } 

这样一来,我们只需要class Long extends Dataclass LongFactory extends Factory即可使系统支持Long类型,测试代码如下:

public class MyDoc {static Document d;public static void main(String[] args) { d = new Document(new LongFactory()); d.DisplayData(); } }

我们看到,通过增加了一层抽象层使代码符合了OCP原则,使代码有良好的可扩充性、可维护性。不过,设计模式也不能过度使用,具体在哪些场合应用还要看实际问题。

课后思考

@Test或者import junit.framework.TestCase为什么是红的?

当时做出了这样的问题,查了下其他同学的博客想起了解决方式

进入之后,根据你的IDEA安装地址导入这两个包就可以了。

学习反思及总结

平时写的博客确实不够认真,实验全部重新修改,以上。

标签: Java学习笔记

转载于:https://www.cnblogs.com/20145207lza/p/6730452.html

20145207《Java程序设计》实验二(Java面向对象程序设计)实验报告相关推荐

  1. 实验二《面向对象程序设计》_实验报告

    实验二<面向对象程序设计>_实验报告 一.实验前期预习准备 Junit的安装和配置 选择File->Setting打开设置对话框,在设置对话框中选择Plugins, 单击Instal ...

  2. 20175333曹雅坤 实验二 Java面向对象程序设计

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

  3. java面向对象实验结论及心得_20162305 实验二 Java面向对象程序设计 实验报告

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

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

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

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

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

  6. java面对对象教学_Java面向对象程序设计教与学

    原标题:Java面向对象程序设计教与学 面向对象程序设计(Object Oriented Programming,OOP)主要研究如何从对象的角度出发构建程序单元以及程序开发机制,主要内容包括抽象的技 ...

  7. java面向对象程序设计题库_java面向对象程序设计习题集.doc

    java面向对象程序设计习题集.doc 1JAVA 面向对象程序设计习题集 23目 录引 言 .6第一章 JAVA 基础 7一.填空题 7二.判断题 9三.选择题 9四.程序阅读题 26第二章 控制结 ...

  8. java基本语句回文数实验_实验二 java基本数据类型与把持语句.doc

    实验二 java基本数据类型与把持语句.doc 还剩 4页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: 5System.out.println(num ...

  9. python顺序结构实验设计_实验二 顺序结构程序设计(验证性实验)

    安徽工程大学 Python程序设计实验报告 班级物流192 姓名 徐敏 学号 3190505232 成绩 _____ 日期 2020.3.22 指导老师 修宇 [实验名称] 实验二 顺序结构程序设计( ...

  10. Java图形编程实验总结_实验二java图形界面编程2015级.doc

    实验二java图形界面编程2015级.doc 实验二JAVA图形界面编程一.实验目的熟悉JAVA运行环境,编程掌握JAVASWING组件的图形界面编程.二.实验环境微机,软件MYECLIPSE,JDK ...

最新文章

  1. java中对Excel的创建、样式修改
  2. 【poj1088 记忆话搜索】
  3. 字符串Ascll格式转16进制
  4. 高性能相关----爬虫
  5. SDN基本概念和Overlay技术
  6. Java开发实用工具推荐
  7. 计算机性能指标的类型,电脑显示器的分类, 性能指标介绍
  8. oracle误删除表空间的数据文件
  9. Excel中VBA编程学习笔记(十二)--自动筛选
  10. 助力企业设备上云,京东云上物联网产品重磅发布
  11. Word文档如何进行拆分成多个文档?
  12. android 黑屏定位,如何将黑屏Android修复为正常
  13. windows git bash 设置多个php版本和composer版本
  14. IntelliJ IDEA商业版 -- 破解
  15. html5渐变的两种方式,HTML5的渐变色 渐变的两种类型 createLinearGradient 和createRadialGradient...
  16. tvOS多层图片的使用
  17. IIS服务 与 NetWork Rat(网络老鼠)8.0 的 上线方法
  18. uniapp H5、app、小程序不同端之间跳转
  19. 游戏服务器Mina框架开发
  20. java酒店管理系统课程设计_JSP酒店管理系统课程设计.doc

热门文章

  1. linux输入法小结
  2. C++ 知识整理 函数
  3. 程序员杂志为啥没有了_计算机基础知识,程序员必备知识,java必会!新建一个TXT,发生了什么?...
  4. eclipse修改工作的目录顺序
  5. 今日恐慌与贪婪指数为92 贪婪程度有所上升
  6. SAP License:BCS进阶第五篇-BCS合并现金流量表的实现
  7. 赛锐信息:SAP 程序优化
  8. 重磅分享--基于违约概率跟odds的经验评分
  9. 【odoo12填坑日记】field.selection引号使用规范
  10. 智能车学习(八)——菜单的实现