一.实验目标概述
本次实验重点在于抽象数据类型(ADT)的设计、规约、测试,并使用面向对象编程(OOP)技术实现 ADT。具体来说:
针对给定的应用问题,从问题描述中识别所需的 ADT;
设计 ADT 规约(pre-condition、post-condition)并评估规约的质量;
根据 ADT 的规约设计测试用例;
ADT 的泛型化;
根据规约设计 ADT 的多种不同的实现;针对每种实现,设计其表示(representation)、表示不变性(rep invariant)、抽象过程(abstraction function)
使用 OOP 实现 ADT,并判定表示不变性是否违反、各实现是否存在表示泄露(rep exposure);
测试 ADT 的实现并评估测试的覆盖度;
使用 ADT 及其实现,为应用问题开发程序;
在测试代码中,能够写出 testing strategy
二.下面是对lab2具体任务的描述:
(一)、Poetic Walks
实现具有标记顶点的Graph,并且实现一个使用单词的图生成诗歌的类,任务大致有以下三部分:
(1)完善Graph接口类,并运用泛型的思想,将String拓展为泛型L类;
(2)实现Graph类的方法:add、set、remove、vertices、sources、targets;
(3)利用实现的Graph类,应用图的思想,实现GraphPoet类,如果输入的文本的两个单词之间存在桥接词,则插入该桥接词;若存在多个单一桥接词,则选取边权重较大者。
- 首先实现edge类
(1)Edge类是不可变的
(2)AF:一条有向边有权重,有起点,有终点
(3)RI:source与target不为空,weight非负
(4)Safety from rep exposure:数据类型不可变且属性私有,每次执行构造函数以及函数返回前,都要checkRep,当获取函数返回前,进行防御拷贝
- 接着实现ConcreteEdgesGraph类
(1) ConcreteEdgesGraph类是不可变的
(2)AF:一个edge的集合,其中各条边是有向的
(3)RI:两点之间最多有一条边,并且权值大于0,而且在边集合中的边也一定在点集中
(4)Safety from rep exposure:数据类型不可变且属性私有,每次执行构造函数以及函数返回前,都要checkRep,当获取函数返回前,进行防御拷贝
3. 首先实现vertex类
(1)vertex类是不可变的
(2)AF:一条有向边有权重,有起点,有终点,用两个map和一个string作为label的方式表示
(3)RI:weight非负,所有在a中作为target的b,在b中a也是作为source的
(4)Safety from rep exposure:数据类型不可变且属性私有,每次执行构造函数以及函数返回前,都要checkRep,当获取函数返回前,进行防御拷贝
4. 接着实现ConcreteVerticiesGraph类
(1) ConcreteVerticiesGraph类是不可变的
(2)AF:一个vertex的集合
(3)RI:每两个点的名字必须不同,而且不能为空
(4)Safety from rep exposure:数据类型不可变且属性私有,每次执行构造函数以及函数返回前,都要checkRep,当获取函数返回前,进行防御拷贝
5.最后实现Graphpoet类
首先,在GraphPoet函数中要实现读取.txt文件中的所有的单词,并将所有相邻的点添加到图中,这些边每出现一次会使得权值加1(初始权值设置为0),读取后检查图是否合法。
其次,在poem函数中对目标字符串进行扩充:首先对读取到的字符找寻每两个单词之间是否存在bridge:即前一个的target集中是否存在一个元素也存在于下一个的source里,这里注意在寻找过程中一定要全部遍历,并且记录其中这样的三个点中间的两条边的权值和,直到找到最大的,若没有则不变化,继续遍历下两个单词的集合。
这个任务难度较大,困难主要面向对象编程的方法需要适应,测试优先的编写策略也需要进一步掌握。
(二)、 Re-implement the Social Network in Lab1
这次任务是为了利用前面构建好的ADT重新编写lab1中的社交网络,任务比较简单,主要是体验ADT的好处。
先实现person类,在类中应该包含姓名和朋友的信息,然后FriendGraph类构建person类之间的关系,通过修改person中的信息即可。
三.其他感想
对于lab2,我最深刻的体会就是ADT真的太伟大了,虽然在ADT的设计编写过程中很复杂,有许多的规约存在,但是确实可以大大方便编程,在这次实验中重写lab1中的任务,明显感觉到了这一点。