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仓库关联
在这里给出你的GitHub Lab2仓库的URL地址(Lab2-学号)。
3. 实验过程
请仔细对照实验手册,针对三个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。
3.1. Poetic Walks
该任务主要是ADT的内容,要自己实现一个有向图的抽象数据类型,在实验中要掌握AF RI 和rep等概念
3.1.1. Get the code and prepare Git repository
直接从老师发的github的链接中获取实验代码,将其导入到本地工程中
之后在项目文件夹建立本地仓库
在idea中创建项目,然后建立本地仓库
再将本地仓库与GitHub仓库关联
3.1.2. Problem 1: Test Graph <String>
3.1.2.1. 测试add
分成三种情况讨论
(空)
(非空,同点)
(非空,不同点)
用contains()和size()保证图的点集正确
3.1.2.2. 测试set函数
/**
* 测试set函数
* 测试策略:
* weight: 0、非0
* source:已存在、不存在
* target:已存在、不存在
* 原来的source与target之间:有边、无边
*/
做一个比较详尽的测试·,尽量覆盖所有可能,主要关注对不存在的点和边的操作
要用contains去看有没有缺少或多出来点,边的多少通过下一个set()的结果反映
3.1.2.3. 测试remove函数
/**
* 测试remove函数
* 该点:存在、不存在
* 与该点邻接的边:存在、不存在
*/
注意不要用source和target函数等还没测的函数,否则出错了可能看不出来是哪里的问题
用已经测试过的set更好
3.1.2.4. 测试vertices
/**
*测试vertices函数
*测试策略:
* 点集:为空 ,一个点,多个点
*/
尤其要注意测试是否有表示泄露,是否是immutable的
3.1.2.5. 测试Sources
注意测试边的方向相反的边是否会引起不该有的增加
3.1.2.6. 测试targets
测试方法同上
测试结果(后补充):
3.1.3. Problem 2: Implement Graph <String>
以下各部分,请按照MIT页面上相应部分的要求,逐项列出你的设计和实现思路/过程/结果。
3.1.3.1. Implement ConcreteEdgesGraph
Edge类的实现
AF:
RI:
Rep exposure:
构造器:
普普通通,符合RI即可
由于Edge类要求是immutable类型的,所以类中所有成员都必须是final关键字标识的
由于graph中的set可能涉及到更改边的权值,所以在edge实现了判断同一条边的函数,这里和equals是不同的 不比较weight
实现sameedge:
实现equals
Edge类中要求保持的不变量为:
Target与source不为null且不相等,然后权值大于0
利用checkrep判断
剩下的几个method 都比较简单,都不加赘述了
ConcretEdgeGraph类的实现
AF:
RI:
Rep exposure
checkRep
关键是要调用上面的egde里的sameEdge来检查没有相同的重复边
由于是set 不用关心有没有重复的点
set实现:
完成删边操作 对不存在的边也返回0
加边和调整放在一起实现
这里注意到要顺便把可能的重复边也删了
remove实现:
先去边再去点,注意不能foreach 有改动
用i来遍历 i--
vertices()实现
注意防御性拷贝
sources()实现
ta