3.1 Poetic Walks
使用已给出的接口,和程序框架,补全代码,实现两种方法构造图、测试策略、测试文件。
(1)完善Graph接口类,将String拓展为泛型L类;
(2)实现Graph类的各种方法:add、set、remove、vertices、sources、targets;
(3)利用实现的Graph类,选择边或点实现GraphPoet类,实现如下功能:如果输入的文本的两个单词之间在构成的图中存在另一个单词,则插入该单词词;若存在多个满足条件的词,则选权较大者。
3.1.1 Get the code and prepare Git repository
在git bash中使用pull和clone的命令下载到本地。
Git init
Git remote add origin github.com/ComputerScienceHIT/HIT-Lab2-1190202001
Git pull origin master
Git add .
Git commit -m “xxx”
Git push origin master
3.1.2 Problem 1: Test Graph
测试策略编写测试文件,编写测试用例主要利用等价类划分的思想进行编写,测试策略如下:
编写覆盖以上策略的测试用例:
测试add方法:
测试set方法:
测试remove方法:
测试sources和target方法:
测试vertices方法:
测试toString方法:
3.1.3 Problem 2: Implement Graph
3.1.3.1 Implement ConcreteEdgesGraph
① Edge类:
关于AF,RI和rep exposure:
包括私人域、读取方法、修改权重方法、toString方法。
② 实现ConcreteEdgeGraph.java
关于AF,RI和rep exposure:
域:
checkRep:
add:
set: 输入source,target,weight,确定一条有向边。
具体做法:
(1)遍历edges,如果已经存在从source到target的一条边,记下这条边的权值,创建一条新的边(参数为source,target,weight),返回旧边权;
(2)如果不存在,新建一条边(参数为source,target,weight),将其加入边集edges,返回0。
remove:遍历点集、不存在则返回false;存在则删除与点相连的边。
vertices:复制一份vertices到新Set中,返回这个Set
source&target:
建立一个空Map,遍历edges,找出以target为终点的边edge;
weight=0时表示该边不存在,跳过;
将edge.source->edge.weight加入Map,遍历结束后返回这个Map
target方法同理
toString:打印所有的边
fictions: 测试结果:
覆盖率:
3.1.3.2 Implement ConcreteVerticesGraph
① Vertex类:
域:点(标签)、与此点相连的边(Map类型<边终点,权重>:
关于AF,RI和rep exposure:
Constructor、方法、checkRep、toString:
② ConcreteVerticesGraph:
域(点列表)&关于AF,RI和rep exposure:
checkRep:
Add方法:遍历点列表,如果发现已存在,返回false;如果发现未存在,返回true并将其加入点列表。
Set方法:遍历是否已经存在边,存在则删除旧边,返回旧权重;然后新建边,赋值新权重。
Remove方法:遍历点列表,如果发现有点或者有点指向的点为方法输入对应的点,对边进行相应删除。
Vertices方法:
复制点列表中的元素到一个集合中去,返回此集合
source&target方法:
source:遍历点集,如果存在某一点指向参数target,将该点和对应边的权重加入(Map)sour
target:返回此点的gettarget。
Fictions: 测试结果:
覆盖率:
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
域& AF,RI和rep exposure:
CheckRep:
文件读入方法(生成图):
通过文件分行读入的方式,先把各个单词按照顺序存在字符串数组中,再将字符串数组中的字符串作为节点,下一个字符长度作为边权值生成图。
诗句扩容方法:
将输入句子拆分成一个字符串数组,在每两个元素之间根据生成的图寻找是否存在一个节点在两个元素之间,如果存在则插入,如果存在多个则选两条边权重之和最大的。
3.1.5.3 Graph poetry slam
3.1.6 Before you’re done
请按照http://web.mit.edu/6.031/www/sp17/psets/ps2/#before_youre_done的说明,检查你的程序。
如何通过Git提交当前版本到GitHub上你的Lab2仓库。
在这里给出你的项目的目录结构树状示意图。
3.2 Re-implement the Social Network in Lab1
基于之前在 Poetic Walks 中定义的 Graph及其两种实现,重新实现 Lab1 中的 FriendshipGraph 类。
3.2.1 FriendshipGraph类
利用graph表示用户之间的关系。
addVertex ()表示添加顶点。
addEdge ()表示添加边,更新好友列表。
Getdistance()用来寻找最短路径并返回长度(与Lab1相同)。
3.2.2 Person类
与Lab1相同。
3.2.3 客户端main()
与Lab1相同。
3.2.4 测试用例
与Lab1相同(测试加入点方法、加入边方法、寻找最短路径方法)。
3.2.5 提交至Git仓库
如何通过Git提交当前版本到GitHub上你的Lab3仓库。
在这里给出你的项目的目录结构树状示意图。
4 实验进度记录
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。
不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。
日期 时间段 计划任务 实际完成情况
6.7 12:00~22:00 阅读实验要求和代码框架,学习相关java知识 如期完成
6.10 24:00~8:00 编写代码 如期完成
6.12 12:00~15:00 编写实验报告 如期完成
5 实验过程中遇到的困难与解决途径
遇到的难点 解决途径
接口复杂,阅读困难 专心阅读
MIT任务网页英语翻译困难 查多个词典、合理联想
泛型实现遇到障碍 查阅java相关书籍
6 实验过程中收获的经验、教训、感想
6.1 实验过程中收获的经验和教训
学会了抽象数据类型(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 并据此设计测试用例。
6.2 针对以下方面的感受
(1) 面向ADT的编程和直接面向应用场景编程,你体会到二者有何差异?
差异:在ADT的复用中,不仅仅是像面向场景的编程的函数的复用,ADT能够复用数据结构和一系列方法,就像c语言,多个程序复用性更低;
(2) 使用泛型和不使用泛型的编程,对你来说有何差异?
泛型的使用使程序编写更加自如。
(3) 在给出ADT的规约后就开始编写测试用例,优势是什么?你是否能够适应这种测试方式?
可以根据规约进行测试用例的编写,提高覆盖率。能
(4) P1设计的ADT在多个应用场景下使用,这种复用带来什么好处?
复用的好处就是能够利用接口、泛型等,能够通过较少的代码实现复杂的应用与功能;复用也会提高代码的可读性。
(5) 为ADT撰写specification, invariants, RI, AF,时刻注意ADT是否有rep exposure,这些工作的意义是什么?你是否愿意在以后编程中坚持这么做?
时刻提醒编程者要注意表示泄露等问题,这些工作能够为在一定程度上指导编程的进行,提高编程效率。会。
(6) 关于本实验的工作量、难度、deadline。
合理
(7) 《软件构造》课程进展到目前,你对该课程有何体会和建议?
挺好