本次实验初看让人有点摸不着头脑,先根据模板写测试再编程的顺序在之前完全没见过,但熟悉之后发现效率很高,思路也更清晰,nice
目录
2 实验环境配置
3 实验过程
3.1 Poetic Walks
3.1.1 Get the code and prepare Git repository
3.1.2 Problem 1: Test Graph <String>
3.1.3 Problem 2: Implement Graph <String>
3.1.3.1 Implement ConcreteEdgesGraph
3.1.3.2 Implement ConcreteVerticesGraph
3.1.4 Problem 3: Implement generic Graph<L>
3.1.4.1 Make the implementations generic
3.1.4.2 Implement Graph.empty()
3.1.5 Problem 4: Poetic walks
3.1.5.1 Test GraphPoet
3.1.5.2 Implement GraphPoet
3.1.5.3 Graph poetry slam
3.1.6 使用Eclemma检查测试的代码覆盖度
3.1.7 Before you’re done
3.2 Re-implement the Social Network in Lab1
3.2.1 FriendshipGraph类
3.2.2 Person类
3.2.3 客户端main()
3.2.4 测试用例
3.2.5 提交至Git仓库
4 实验进度记录
5 实验过程中遇到的困难与解决途径
6 实验过程中收获的经验、教训、感想
6.1 实验过程中收获的经验和教训
6.2 针对以下方面的感受
1.实验目标概述
本次实验训练抽象数据类型(ADT)的设计、规约、测试,并使用面向对象编程(OOP)技术实现ADT。具体来说:
l 针对给定的应用问题,从问题描述中识别所需的ADT;
l 设计ADT 规约(pre-condition、post-condition)并评估规约的质量;
l 根据ADT 的规约设计测试用例;
l ADT的泛型化;
l 根据规约设计ADT 的多种不同的实现;针对每种实现,设计其表示(representation)、表示不变性(rep invariant)、抽象过程(abstraction function)
l 使用OOP 实现ADT,并判定表示不变性是否违反、各实现是否存在表示泄露(rep exposure);
l 测试ADT 的实现并评估测试的覆盖度;
l 使用ADT 及其实现,为应用问题开发程序;
l 在测试代码中,能够写出testing strategy 并据此设计测试用例。
2.实验环境配置
IDEA中自带覆盖率测试插件,故无需添加
在这里给出你的GitHub Lab2仓库的URL地址(Lab2-学号)。
https://github.com/ComputerScienceHIT/HIT-Lab2-1190201517
3.实验过程
3.1Poetic Walks
题目给出了一个graph接口,要求我们完成两个描述图的类,其中一个以边为主体,一个以点为主体,并按要求实现接口中的各种方法,最后使用完成的图抽象数据类型完成诗歌生成的功能
3.1.1 Get the code and prepare Git repository
通过控制台命令建立本地git仓库,并用clone指令通过给出的url地址下载指定代码包到git仓库中
3.1.2 Problem 1: Test Graph <String>
思路:首先根据接口的功能描述完成测试程序,测试程序应分别测试接口中给出的各个方法
add:对于点已存在和未存在的情况分别测试,检查输入的点是否在图中。
set:考虑多种情况:边不存在时添加,边已存在时覆盖并返回原权重,权重为0时删除边,权重为负时报错。
remove:点不存在时返回false,点存在时移除该点并返回true,移除后应检查与该点有关的边是否也被移除
vertices:检查点的添加和移除后是否均能正确返回点集
sources和targets:检查添加、移除边后能否正确返回源点集和终点集
3.1.3 Problem 2: Implement Graph <L>
3.1.3.1 Implement ConcreteEdgesGraph
建立ConcreteEdgesGraph类和Egde类,Egde类表示边的状态,ConcreteEdgesGraph类实现接口功能,其中各方法功能如下表:
Edge:
方法 | 功能 |
checkRep | 检查不变性 |
getSource | 返回起始点 |
getTarget | 返回终止点 |
getWeight | 返回权重 |
toString | 按“起始点-权重>终止点”的格式返回表示该边的字符串 |
ConcreteEdgesGraph:
方法 | 功能 |
checkRep | 检查不变性 |
add | 向图中添加一个点,点的名称不可重复 |
set | 向图中添加一条边,若边存在则覆盖旧边并返回旧边权重,边不存在则新建并返回0,当输入权重为0时移除该边,权重为负时报错 |
remove | 移除一个点和该点连接的边,成功移除返回true,边不存在返回false |
vertices | 返回图的所有点构成的集合 |
sources | 返回图中所有作为起始点的点和其边构成的集合 |
targets | 返回图中所有作为终止点的点和其边构成的集合 |
toString | 将图中所有边转化为字符串返回,顺序按照边添加的顺序 |
3.1.3.2 Implement ConcreteVerticesGraph
建立ConcreteVerticesGraph类和Vertex类,Vertex类表示点及其连接状态,ConcreteVerticesGraph类实现接口功能,其中各方法功能如下表:
Vertex:
方法 | 功能 |
checkRep | 检查不变性 |
getVertex | 返回该点名称 |
getSources | 返回指向该点的点集 |
getTargets | 返回该点指向的点集 |
addSources\removeSources | 添加、删除指向该点的边 |
addTargets\removeTargets | 添加、删除该点指向的边 |
toString | 按“起始点-权重>终止点”的格式返回表示该边的字符串 |
ConcreteVerticGraph:
方法 | 功能 |
checkRep | 检查不变性 |
add | 向图中添加一个点,点的名称不可重复 |
set | 向图中添加一条边,若边存在则覆盖旧边并返回旧边权重,边不存在则新建并返回0,当输入权重为0时移除该边,权重为负时报错 |
remove | 移除一个点和该点连接的边,成功移除返回true,边不存在返回false |
vertices | 返回图的所有点构成的集合 |
sources | 返回图中所有作为起始点的点和其边构成的集合 |
targets | 返回图中所有作为终止点的点和其边构成的集合 |
toString | 将图中所有边转化为字符串返回,顺序按照点添加的顺序,每个点按边添加顺序输出以该点为起始点的边 |
3.1.4 Problem 4: Poetic walks
本题要求使用上述图结构,用给定的文件为文本集,连接集合中相邻的词,构建这样的图后,对任意词组成的的字符串,若串中任意两词间在图中存在一个“桥”,就将该桥插入字符串中。
3.1.4.1 Test GraphPoet
根据题目要求,需要对图的构建、字符串的插入进行测试,分情况需测试空文件、标准文件和多行文件的读入、多种权值比较的情况
3.1.4.2 Implement GraphPoet
思路:读入文件时,按空格将文件内容按单词拆分为字符串数组,并按上述结构存入图中作为点集,并以此将相邻的单词连接,每一次相邻使权重加一。
对字符串进行插入时,检查以当前词指向的点中是否有指向下一个词的点,在所有符合条件的点中将权重和最高的点插入两词之间,按此规则遍历字符串并输出结果
3.1.4.5 使用Eclemma检查测试的代码覆盖度
3.2 Re-implement the Social Network in Lab1
和Lab1中的FriendshipGraph类问题类似,只需将其中方法使用本次饰演的Graph结构实现即可
实验过程中收获的经验、教训、感想
实验过程中收获的经验和教训
本次实验遇到了时间规划不合理导致任务积压的问题,下次应为实验分配更合理的时间准备
针对以下方面的感受
1.面向ADT的编程和直接面向应用场景编程,你体会到二者有何差异?
面向ADT编程时任务更加模块化,更好理清思路,对项目管理也有很大帮助
2.使用泛型和不使用泛型的编程,对你来说有何差异?
使用泛型编程可以增加程序的泛用性,但因为此前用的不多,有些不熟悉,需要时间理解
3.在给出ADT的规约后就开始编写测试用例,优势是什么?你是否能够适应这种测试方式?
使测试不受程序影响,更具客观准确性,目前还不太适应
4.P1设计的ADT在多个应用场景下使用,这种复用带来什么好处?
提高了工作效率,使代码具备复用性
5.为ADT撰写specification, invariants, RI, AF,时刻注意ADT是否有rep exposure,这些工作的意义是什么?你是否愿意在以后编程中坚持这么做?
保证了代码的安全性
6.关于本实验的工作量、、deadline。
适中,很合适
7.《软件构造》课程进展难度到目前,你对该课程有何体会和建议?
这门课程更多偏向于实际应用中的项目管理、软件开发等方面,更贴近实际而不是理论