java第二次上机实验程序_java程序设计第二次实验报告

北京电子科技学院(BESTI)

实验报告

课程:数据结构    班级:1352    姓名:何伟钦     学号:20135223

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

实验密级:         预习程度:             实验时间:5:30-10:00

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

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

实验目的与要求:1.初步掌握单元测试和TDD

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

3.初步掌握UML建模

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

5.了解设计模式

实验仪器

型号

数量

笔记本电脑

戴尔14z-5423

1

Eclipse

\

\

虚拟机

\

\

实验步骤

(一)单元测试

(1) 三种代码

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

伪代码

产品代码

测试代码

通过一个例子说明如何写这三种代码。

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

1.伪代码

fd94583e9525e3d752d24fab47ddebe8.png

2.产品代码

b7282e36678bf1428b96e0ed168fb2a1.png

3.测试代码

d56cbe798cd1ca09e6379ba9b32ae817.png

测试正常情况

ea4e6d32a8204ad74e7f7dac0f92082e.png

测试出错情况

25b85fa7da3322f273fdca3a0b2cb6df.png

8adb7f91b54e1b735085dd527d3c9301.png

ed3bb5b2549da72a2f85b56b80a85d95.png

测试边界状况

809d520f5de08fdca82fe39ee9968baa.png

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

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

TDD的一般步骤如下:

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

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

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

编写产品代码

测试通过

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

循环完成所有功能的开发

a82890518e5b37743a44a53948f550e0.png

35df28baaeba4463548450b6693cbd7f.png

31a80cd2e2884ed3572674fe925a48e7.png

TDD的编码节奏是:

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

修改产品代码

JUnit出现绿条,任务完成

测试结果出现了一个红条(red bar),说明测试没通过,红条上面汇总了测试情况,运行了一个测试,没有错误,一个测试没通过。下面原因说的也很清楚:测试代码第十行传入55时,期望结果是“不及格”,代码返回了“错误”

98e3577a41a0abf500d000c7e8d0eaa8.png

修改MyUtil.Java吧,输入以下代码,绿条表示程序运行通过

edaca9ac5bef3c4919d097b084bb4539.png

80faad98b71fe57b516716ca0235d10d.png

d1a9efdbbeedac1ca16d672177674971.png

312963e62e1452ac6ff971e04c4711f1.png

(二)面向对象三要素

(1)抽象

抽象就是抽出事物的本质特征而暂时不考虑他们的细节。对于复杂系统问题人们借助分层次抽象的方法进行问题求解;在抽象的最高层,可以使用问题环境的语言,以概括的方式叙述问题的解。在抽象的较低层,则采用过程化的方式进行描述。在描述问题解时,使用面向问题和面向实现的术语。 程序设计中,抽象包括两个方面,一是过程抽象,二是数据抽象。

(2)封装继承与多态

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

2.继承指一个类的定义可以基于另外一个已经存在的类,即子类基于父类,从而实现父类代码的重用。继承的关键在于确认子类为父类的一个特殊类型 。继承是实现软件可重用的根基,是提高软件系统的可扩展性与可维护性的主要途径,继承可以实现代码复用。需要注意的是,继承更重要的作用是实现多态。

3.多态是指不同的类对象调用同一个签名的成员方法时将执行不同代码的现象。多态是面向对象程序设计的灵活性和可扩展性的基础。 我们再看看上一个类图,我们可以进一步抽象,把Dog类中的bark()和Cat类中的meow()抽象成一个抽象方法shout(),Dog类和Cat类中覆盖这个方法

a4d8623bafd08d907630aa6e4a6956a5.png

c262158b641cb23fd0dafca5b7ab95e9.png

27f3157e21c6317fdfc2997ec86533ee.png

(三)设计模式初步

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

(2)模式与设计模式

模式是某外在环境(Context) 下﹐对特定问题(Problem)的惯用解决之道(Solution)。模式必须使得问题明晰,阐明为什么用它来求解问题,以及在什么情况下有用,什么情况下不能起作用,每个模式因其重复性从而可被复用,本身有自己的名字,有可传授性,能移植到不同情景下。模式可以看作对一个问题可复用的专家级解决方法。 计算机科学中有很多模式:

GRASP模式

分析模式

软件体系结构模式

设计模式:创建型,结构型,行为型

管理模式: The Manager Pool 实现模式

界面设计交互模式

这里面最重要的是设计模式,在面向对象中设计模式的地位可以和面向过程编程中的数据结构的地位相当。

