20202306 实验三《 面向对象程序设计 》实验报告

 # 20202306 2021-2022-1 《数据结构与面向对象程序设计》实验三报告

课程:《程序设计与数据结构》
班级: 2023
姓名: 李金城
学号:20202306
实验教师:王志强
实验日期:2021年10月10日
必修/选修: 必修

## 1.实验内容

1. 初步掌握单元测试和TDD

2. 理解并掌握面向对象三要素:封装、继承、多态

3. 初步掌握UML建模

4. 完成蓝墨云上 (1)-(5)实验。


## 2. 实验过程及结果

一、初步掌握单元测试和TDD

1、TDD:测试驱动开发(Test-Driven Development)的英文简称,是敏捷开发中的一项核心实践和技术,也是一种设计方法论。TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。

2、基本格式:以蓝墨云实验(1)的test为例

 1 import org.junit.Test;
 2 import junit.framework.TestCase;
 3 
 4 public class MyUtilTest extends TestCase {
 5     @Test
 6     public void testNormal(){
 7         assertEquals("不及格", MyUtil.percantage2fivergrade(55));
 8         assertEquals("及格", MyUtil.percantage2fivergrade(65));
 9         assertEquals("中等",MyUtil.percantage2fivergrade(75));
10         assertEquals("良好",MyUtil.percantage2fivergrade(85));
11         assertEquals("优秀",MyUtil.percantage2fivergrade(95));
12     }
13     @Test
14     public void testException() {
15         assertEquals("错误", MyUtil.percantage2fivergrade(105));
16         assertEquals("错误", MyUtil.percantage2fivergrade(-55));
17     }
18         @Test
19     public void testBoundary(){
20         assertEquals("不及格",MyUtil.percantage2fivergrade(0));
21         assertEquals("及格",MyUtil.percantage2fivergrade(60));
22         assertEquals("中等",MyUtil.percantage2fivergrade(70));
23         assertEquals("良好",MyUtil.percantage2fivergrade(80));
24         assertEquals("优秀",MyUtil.percantage2fivergrade(90));
25         assertEquals("优秀",MyUtil.percantage2fivergrade(100));
26     }
27 
28     private class MyUtil {
29         public static String percantage2fivergrade(int grade) {
30             //如果成绩小于0,则为”错误“
31             if (grade < 0)
32                 return "错误";
33                 //如果成绩小于60,则为“不及格”
34             else if (grade < 60)
35                 return "不及格";
36                 //如果成绩介于60至70分之间,则为“及格”
37             else if (grade < 70)
38                 return "及格";
39                 //如果成绩介于70至80分之间,则为“中等”
40             else if (grade < 80)
41                 return "中等";
42                 //如果成绩介于80至90分之间,则为“良好”
43             else if (grade < 90)
44                 return "良好";
45                 //如果成绩介于90至100分之间,则为“优秀”
46             else if (grade <= 100)
47                 return "优秀";
48                 //如果成绩大于100,则为“错误”
49             else
50                 return "错误";
51         }
52     }
53 }

二、理解并掌握面向对象三要素:封装、继承、多态

(一)理解和定义

  1、封装:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。在电子方面,封装是指把硅片上的电路管脚,用导线接引到外部接头处,以便与其它器件连接。

  2、继承:继承是面向对象语言的重要机制。借助继承,可以扩展原有的代码,应用到其他程序中,而不必重新编写这些代码。在java语言中,继承是通过扩展原有的类,声明新类来实现的。扩展声明的新类称为子类,原有的类称为父类。继承机制规定,子类可以拥有父类的所有属性和方法,也可以扩展定义自己特有的属性,增加新方法和重新定义父类的方法。

  3、多态:指为不同数据类型的实体提供统一的接口。

