北京电子科技学院(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.伪代码
2.产品代码
3.测试代码
测试正常情况
测试出错情况
测试边界状况
(2) TDD(Test Driven Devlopment, 测试驱动开发)
先写测试代码,然后再写产品代码的开发方法叫“测试驱动开发”(TDD)。
TDD的一般步骤如下:
- 明确当前要完成的功能,记录成一个测试列表
- 快速完成编写针对此功能的测试用例
- 测试代码编译不通过(没产品代码呢)
- 编写产品代码
- 测试通过
- 对代码进行重构,并保证测试通过(重构下次实验练习)
- 循环完成所有功能的开发
TDD的编码节奏是:
- 增加测试代码,JUnit出现红条
- 修改产品代码
- JUnit出现绿条,任务完成
测试结果出现了一个红条(red bar),说明测试没通过,红条上面汇总了测试情况,运行了一个测试,没有错误,一个测试没通过。下面原因说的也很清楚:测试代码第十行传入55时,期望结果是“不及格”,代码返回了“错误”
修改MyUtil.Java吧,输入以下代码,绿条表示程序运行通过
(二)面向对象三要素
(1)抽象
抽象就是抽出事物的本质特征而暂时不考虑他们的细节。对于复杂系统问题人们借助分层次抽象的方法进行问题求解;在抽象的最高层,可以使用问题环境的语言,以概括的方式叙述问题的解。在抽象的较低层,则采用过程化的方式进行描述。在描述问题解时,使用面向问题和面向实现的术语。 程序设计中,抽象包括两个方面,一是过程抽象,二是数据抽象。
(2)封装继承与多态
1.封装实际上使用方法(method)将类的数据隐藏起来,控制用户对类的修改和访问数据的程度,从而带来模块化(Modularity)和信息隐藏(Information hiding)的好处;接口(interface)是封装的准确描述手段。
2.继承指一个类的定义可以基于另外一个已经存在的类,即子类基于父类,从而实现父类代码的重用。继承的关键在于确认子类为父类的一个特殊类型 。继承是实现软件可重用的根基,是提高软件系统的可扩展性与可维护性的主要途径,继承可以实现代码复用。需要注意的是,继承更重要的作用是实现多态。
3.多态是指不同的类对象调用同一个签名的成员方法时将执行不同代码的现象。多态是面向对象程序设计的灵活性和可扩展性的基础。 我们再看看上一个类图,我们可以进一步抽象,把Dog类中的bark()和Cat类中的meow()抽象成一个抽象方法shout(),Dog类和Cat类中覆盖这个方法
(三)设计模式初步
(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.伪代码
2.测试代码
3.产品代码
4.运行结果
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原则也有了一定程度的了解。虽然在实验过程中遇到不少问题,但最后都能得到很好的解决。但这次实验花费时间过多,总体来说实验效率很低。