# 20202309 2021-2022-1 《数据结构与面向对象程序设计》实验3报告
课程:《程序设计与数据结构》
班级: 2023
姓名: 葛鹏宇
学号:20202309实验教师:王志强 实验日期:2020年10月7日
必修/选修: 必修
## 1.实验内容
(1)初步掌握单元测试和TDD
(2)理解并掌握面向对象三要素:封装、继承、多态
(3)初步掌握UML建模
(4)完成蓝墨云上 (1)-(5)实验。
## 2. 实验过程及结果
1)初步掌握单元测试和TDD
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如Java里单元指一个类。
先写测试代码,然后再写产品代码的开发方法叫“测试驱动开发”(TDD)。TDD的一般步骤如下:明确当前要完成的功能,记录成一个测试列表;快速完成编写针对此功能的测试用例;测试代码编译不通过(没产品代码呢);编写产品代码;测试通过;对代码进行重构,并保证测试通过(重构下次实验练习);循环完成所有功能的开发。基于TDD,我们不会出现过度设计的情况,需求通过测试用例表达出来了,我们的产品代码只要让测试通过就可以了。
2)理解并掌握面向对象三要素:封装、继承、多态
封装(Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。
封装继承:
多态:
3)初步掌握UML建模
StarUML是一种生成类图和其他类型的统一建模语言(UML)图表的工具。
4)完成蓝墨云上 (1)-(5)实验
实验一:
任务详情
参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST
参考http://www.cnblogs.com/rocedu/p/6736847.html
提交最后三个测试用例都通过的截图,截图上要有画图加水印,输入自己的学号。
实验二:
任务详情
参考积极主动敲代码,使用JUnit学习Java(http://www.cnblogs.com/rocedu/p/4837092.html)
参考http://www.cnblogs.com/rocedu/p/6736847.html
以 TDD的方式研究学习StringBuffer,提交你的单元测试用例和测试通过的截图,截图要加上学号水印。
实验三:
任务详情
实验三 Java面向对象程序设计(http://www.cnblogs.com/rocedu/p/4472842.html)
参考http://www.cnblogs.com/rocedu/p/6736847.html
对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式
用自己的学号%6进行取余运算,根据结果进行代码扩充:
0:让系统支持Byte类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
1:让系统支持Short类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
2:让系统支持Boolean类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
3:让系统支持Long类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
4:让系统支持Float类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
5:让系统支持Double类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
1 abstract class Data { 2 3 abstract public void DisplayValue(); 4 5 } 6 7 class Byte extends Data { 8 9 byte value; 10 11 Byte() { 12 13 value=20202309%6; 14 15 } 16 17 public void DisplayValue(){ 18 19 System.out.println (value); 20 21 } 22 23 } 24 25 class Short extends Data { 26 27 short value; 28 29 Short() { 30 31 value=20202309%6; 32 33 } 34 35 public void DisplayValue(){ 36 37 System.out.println (value); 38 39 } 40 41 } 42 43 class Boolean extends Data { 44 45 boolean value; 46 47 Boolean() { 48 49 value=20202309%6==9; 50 51 } 52 53 public void DisplayValue(){ 54 55 System.out.println (value); 56 57 } 58 59 } 60 61 class Long extends Data { 62 63 long value; 64 65 Long() { 66 67 value=20202309; 68 69 } 70 71 public void DisplayValue(){ 72 73 System.out.println (value); 74 75 } 76 77 } 78 79 class Float extends Data { 80 81 float value; 82 83 Float() { 84 85 value=20202309%6; 86 87 } 88 89 public void DisplayValue(){ 90 91 System.out.println (value); 92 93 } 94 95 } 96 97 class Double extends Data { 98 99 double value; 100 101 Double() { 102 103 value=20202309%6; 104 105 } 106 107 public void DisplayValue(){ 108 109 System.out.println (value); 110 111 } 112 113 } 114 115 // Pattern Classes 116 117 abstract class Factory { 118 119 abstract public Data CreateDataObject(); 120 121 } 122 123 124 125 class ByteFactory extends Factory { 126 127 public Data CreateDataObject(){ 128 129 return new Byte(); 130 131 } 132 133 } 134 135 class ShortFactory extends Factory { 136 137 public Data CreateDataObject(){ 138 139 return new Short(); 140 141 } 142 143 } 144 145 class BoolenFactory extends Factory { 146 147 public Data CreateDataObject(){ 148 149 return new Boolean(); 150 151 } 152 153 } 154 155 class LongFactory extends Factory { 156 157 public Data CreateDataObject(){ 158 159 return new Long(); 160 161 } 162 163 } 164 165 class FloatFactory extends Factory { 166 167 public Data CreateDataObject(){ 168 169 return new Float(); 170 171 } 172 173 } 174 175 class DoubletFactory extends Factory { 176 177 public Data CreateDataObject(){ 178 179 return new Double(); 180 181 } 182 183 } 184 185 //Client classes 186 187 class Document { 188 189 Data x; 190 191 Document(Factory q){ 192 193 x = q.CreateDataObject(); 194 195 } 196 197 public void DisplayData(){ 198 199 x.DisplayValue(); 200 201 } 202 203 } 204 205 //Test class 206 207 public class MyDoc { 208 209 static Document a,b,c,d,e,f; 210 211 public static void main(String[] args) { 212 213 a = new Document(new ByteFactory()); 214 215 a.DisplayData(); 216 217 b = new Document(new ShortFactory()); 218 219 b.DisplayData(); 220 221 c = new Document(new BoolenFactory()); 222 223 c.DisplayData(); 224 225 d = new Document(new LongFactory()); 226 227 d.DisplayData(); 228 229 e = new Document(new FloatFactory()); 230 231 e.DisplayData(); 232 233 f = new Document(new DoubletFactory()); 234 235 f.DisplayData(); 236 237 } 238 239 }
实验四:
任务详情
提交:单元测试代码和运行成功截图及码云上代码链接,截图要加上学号水印
参考http://www.cnblogs.com/rocedu/p/6736847.html
任务:以TDD的方式开发一个复数类Complex,要求如下:
// 定义属性并生成getter,setter
double RealPart;
double ImagePart;
码云链接:
https://gitee.com/gpy11111/gpy20202309./blob/master/Complex
https://gitee.com/gpy11111/gpy20202309./blob/master/ComplexTest
实验五:
任务详情
使用[WhiteStarUML](http://whitestaruml.sourceforge.net/)对实验二中的代码进行建模,发类图的截图,加上学号水印。
参考http://www.cnblogs.com/rocedu/p/6736847.html
类图中只少两个类。
## 3. 实验过程中遇到的问题和解决过程
- 问题1:云班课实验二中,在按照博客园idea简易教程安装完成junit后,@test语句和后面的方法名红色字体没有变化。
- 问题1解决方案:在建立test文件时没有注意到需要通过make dictionaryasàtest source root,而是直接在src文件夹中建立了test文件,在按照上述方法建立test文件后红色消失,程序可以正常运行。
- 问题2: 使用staruml时箭头方向和箭头种类选用错误。
- 问题2解决方案: 使用staruml建模次数不多,操作不够熟练,通过网上学习不同箭头的含义,以及建立类后不同类间怎么连接箭头,完成了对Data.java文件的建模。
## 其他(感悟、思考等)
单元测试和TDD能很好的检测程序是否运行有不妥之处,我可以将这种方法利用在以后编程的程序中,让自己的程序更加合理。Uml建模能将代码图示化地反映出来,比起埋在一堆文字中去看代码,uml能让人更清晰地读懂代码。这次实验任务多且复杂,很多地方我还不了解一些操作的方法,耗费了许多时间在网上查找资料,但是通过自己动手学习也收获了很多Java编程的基本技巧。
## 参考资料
- [《Java程序设计与数据结构教程(第四版)》]