(二)应用示例:

 1 abstract class Data {
 2     abstract public void DisplayValue();
 3 }
 4 class Integer extends Data {
 5     int value;
 6     Integer() {
 7         value=100;
 8     }
 9     public void DisplayValue(){
10         System.out.println (value);
11     }
12 }
13 class Long extends Data {
14     long value;
15     Long() {
16         value=(long)20202306;
17     }
18     public void DisplayValue(){
19         System.out.println (value);
20     }
21 }
22 class Byte extends Data {
23     byte value;
24     Byte() {
25         value=(byte)20202306;
26     }
27     public void DisplayValue(){
28         System.out.println (value);
29     }
30 }
31 abstract class Factory {
32     abstract public Data CreateDataObject();
33 }
34 class IntFactory extends Factory {
35     public Data CreateDataObject(){
36         return new Integer();
37     }
38 }
39 class LongFactory extends Factory {
40     public Data CreateDataObject(){
41         return new Long();
42     }
43 }
44 class ByteFactory extends Factory {
45     public Data CreateDataObject(){
46         return new Byte();
47     }
48 }
49 class Document {
50     Data data;
51     Document(Factory factory){
52         data = factory.CreateDataObject();
53     }
54     public void DisplayData(){
55         data.DisplayValue();
56 
57     }
58 }
59 public class MyDoc {
60     static Document d;
61     static Document c;
62     public static void main(String[] args) {
63         d = new Document(new ByteFactory());
64         d.DisplayData();
65         c = new Document(new LongFactory());
66         c.DisplayData();
67     }
68 }


三、 初步掌握UML建模

1、什么是UML:统一建模语言(Unified Modeling Language,UML)是一种为面对对象系统的产品进行说明、可视化和编制文档的一种标准语言,是非专利的第三代建模和规约语言。UML是面向对象设计的建模工具,独立于任何具体程序设计语言。

2、用StarUML软件完成StringBufferDemo程序的建模:

StarUML软件

 建模示例


四、 完成蓝墨云上 (1)-(5)实验。

 1、蓝墨云实验(1):提交最后三个测试用例都通过的截图,截图上要有画图加水印,输入自己的学号。

 

 

 

 2、蓝墨云实验(2):以 TDD的方式研究学习StringBuffer,提交你的单元测试用例和测试通过的截图,截图要加上学号水印。

 3、蓝墨云实验(3):对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式 用自己的学号%6进行取余运算,根据结果进行代码扩充:

  0:让系统支持Byte类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印

  1:让系统支持Short类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印

  2:让系统支持Boolean类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印

  3:让系统支持Long类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印

  4:让系统支持Float类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印

  5:让系统支持Double类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印

 

 4、蓝墨云实验(4):任务:以TDD的方式开发一个复数类Complex,要求如下: // 定义属性并生成getter,setter double RealPart; double ImagePart

 

 5、蓝墨云实验(5):对实验二中的代码进行建模,发类图的截图,加上学号水印。

 

## 3. 实验过程中遇到的问题和解决过程
- 问题1:主类经常出现找不到或无法加载等情况。
- 问题1解决方案:重新启动,清除缓存区或调整配置路径,检查是否是代码错误。
- 问题2:TDD无法辨认@Test等字符。
- 问题2解决方案:根据“小灯泡”的提示,更换为Junit4或调整Test的配置路径。


## 其他(感悟、思考等)
 至此,Java终于进入面对对象的环节了,与C语言不同的是,它有很多未学到的代码的使用,也因此有很多新鲜的知识需要不断的更新掌握。IDEA软件对于配置有极严格的要求,尤其是即使代码没有错误,其系统依然会报错,很考验码眼力的耐心。Java的学习逐渐进入白热化,知识更需要课下巩固或者参考其他教学资源进行重复性的学习和实验,对于程序的学习,多敲代码才是叩开门扉的真正秘诀!
  
## 参考资料

-  [《Java程序设计与数据结构教程(第二版)》](https://book.douban.com/subject/26851579/)

-  [《Java程序设计与数据结构教程(第二版)》学习指导](http://www.cnblogs.com/rocedu/p/5182332.html)

- http://www.cnblogs.com/rocedu/p/6736847.html

- http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST

posted @ 2021-10-09 18:55  20202306李金城  阅读(563)  评论(0编辑  收藏  举报