20155232 实验二《Java面向对象程序设计》实验报告
20155232 实验一《Java面向对象程序设计》实验报告
- 实验内容
1.初步掌握单元测试和TDD
2.理解并掌握面向对象三要素:封装、继承、多态
3.初步掌握UML建模
4.熟悉S.O.L.I.D原则
5.了解设计模式
- 实验要求
- 没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程;
- 完成实验、撰写实验报告,实验报告模板见QQ群,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等);
- 实验报告中统计自己的PSP(Personal Software Process)时间。
- 实验步骤
一. 单元测试
TDD(Test Driven Devlopment, 测试驱动开发)
我们是该“先写产品代码,然后再写测试代码,通过测试发现了一些Bugs,修改代码”,还是该“先写测试代码,然后再写产品代码,从而写出来的代码就是正确的”呢?当然先写测试代码了。这种先写测试代码,然后再写产品代码的开发方法叫“测试驱动开发”(TDD)。TDD的一般步骤如下:
-
明确当前要完成的功能,记录成一个测试列表
-
快速完成编写针对此功能的测试用例
-
测试代码编译不通过(没产品代码呢)
-
编写产品代码
-
测试通过
-
对代码进行重构,并保证测试通过(重构下次实验练习)
-
循环完成所有功能的开发
基于TDD,我们不会出现过度设计的情况,需求通过测试用例表达出来了,我们的产品代码只要让测试通过就可以了。
参考
提交最后三个测试用例都通过的截图,截图上要有画图加水印,输入自己的学号。
如图:测试用例testNormal,测试异常情况的用例testException和一个测试边界情况的用例testBoundary
- TDD的编码节奏是:
增加测试代码,JUnit出现红条
修改产品代码
JUnit出现绿条,任务完成
-
基于TDD,避免了出现过度设计的情况。测试结果出现了一个红条(red bar),说明测试没通过,红条上面汇总了测试情况。出现一个绿条(green bar),说明测试通过了。
-
TDD的目标是"Clean Code That Works",TDD的slogan是"Keep the bar green, to Keep the code clean"
二.参考 积极主动敲代码,使用JUnit学习Java以 TDD的方式研究学习StringBuffer,提交你的单元测试用例和测试通过的截图,截图要加上学号水印。
- StringBuffer的例子,代码如下:
public class StringBufferDemo{
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.indexOf("tring"));
System.out.println("buffer = " + buffer.toString());
}
}
- 使用TDD的方式完成的:
撰写测试代码
4个测试用例均通过,所以出现了green bar。
三.参考Java面向对象程序设计
对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式
- 用自己的学号%6进行取余运算,根据结果进行代码扩充: 让系统支持Boolean类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印。
对应的原代码如下:
class Integer {
int value;
public Integer(){
value=100;
}
public void DisplayValue(){
System.out.println(value);
}
}
class Document {
Integer pi;
public Document(){
pi = new Integer();
}
public void DisplayData(){
pi.DisplayValue();
}
}
public class MyDoc{
static Document d;
public static void main(String [] args) {
d = new Document();
d.DisplayData();
}
}
修改后的代码和运行通过截图:
- 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,依赖倒置原则)
- 充分理解OCP和DIP
-
OCP(Open-Closed Principle,开放-封闭原则):①对扩充开放(Open For Extension )要求软件模块的行为必须是可以扩充的,在应用需求改变或需要满足新的应用需求时,我们要让模块以不同的方式工作; ②对修改封闭(Closed for Modification )要求模块的源代码是不可改动的,任何人都不许修改已有模块的源代码。 ③基于OCP,利用面向对象中的多态性(Polymorphic),更灵活地处理变更拥抱变化 OCP可以用以下手段实现:(1)抽象和继承,(2)面向接口编程。
-
DIP(Dependency Inversion Principle,依赖倒置原则):通过接口或者抽象类,DIP在应用中通过依赖注入的方式实现解耦,重用低级模块,重用实现,解除依赖。
四.以TDD的方式开发一个复数类Complex,要求如下:
// 定义属性并生成getter,setter
double RealPart;
double ImagePart;
// 定义构造函数
public Complex()
public Complex(double R,double I)
//Override Object
public boolean equals(Object obj)
public String toString()
// 定义公有方法:加减乘除
Complex ComplexAdd(Complex a)
Complex ComplexSub(Complex a)
Complex ComplexMulti(Complex a)
Complex ComplexDiv(Complex a)
码云提交链接:
五.使用StarUML对实验二中的代码进行建模,发类图的截图,加上学号水印。
类图中只少两个类
六.实验中遇到的问题及解决
1.刚开始会出现红色代码说明有语法错误,这是因为MyUtil中还没有percentage2fivegrade方法,点击左边的灯泡图标可以修复这个问题:
在percentage2fivegrade()方法中加入一行return "错误"即可。
2.现在按照教程需要配置junit.jar,使用虚拟机的搜索,查询位置:
3.配置:
4.但是在配置完之后,test那里还是红色,还是错误:
5.出现以上这种情况需要再配置一个junit-4.12.jar,在配置这个之后,红色test消失,即可运行。
七.实验总结
对于第一次接触单元测试的我来讲,我认为写单元测试可以及时发现代码中存在的问题,减少后期维护的精力和费用,是调试代码的好方式。因为第一次接触TDD所以感觉用的很费劲,实验过程中问题不断,经过询问同学和上网查询,在云班课中提问软件上面出现的各种问题,才把这5个实验做出来,可谓是一波三折。
- PSP
步骤 | 耗时 | 百分比 |
---|---|---|
需求分析 | 50分钟 | 16.67% |
设计 | 120分钟 | 40% |
代码实现 | 60分钟 | 20% |
测试 | 50分钟 | 16.67% |
分析总结 | 20分钟 | 6.67% |