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.2 Re-implement the Social Network in Lab1
本次实验训练抽象数据类型(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 并据此设计测试用例。
- 实验环境配置
简要陈述你配置本次实验所需环境的过程,必要时可以给出屏幕截图。
特别是要记录配置过程中遇到的问题和困难,以及如何解决的。
本次实验需要在eclipse中配置EclEmma,于是去市场上下载并安装即可。
在这里给出你的GitHub Lab2仓库的URL地址(Lab2-学号)。
请仔细对照实验手册,针对三个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。
给出了一个接口,我们需要建立两个类分别继承,并且实现一系列方法以及抽象数据型(边与点),并用这个图完成诗意漫步的要求。
-
-
- Get the code and prepare Git repository
-
如何从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发。
先从实验手册中阅读http://web.mit.edu/6.031/www/sp17/psets/ps2/并且获取相关代码。首先clone代码文件并建立本地库,随后导入eclipse进行开发。
以下各部分,请按照MIT页面上相应部分的要求,逐项列出你的设计和实现思路/过程/结果。
思路:针对Graph<String>设计测试策略,对里面的每个方法进行等价类划分测试。
过程:
结果:
以下各部分,请按照MIT页面上相应部分的要求,逐项列出你的设计和实现思路/过程/结果。
EDGE:
思路:getw:返回边权;
Gets:返回有向边起点;
gett:返回有向边终点;
toString:连接成字符串
checkrep:只需要检查边权大于零,且起点终点存在。
过程:
应该有边权,有向边起点终点,定义如下:
函数:
AF,RI和Safety from rep exposure如下:
测试:只需要测试各个函数返回值即可。
ConcreteEdgesGraph<L>:
思路:checkrep:只需要检查每条边边权大于零且每条边的起点终点都在起点终点集合里。
add:首先判断加入点是否重复,若重复返回false,若不重复则加入点集并返回true;
set:对输入的权值分类讨论,若为0,则先通过匹配起点终点的方式寻找边,若找到,则old记录之前的权,然后将边删去,若未找到,则old为0;若>0,则以同样的方式找边,old记录之前的权,然后删去旧边,再加入新边,若未找到,old为0,加入新边;若<0,返回-1,输出错误信息。然后返回old。
remove:先判断有无该点,若无,返回false;若有,从点集中移除该点,然后寻找所有起点或终点为该点的边,一一删除,返回true;
vertices:返回点集(保护性复制);
Sources:寻找每一个终点为输入的边,记录。
Targets:同上。
toString:连成字符串。
应有点集与边集:
函数:
检测各个各个变量是否符合规范:
AF,RI和Safety from rep exposure如下:
测试:继承Graph的测试策略。
结果:
3.1.3.2Implement ConcreteVerticesGraph
Vertices:
思路:getname:返回名字即可
Addt:对权分类,为0,则将t移除,并取得old,若old为null,则为0;大于零,old等于原值,将新的数据put进去,若old为null,变为0;若小于0,返回-1,输出错误。
adds:同上。
checkrep:检测边权是否大于0
alls:返回zhongdian;
Allt:返回zhongdian;
toString:连接成字符串;
过程:
应有名字、以之为起点的所有点、一直为终点所有点
函数:
检测边权一直大于零:
AF,RI和Safety from rep exposure如下:
测试:
对函数一个个进行测试:
ConcreteVerticesGraph
思路:大体思路如concreteEdgeGraph类。少部分函数有所改动:
set:只需用adds与addt函数更新相应的点的信息即可;
Remove:用adds删除;
Targets与sources函数用alls以及allt获得返回信息。
Checkrep:检验点集不变即可(因为若重复则无法加入,会直接返回false)
需要有点集:
函数:
检验点集不变:
AF,RI和Safety from rep exposure如下:
测试:继承Graph测试策略即可。
结果:
需要按要求将所有String都变为L;
思路:使用泛型实现即可
过程:将String全部修改为L,并加入<L>传递参数。
结果:修改后的代码本身即是。
我使用的是concreteEdgeGraph:
利用之前实现的图将语料库转化为该种图结构,并且按要求完成对输入的句子进行扩充。
思路:对每个函数进行测试;
过程:
结果:
思路:GraphPoeT:通过readline读取一行并用split(“ ”)分割成字符串数组,并且按顺序加入LIST,然后每对相邻单词读取之前的权并删去之前的边然后把旧边权加一作为新边权重新加入边。
poem:对输入中每两个相邻的单词,搜寻有没有图中单词符合“桥”若有,则将两条边权之和和m比较,若大于,则更新m。然后找出最大的m,并将相应的“桥”加入,然后循环结束加上最后一个输入中的字符串。
toString:连成字符串。
过程:
需要先定义一个图:
函数:
AF,RI和Safety from rep exposure如下:
结果:
请按照http://web.mit.edu/6.031/www/sp17/psets/ps2/#before_youre_done的说明,检查你的程序。
如何通过Git提交当前版本到GitHub上你的Lab2仓库。
通过GIT的add\commit\push origin master指令进行上传
在这里给出你的项目的目录结构树状示意图。
基于在Poetic Walks中定义的Graph<L>及其两种实现,重新实现Lab1中的FriendshipGraph类。
思路:根据要求修改LAB1中的类:
All:返回所有人
addVertex:加入人
addEdge:加入新边
getDistance:通过与LAB1中相同的广度优先搜索获得最小路径。
过程:
定义变量:
函数:
main函数与LAB1相同。
AF,RI和Safety from rep exposure如下:
结果:
思路:根据要求修改LAB1:
构造函数判断是否重复。
过程:
定义变量:
函数:
AF,RI和Safety from rep exposure如下:
思路:与LAB1相同即可。
结果:
思路:修改LAB1中的测试即可。
过程:
结果:
如何通过Git提交当前版本到GitHub上你的Lab3仓库。
通过GIT的add\commit\push origin master指令进行上传
在这里给出你的项目的目录结构树状示意图。
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。
不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。
日期 | 时间段 | 计划任务 | 实际完成情况 |
6.9 | 19:00-21:30 | P1中concreteEdgesGraph | 完成 |
6.9 | 21:30-24:00 | P1中concreteVerticesGraph | 完成 |
6.10 | 18:00-19:30 | 诗意漫步 | 完成 |
19:30-22:00 | 前两个类的测试 | 完成 | |
6.10 | 22:00-23:30 | P1其余测试 | 完成 |
6.11 | 7:00-10:00 | P2 | 完成 |
- 实验过程中遇到的困难与解决途径
遇到的难点 | 解决途径 |
遇见AF等不清楚什么意思
| 看PPT学习 |
不理解泛型、继承等概念
| 学习慕课 |
用==时有些地方出错
| 改为用.equal()方法 |
- 实验过程中收获的经验、教训、感想
- 实验过程中收获的经验和教训
在对于JAVA语言仍旧不熟悉的情况下,需要大量精力自行学习继承等概念,对于AF、REP泄露等也有了更深的理解。还需要练习。
- 面向ADT的编程和直接面向应用场景编程,你体会到二者有何差异?
面向对象更多关注类的属性与方法。
- 使用泛型和不使用泛型的编程,对你来说有何差异?
泛型能够适应更多情况。
- 在给出ADT的规约后就开始编写测试用例,优势是什么?你是否能够适应这种测试方式?
能够及时检查代码正确性,还需要磨合。
- P1设计的ADT在多个应用场景下使用,这种复用带来什么好处?
减少重复性编程。
- P3要求你从0开始设计ADT并使用它们完成一个具体应用,你是否已适应从具体应用场景到ADT的“抽象映射”?相比起P1给出了ADT非常明确的rep和方法、ADT之间的逻辑关系,P3要求你自主设计这些内容,你的感受如何?
渐渐能。我们没有要求p3.
- 为ADT撰写specification, invariants, RI, AF,时刻注意ADT是否有rep exposure,这些工作的意义是什么?你是否愿意在以后编程中坚持这么做?
保证程序的健壮性。愿意。
- 关于本实验的工作量、难度、deadline。
工作量大,难度尚可,主要写注释、测试等花费大量时间。这次deadline较为宽松。
- 《软件构造》课程进展到目前,你对该课程有何体会和建议?
要是有中文PPT就好了。让我对保证程序健壮性、保护内部数据以及测试等价等方面有了更多理解,更加熟悉面向对象的编程方式。