目录
2018-2019-2 20175234 实验二《Java面向对象程序设计》实验报告
实验内容
- 初步掌握单元测试和TDD
- 理解并掌握面向对象三要素:封装、继承、多态
- 初步掌握UML建模
- 熟悉S.O.L.I.D原则
了解设计模式
实验要求
1.没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程。
2.完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导。- 严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。
请大家先在实验楼中的~/Code目录中用自己的学号建立一个目录,代码和UML图要放到这个目录中,截图中没有学号的会要求重做,然后跟着下面的步骤练习。
实验步骤
一、单元测试
定义
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。
伪代码
百分制转五分制:
如果成绩小于60,转成“不及格”
如果成绩在60与70之间,转成“及格”
如果成绩在70与80之间,转成“中等”
如果成绩在80与90之间,转成“良好”
如果成绩在90与100之间,转成“优秀”
其他,转成“错误”
产品代码
public class MyUtil{
public static String percentage2fivegrade(int grade){
//如果成绩小于0,转成“错误”
if ((grade < 0))
return "错误";
//如果成绩小于60,转成“不及格”
else if (grade < 60)
return "不及格";
//如果成绩在60与70之间,转成“及格”
else if (grade < 70)
return "及格";
//如果成绩在70与80之间,转成“中等”
else if (grade < 80)
return "中等";
//如果成绩在80与90之间,转成“良好”
else if (grade < 90)
return "良好";
//如果成绩在90与100之间,转成“优秀”
else if (grade <= 100)
return "优秀";
//如果成绩大于100,转成“错误”
else
return "错误";
}
}
测试代码(范例:边界测试)
public class MyUtilTest {
public static void main(String[] args) {
//测试边界情况
if(MyUtil.percentage2fivegrade(0) != "不及格")
System.out.println("test failed 1!");
else if(MyUtil.percentage2fivegrade(60) != "及格")
System.out.println("test failed 2!");
else if(MyUtil.percentage2fivegrade(70) != "中等")
System.out.println("test failed 3!");
else if(MyUtil.percentage2fivegrade(80) != "良好")
System.out.println("test failed 4!");
else if(MyUtil.percentage2fivegrade(90) != "优秀")
System.out.println("test failed 5!");
else if(MyUtil.percentage2fivegrade(100) != "优秀")
System.out.println("test failed 6!");
else
System.out.println("test passed!");
}
}
测试结果截图
(正常情况、异常情况、边界情况)
二、TDD(Test Driven Devlopment测试驱动开发)
定义
先写测试代码
,然后再写产品代码
的开发方法叫“测试驱动开发”(TDD)
TDD的一般步骤如下:
- 明确当前要完成的功能,记录成一个测试列表
- 快速完成编写针对此功能的测试用例
- 测试代码编译不通过(没产品代码呢)
- 编写产品代码
- 测试通过
- 对代码进行重构,并保证测试通过(重构下次实验练习
循环完成所有功能的开发
安装Junit
问题:junit 使用org.junit不存在,点到代码中红色的部分显示
Cannot resolve symbol 'junit'
解决措施:
File
->Project Struct...
->Libraies
-> 点击绿色的加号 ->Java
-> 找到 IDEA 安装路径下的 Lib 中的junit-4.12 ->点击OK上题习题范例代码截图
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());
}
}
测试代码
import junit.framework.TestCase;
import org.junit.Test;
public class StringBufferDemoTest extends TestCase {
StringBuffer a =new StringBuffer("StringBuffer");//测试12字节
StringBuffer b=new StringBuffer("StringBufferStringBuffer");//测试24字节
StringBuffer c =new StringBuffer("StringBufferStringBufferStringBuffer");//测试36字节
@Test
public void testcharAt() throws Exception{
assertEquals('S',a.charAt(0));
assertEquals('i',a.charAt(3));
assertEquals('g',a.charAt(5));
assertEquals('r',a.charAt(11));
}
@Test
public void testcapacity()throws Exception{
assertEquals(28,a.capacity());
assertEquals(40,b.capacity());
assertEquals(52,c.capacity());
}
@Test
public void testindexOf()throws Exception{
assertEquals(0,a.indexOf("Str"));
assertEquals(3,a.indexOf("ing"));
assertEquals(5,a.indexOf("gBu"));
assertEquals(8,a.indexOf("ffer"));
}
}
测试结果截图
三、面向对象三要素
- 抽象:抽出事物的本质特征而暂不考虑细节,对于复杂的问题分层求解
过程抽象:结果是函数
数据抽象:结果是抽象数据类型 - 封装,继承与多态(面向对象的三要素)
封装:将数据与相关行为包装在一起以实现信息隐藏,java中使用类进行封装,接口是封装准确描述手段 继承:关键在于确认子类为父类的一个特殊类型,以封装为基础,继承可以实现代码复用,继承更重要的作用是实现多态。
多态:同一消息可以根据发送对象的不同而采用多种不同的行为方式四、设计模式初步
- 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,依赖倒置原则) 设计模式
Pattern name:描述模式,便于交流,存档
Problem:描述何处应用该模式
Solution:描述一个设计的组成元素,不针对特例
Consequence:应用该模式的结果和权衡(trade-offs)五、练习
1使用TDD的方式设计关实现复数类Complex。
2.实验报告中统计自己的PSP(Personal Software Process)时间