2017-2018-2 20165309实验二《Java面向对象程序设计》实验报告
一、实验内容
1. 初步掌握单元测试和TDD
2. 理解并掌握面向对象三要素:封装、继承、多态
3. 初步掌握UML建模
4. 熟悉S.O.L.I.D原则
5. 了解设计模式
二、实验步骤
(一)单元测试
1.三种代码:伪代码、测试代码、产品代码
需求:在一个MyUtil类中解决一个百分制成绩转成“优、良、中、及格、不及格”五级制成绩的功能。
- 先用自然语言写出从意图层面来解决问题的伪代码:
百分制转五分制:
如果成绩小于60,转成“不及格”
如果成绩在60与70之间,转成“及格”
如果成绩在70与80之间,转成“中等”
如果成绩在80与90之间,转成“良好”
如果成绩在90与100之间,转成“优秀”
其他,转成“错误”
- 然后用Java语言将伪代码“翻译”成产品代码
MyUtil.java
。 - 写测试代码
MyUtilTest.java
来检验产品代码:- JUnit测试用例:
- 正常情况
- 错误情况(负数,超过100的数)
- 边界情况(0,60,70,80,90,100)
- 在项目上右键选择
New->Directory
建目录test
,右键单击test
目录,在弹出的菜单中选择Mark Directory as->Test Sources Root
来设置SOURCEPATH
环境变量。 - 测试通过的截图如下:
- JUnit测试用例:
- 完善产品代码。
- 测试代码和最终的产品代码在代码链接里。
2.测试驱动开发TDD(测试代码->产品代码)
- 在新目录下创建
StringBufferDemo
类,
鼠标单击类名旁出现的灯泡状图标,在弹出的菜单中Create Test
。 - 测试
StringBufferDemo
类的方法charAt()
、capacity()
、indexOf()
、length()
:-
char charAt(int index)
返回此序列中指定索引处的 char 值。 -
int capacity()
返回当前容量。 -
int indexOf(String str)
返回第一次出现的指定子字符串在该字符串中的索引。 -
int length()
返回长度(字符数)。
-
- 测试结果如下:
- 代码链接
(二)对设计模式示例进行扩充,让其支持Long类
- 如果要求支持
Long
类,Document
类要修改构造方法,这违反了OCP原则。封装、继承、多态解决不了问题,这时就需要设计模式了:class Long extends Data
class LongFactory extends Factory
- 在
MyDoc
类中添加测试代码:public class MyDoc {
static Document d;
public static void main(String[] args) {
d = new Document(new LongFactory());
d.DisplayData();
}
} - 运行结果如下:
- 代码在码云链接里。
(三)以TDD的方式开发一个复数类Complex
- 伪代码:
Complex类要输出实部、虚部,并按照a+bi的形式输出复数。
Complex类中有两个变量,实部A和虚部B。 方法:
getA(int a);返回实部
getB(int b);返回虚部
ComplexAdd(Complex c);实现复数相加
ComplexMinus(Complex c);实现复数相减
ComplexMulti(Complex c);实现复数相乘
ComplexDiv(Complex c);实现复数相除
toString(int a,int b);将复数输出成a+bi的格式。 - 测试结果:
- 产品代码和测试代码在码云链接。
(四)面向对象三要素
抽象
-
封装、继承与多态
使用UML对实验二中代码进行建模
- 代码:
public abstract class Animal {
private String color;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public abstract String shout();
}
public class Cat extends Animal {
public String shout() {
return "喵喵";
}
public String toString() {
return "The Cat's color is " + this.getColor() +", and it shouts "+ this.shout() + "!";
}
}
public class Dog extends Animal
{
public String shout() {
return "汪汪";
}
public String toString() {
return "The Dog's color is " + this.getColor() +", and it shouts "+ this.shout() + "!";
}
} UML图(由网页ProcessOn制作)
三、实验中遇到的问题及解决
- 问题1:当时安装IDEA的时候选择的都是默认路径,而且也不算是经常用,所以没有找到Junit jar 包。
- 解决1:右键桌面上的IntelliJ IDEA Ultimate,点进属性里面,复制地址再粘到“+”就方便找到了~
- 问题2:对StringBuffer的了解不够。
- 解决2:可以参考学习这个网址:www.runoob.com/java/java-stringbuffer.html。
- 解决3:long型的范围是-2147483648~2147483647
- 问题4:在设计实现复数类时不知道怎么去拼接字符串。
- 解决4:尝试
concat()
方法后仍存在问题,突然又意识到可以直接+
....
四、实验收获
这次的实验让我学会了如何去写测试代码,也让我规范了编写代码的习惯。跟着老师的博客教程和蓝墨云上的要求去做的同时,我也意识到了自己对一些基础方面的知识还不够熟悉...得认真看书才是。
步骤 | 耗时 | 百分比 |
---|---|---|
需求分析 | 15min | 12.5 |
设计 | 20min | 16.7 |
代码实现 | 40min | 33.3 |
测试 | 25min | 20.8 |
分析总结 | 20min | 16.7 |