实验三 面向对象程序设计
# 20202315 2021-2022-1 《数据结构与面向对象程序设计》实验报告
课程:《程序设计与数据结构》
班级: 2023
姓名:王梦欣
学号:20202315
实验教师:王志强
实验日期:2021年9月30日
必修/选修: 必修
参考《实验二 Java面向对象程序设计》:http://www.cnblogs.com/rocedu/p/6736847.html
##1.实验内容
下载安装并使用IDEA,完成下面实验(https://www.cnblogs.com/rocedu/p/6371315.html)。
1. 初步掌握单元测试和TDD
2. 理解并掌握面向对象三要素:封装、继承、多态
3. 初步掌握UML建模
4. 完成蓝墨云上 (1)-(5)实验。
##2.实验过程与结果
2.1 单元测试和TDD的掌握
第一个提交点:完成单元测试的学习
产品代码及测试代码
public class MyUtil {
public static String percentage2fivegrade(int grade){
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 {
@Test
public void testNormal() {
Assert.assertEquals("不及格", MyUtil.percentage2fivegrade(55));
Assert.assertEquals("及格", MyUtil.percentage2fivegrade(65));
Assert.assertEquals("中等", MyUtil.percentage2fivegrade(75));
Assert.assertEquals("良好", MyUtil.percentage2fivegrade(85));
Assert.assertEquals("优秀", MyUtil.percentage2fivegrade(95));
}
@Test
public void testException(){
Assert.assertEquals("错误", MyUtil.percentage2fivegrade(-55));
Assert.assertEquals("不及格", MyUtil.percentage2fivegrade(55));
}
@Test
public void testBoundary(){
Assert.assertEquals("不及格", MyUtil.percentage2fivegrade(0));
Assert.assertEquals("及格", MyUtil.percentage2fivegrade(60));
Assert.assertEquals("中等", MyUtil.percentage2fivegrade(70));
Assert.assertEquals("良好", MyUtil.percentage2fivegrade(80));
Assert.assertEquals("优秀", MyUtil.percentage2fivegrade(90));
Assert.assertEquals("优秀", MyUtil.percentage2fivegrade(100));
}
}
运行结果:正常情况、错误情况及边界情况
第二个提交点:
TDD的一般步骤如下:
- 明确当前要完成的功能,记录成一个测试列表
- 快速完成编写针对此功能的测试用例
- 测试代码编译不通过(没产品代码呢)
- 编写产品代码
- 测试通过
- 对代码进行重构,并保证测试通过(重构下次实验练习)
- 循环完成所有功能的开发
以 TDD的方式研究学习StringBuffer
import junit.framework.TestCase; import static org.junit.Assert.*; import org.junit.Test; public class StringBufferDemoTest extends TestCase { StringBuffer a = new StringBuffer("stringbuffer");//测试12个字符(<=16) StringBuffer b = new StringBuffer("stringbufferstringbuffer");//测试24个字符(>16&&(=34) StringBuffer c = new StringBuffer("stringbufferstringbufferstringbuffer");//测试36个字符(>=34) @Test public void testcharAt() throws Exception { assertEquals('s', a.charAt(0)); 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 testlength() throws Exception { assertEquals(12, a.length()); assertEquals(24, b.length()); assertEquals(36, c.length()); } @Test public void testindexOf() throws Exception { assertEquals(0, a.indexOf("str")); assertEquals(5, b.indexOf("gbu")); assertEquals(8, c.indexOf("ff")); } } public class StringBufferDemo { public static void main(String [] args){ StringBuffer buffer = new StringBuffer(20); buffer.append('S'); buffer.append("tringBuffer"); // System.out.println(buffer.charAt(1)); System.out.println(buffer.capacity()); // System.out.println(buffer.indexOf("tring12345")); System.out.println("buffer = " + buffer.toString()); System.out.println(buffer.length()); } }
2. 2理解并掌握面向对象三要素:封装、继承、多态
(1)封装与继承
封装:使用private关键字将类信息隐藏在类内部,不允许外部程序直接访问、也不允许直接修改,只有读取和赋值。
继承:子类继承父类的特征和行为。
多态:为不同的实体提供统一的接口。
如以下程序:
class Car { private String name;//私有成员,名称 private String color;//私有成员,颜色 private String size;//私有成员,大小 public String getName() { return name; } public String getColor() { return color; } public String getSize() { return size; } public void setName(String name) { this.name = name; } public void setColor(String color) { this.color = color; } public void setSize(String size) { this.size = size; } } public class Test { public static void main(String[] args) { Car b = new Car();//实例化操作 b.setName("兰博基尼");//赋值 b.setColor("紫色"); b.setSize("中型"); //很明显这些过程看不到如何实现。 String name = b.getName();//取值 String color = b.getColor(); String size = b.getSize(); //最后输出结果 System.out.println(name + ":" + color + ":" + size); } }
public class Animal { void shout(){ System.out.println("动物喊叫!"); } } class Dog extends Animal { void shout(){ System.out.println("汪汪汪"); } } class Cat extends Animal { void shout(){ System.out.println("喵喵喵"); } } class Hr extends Animal { void shout(){ System.out.println("hhhhh"); } } class testanmial{ public static void main(String[] args){ Animal dog = new Dog(); dog.shout(); Animal cat = new Cat(); cat.shout(); Animal hr = new Hr(); hr.shout(); } }
简单实现了继承、复写、多态。
2.3 初步掌握UML建模
对测试中的Animal类 My'Util都使用starMUL进行了解读和模型构建。
2.4 完成蓝墨云上 (1)-(5)实验。
如图:
## 3. 实验过程中遇到的问题和解决过程
1.一开始一直没有理解实验三中第三个提交点,感觉很多语句可以写到一起程序会更简单,后来发现,分开写使得程序更加有条理有逻辑。
Factory可以被理解为一种创造正确类型(子)类的策略。
2.程序编写的过程中开始一直报错,各种细节问题,在不断搜索报错原因及利用报错的小红点过程中逐步解决。
3.一开始不会使用starUML,但是通过学习b站和娄老师的帖子学会。
## 其他(感悟、思考等)
本次第一次使用了IDEA集成开发环境,感觉集成开发环境编程效率要高出很多,而且解决问题的效率也有很大提升,报错过程中还会自动给出解决方案。
刚开始做实验整个人完全处于懵的状态,不知从何下手,也不知如何下手。先从娄老师的帖子看起,逐个问题解决的过程中了解到很多也学习到了很多。