课程:移动平台应用开发实践 班级: 9217
姓名:蔡斌思 学号:20159217
成绩: 指导教师:娄嘉鹏 实验日期:2015.10.11
实验密级: 预习程度: 实验时间:
仪器组次: 必修/选修:选修 实验序号:1
实验名称:Java面向对象程序设计
实验目的与要求:
1. 初步掌握单元测试和TDD
2. 理解并掌握面向对象三要素:封装、继承、多态
3. 初步掌握UML建模
4. 熟悉S.O.L.I.D原则
5. 了解设计模式
实验要求:
1.没有Linux基础的同学建议先学习《Linux基本入门(新版)》《Vim编辑器》课程
2.完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行 等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老 师的指导。
3. 严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。
4. 请大家先在实验楼中的~/Code目录中用自己的学号建立一个目录,代码和UML图要放到这个目录中,截图中没有学号的会要求重做,然后跟着下面的步骤练 习。
实验仪器:
名称 |
型号 |
数量 |
PC |
|
1 |
虚拟机 |
实验楼 |
1 |
实验步骤:
(一)单元测试
(1)三种代码:伪代码、产品代码、测试代码
以“百分制转五分制”为例,介绍三种代码:
伪代码(使用伪码的目的是使被描述的算法可以容易地以任何一种编程语言实现,使用伪代码, 不用拘泥于具体实现)
/*
百分制转五分制:
如果成绩小于60,转成“不及格”
如果成绩在60与70之间,转成“及格”
如果成绩在70与80之间,转成“中等”
如果成绩在80与90之间,转成“良好”
如果成绩在90与100之间,转成“优秀”
其他,转成“错误”
*/
产品代码(把伪代码写成java语句的形式)
测试代码(测试
是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求)
在具体测试中,发现了两个bug,一个是在判断不及格时没有要求大于等于零,另一个是没有考虑100的情况。因此要添加grade<0的报错以及修改grade<100为grade<=100。因此一般情况下测试代码要比产品代码要长一些。
(2)TDD(Test Driven Devlopment,测试驱动开发)
测试驱动开发(TDD):先写测试代码
,再写产品代码
,从而写出来的代码就是正确的
步骤如下:
明确当前要完成的功能,记录成一个测试列表
快速完成编写针对此功能的测试用例
测试代码编译不通过(无产品代码?)
编写产品代码
对代码进行重构,并保证测试通过(重构下次实验练习)
循环完成所有功能的开发
Eclipse
->File->New->Java Project
新建一个TDDDemo
的Java项目
TDDDemo->右键->New->Source Folder
新建一个测试目录test
Test
->右键->New->JUnit Test Case
新建一个测试用例类MyUtilTest并输入代码(由于没有建立MyUtil类以及percentage2fivegrade方法,所以有红字出现):
在TDDDemo
的src
目录中新建MyUtil
的类,并实现percentage2fivegrade方法:
我们把鼠标放到MyUtilTest.java上,单击右键,选择Run as->JUnit Test。测试结果出现了一个红条(red bar),说明测试没通过:
问题出现在第十行55期望结果是不及格,但是没有具体的代码,所以只能报出错误,因此要修改一下MyUtil.java,再次进行测试时,得到了绿条,说明测试已通过:
在这个基础上我们对测试进行拓展优化,增加异常情况用例和边界用例,出现错误后有增加了一条语句出现绿条:
TDD的编码节奏是:
·增加测试代码,JUnit出现红条
·修改产品代码
·JUnit出现绿条,任务完成
(二)面向对象三要素
(1)抽象
抽象是指人在认识思维活动中对事物表象因素的舍弃和对本质因素的抽取。包括两个方面,一是过程抽象,二是数据抽象。过程抽象的结果是函数,数据抽象的结果是抽象数据类型(Abstract Data Type,ADT)
(2) 封装,继承与多态
面向对象三要素:封装、继承、多态。面向对象的思想涉及到软件开发的各个方面,如面向对象分析(OOA)、面向对象设计(OOD)、面向对象编程实现(OOP)。OOA根据抽象关键的问题域来分解系统,关注是什么(what)。OOD是一种提供符号设计系统的面向对象的实现过程,用非常接近问题域术语的方法把系统构造成“现实世界”的对象,关注怎么做(how),通过模型来实现功能规范。OOP则在设计的基础上用编程语言(如Java)编码。贯穿OOA、OOD和OOP的主线正是抽象。
封装实际上使用方法(method)将类的数据隐藏起来,控制用户对类的修改和访问数据的程度,从而带来模块化(Modularity)和信息隐藏(Information hiding)的好处;接口(interface)是封装的准确描述手段。
首先尝试一下封装:
我们可以用UML中的类图来描述类Dog,首先我们在实验楼的环境中打开shell,在命令行中输入umbrello,打开UML建模软件umbrello.
UML建模之后的模型如下:
对应测试代码和运行结果如下:
实践发现Dog.java和Cat.java中有很多冗余的地方,所以重新定义了一下uml中继承表示:
(三)设计模式初步
(1)S.O.L.I.D
面向对象三要素是“封装、继承、多态”,任何面向对象编程语言都会在语法上支持这三要素。如何借助抽象思维用好三要素特别是多态还是非常困难的,S.O.L.I.D类设计原则是一个很好的指导
基于OCP
,利用面向对象中的多态性(Polymorphic),更灵活地处理变更拥抱变化,OCP
可以用以下手段实现:(1)抽象和继承,(2)面向接口编程
LSP
的核心思想是父类型对象可以被子类型对象所取代
(2)模式与设计模式
模式是某外在环境下﹐对特定问题的惯用解决之道,其中最重要的是设计模式
(3)设计模式实示例
设计模式提供一个用于细化软件系统的子系统或组件,或它们之间的关系图,它描述通信组件的公共再现结构,通信组件可以解决特定语境中的一个设计问题
(四)练习
使用TDD方式设计并实现复数类Complex
伪代码:
设计一个复数类,将复数的实部和虚部分别用变量表示。
通过实部和虚部分别相加减实现复数的相加减。
按照复数的格式将复数打印出来。
产品代码:
步骤 |
耗时 |
百分比 |
需求分析 |
0.5h |
10% |
设计 |
1h |
20% |
代码实现 |
1.5h |
30% |
测试 |
1h |
20% |
分析总结 |
1h |
20% |
单元测试的好处:
经过单元测试的代码,质量能够得到保证。
单元测试发现的问题很容易定位。
修改代码犯的错,经过单元测试易发现。
(五)总结
实验收获:
这次实验尽管花了很多时间,但是我也收获了很多。首先,通过这次实验,我对虚拟机的使用更加熟悉,也更加适应这种实验模式,对于虚拟机内代码编码更加熟悉迅速。学习到单元测试这个方便快捷并且高质量的测试方式,同时实验中一步一步地引导我学会处理可能出现的种种问题,同时也教会我以后在编写程序的时候要考虑到各种可能性,以提高代码的安全性。
出现的问题和解决方案:
首先由于内网原因,实验楼的UML没有安装上,通过询问老师并自己实践,用update语句和--fix-missing语句成功安装上。
其次由于网络很慢,实验楼内总是卡,所以浪费了很长的时间,解决方案是我在Windows下下了一个eclipse,然后用自己的eclipse进行编码,节省了不必要的时间浪费,大大加快了速度。