(3)设计模式实示例

设计模式(design pattern)提供一个用于细化软件系统的子系统或组件,或它们之间的关系图,它描述通信组件的公共再现结构,通信组件可以解决特定语境中的一个设计问题。

(四)练习

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

1.伪代码

30a7060b4c98968368e969ef6210024b.png

2.测试代码

70912f9d0965b85a4958e15975896744.png

3.产品代码

fbf25796310ce79090780ff885f1b33b.png

cbde071b726c22f5dde2154226ccc94d.png

88dbed6d790a7f59dd9cae1d0f0d0323.png

b3c577f7518945e4b3c24d1d167dc00d.png

4.运行结果

71ef793f74058e05329204b3b7b60e13.png

5.统计时间

步骤

耗时

百分比

需求分析

5

6.25%

设计

10

12.5%

代码实现

50

62.5%

测试

10

12.5%

分析总结

5

6.25%

总结单元测试的好处:

(1)优化程序设计,不断优化程序,使程序更加完善。

(2)让自己负责的模块功能定义尽量明确,模块内部的改变不会影响其他模块,而且模块的质量能得到稳定的、量化的保证。

(3)设计的程序耦合度也越来越低。每个单元程序的输入输出,业务内容和异常情况都会尽可能变得简单。最后发现自己的编程习惯和设计能力会越来越好

实验体会:

本次实验收获很大,初步掌握单元测试和TDD,并深入理解并在一定程度上掌握了java编程中封装、继承、多态的应用。

对UML建模和S.O.L.I.D原则也有了一定程度的了解。虽然在实验过程中遇到不少问题,但最后都能得到很好的解决。但这次实验花费时间过多,总体来说实验效率很低。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java程序设计实验报告 实验实验题目:从键盘上读入10个字符串存入数组a中,然后输出这10个字符串中最大字符串 和最小字符串。 实验代码: public class StrPro { public static void main(String[] args) { String str[] = new String[5]; System.out.println("Please input 10 strings:"); int i; String max,min; for(i=0;i<5;i++){ System.out.print("Please input the "+(i+1)+" string:"); Scanner sc = new Scanner(System.in); str[i] = sc.nextLine(); } max = str[0]; min = str[0]; for(i=0;i<str.length;i++){ if(max.compareTo(str[i])<0){ max = str[i]; } if(min.compareTo(str[i])>0){ min = str[i]; } } System.out.println("最大的字符串为:"+max); System.out.println("最小的字符串为:"+min); } } 实验结果: 实验心得体会: 掌握了java的基本语法,数组的定义与使用,做这个实验要了解字符串数组的定义 及字符串数组的输入方法,还有比较字符串数组的大小的调用方法等。 实验实验题目: 自定义一个矩形类(Rectangle),包含的属性有:长(length),宽(width), 包含的方法有:关于属性的setter和getter方法,即setLength,getLength,setWidth ,getWidth,计算矩形面积的方法(getArea)。 定义矩形类的子类正方形类(Square),包含的属性和方法自行确定,要求完成的 功能是,能计算正方形的面积。 定义一个测试类(Test),测试矩形类和正方形类能否正确的计算面积。 以上类中属性和方法的访问权限自行确定,方法和构造方法若有参数,也自行确定 。 实验代码: public class Rectangle { int Length; int Width; public int getLength() { return Length; } public void setLength(int length) { Length = length; } public int getWidth() { return Width; } public void setWidth(int width) { Width = width; } int getArea(){ return Length * Width; } } public class Square extends Rectangle{ Square(int border) { super.setLength(border); super.setWidth(border); } } public class Test { public void test(){ System.out.println("请选择计算的形状的序号:1.矩形 2.正方形"); Scanner sc = new Scanner(System.in); int i = sc.nextInt(); int len,wid; if(i==1){ System.out.print("请输入矩形的长:"); Scanner s = new Scanner(System.in); len = s.nextInt(); System.out.print("请输入矩形的宽:"); wid = s.nextInt(); Rectangle re = new Rectangle(); re.setLength(len); re.setWidth(wid); System.out.println("矩形面积为:"+re.getArea()); } else if(i==2){ System.out.print("请输入正方形的边长:"); Scanner s = new Scanner(System.in); len = s.nextInt(); Square sq = new Square(len); System.out.println("正方形面积为:"+sq.getArea()); } else{ System.out.println("输入错误!"); } } public static v

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值