目录
1 实验目标概述 1
2 实验环境配置 1
3 实验过程 1
3.1 Poetic Walks 1
3.1.1 Get the code and prepare Git repository 1
3.1.2 Problem 1: Test Graph 1
3.1.3 Problem 2: Implement Graph 1
3.1.3.1 Implement ConcreteEdgesGraph 2
3.1.3.2 Implement ConcreteVerticesGraph 2
3.1.4 Problem 3: Implement generic Graph 2
3.1.4.1 Make the implementations generic 2
3.1.4.2 Implement Graph.empty() 2
3.1.5 Problem 4: Poetic walks 2
3.1.5.1 Test GraphPoet 2
3.1.5.2 Implement GraphPoet 2
3.1.5.3 Graph poetry slam 2
3.1.6 Before you’re done 2
3.2 Re-implement the Social Network in Lab1 2
3.2.1 FriendshipGraph类 2
3.2.2 Person类 3
3.2.3 客户端main() 3
3.2.4 测试用例 3
3.2.5 提交至Git仓库 3
4 实验进度记录 3
5 实验过程中遇到的困难与解决途径 3
6 实验过程中收获的经验、教训、感想 4
6.1 实验过程中收获的经验和教训 4
6.2 针对以下方面的感受 4
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
2实验环境配置
简要陈述你配置本次实验所需环境的过程,必要时可以给出屏幕截图。
特别是要记录配置过程中遇到的问题和困难,以及如何解决的。
本次实验主要需要配置EclEmma。我采用的方法是在eclipse中的Help->Eclipse Marketplace中搜索EclEmma,然后在搜索结果中选择安装即可。
![](https://img-blog.csdnimg.cn/20210705160736304.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d1aWd1Z3U=,size_16,color_FFFFFF,t_70
安装完成后,我发现在上方的图标中并没有coverage的图标,经过查找得知需要在Windows->Customize Perspective中勾选Java Code Coverage选项,勾选之后相应的按钮就出现了。
在这里给出你的GitHub Lab2仓库的URL地址(Lab2-学号)。
3实验过程
请仔细对照实验手册,针对两个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。
3.1Poetic Walks
在这里简要概述你对该任务的理解。
该任务主要要求我们完善graph接口的各个方法,包括add、set、remove、vertices、sources、targets等。再完善实现了graph接口的ConcreteEdgesGraph类和ConcreteVerticesGraph类中的一些内容和方法。之后再编写GraphInstanceTest测试类,再补充和完善继承了GraphInstanceTest测试类的ConcreteEdgesGraphTest测试类和ConcreteVerticesGraphTest测试类。最后还要进行测试,并通过EclEmma来检查覆盖度。
3.1.1Get the code and prepare Git repository
如何从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发。
选择项目所在的文件夹,右键点击后选择git bash here,之后输入git init完成仓库的初始化和建立。
之后输入git remote add origin https://github.com/ComputerScienceHIT/HIT-Lab2-190110513来完成仓库的连接。
之后通过git config –global user.name “xxx”和
git config –global user.email “335771063@qq.com”来完成认证。
然后输入git add .再输入git commit -m “xxx”最后输入git push -u origin master即可完成上传。
3.1.2Problem 1: Test Graph
以下各部分,请按照MIT页面上相应部分的要求,逐项列出你的设计和实现思路/过程/结果。
首先编写graph的各种测试方法。
测试是否是空图
测试加入顶点的方法
测试set方法
测试remove方法
测试返回顶点集的vertices()方法
测试返回源点集的sources()方法
测试返回下一点集的targets()方法
3.1.3Problem 2: Implement Graph
以下各部分,请按照MIT页面上相应部分的要求,逐项列出你的设计和实现思路/过程/结果。
3.1.3.1Implement ConcreteEdgesGraph
checkRep()方法首先检查顶点集是否为空,再检查是否有空节点加入。之后检查边是否不为空且权值都大于零,再检查是否有没有源点或终点的野边。
add方法是加入点的方法,如果原本就包含该点则返回false,否则加入该点并返回true。
set方法设置边。当weight不为零时,如果边存在则更新边的长度为weight值,若边不存在则加入边且权值为weight。当weight为零时则删除对应边。
remove方法删除点,如果点不存在则返回false,否则删除该点以及点的出边和入边并返回true。
vertices()方法返回图的顶点集。
sources(L target)方法返回target对应的源点。
targets(L source)方法返回source对应的下一个点。
Edge类包含边的各种属性和获取属性的方法
3.1.3.2Implement ConcreteVerticesGraph
checkRep()方法首先检查顶点集是否为空,再检查是否有空节点加入。之后检查边是否不为空且权值都大于零,再检查是否有没有源点或终点的野边。
add方法是加入点的方法,如果原本就包含该点则返回false,否则加入该点并返回true。
set方法设置边。当weight不为零时,如果边存在则更新边的长度为weight值,若边不存在则加入边且权值为weight。当weight为零时则删除对应边。
remove方法删除点,如果点不存在则返回false,否则删除该点以及点的出边和入边并返回true。
vertices()方法返回图的顶点集。
sources(L target)方法返回target对应的源点。
targets(L source)方法返回source对应的下一个点。
Vertex包含顶点的属性以及相应的获取方法
3.1.4Problem 3: Implement generic Graph
3.1.4.1Make the implementations generic
public class ConcreteEdgesGraph implements Graph {…}
class Edge { … }
3.1.4.2Implement Graph.empty()
public static Graph empty() {
return new ConcreteEdgesGraph();
}
3.1.5Problem 4: Poetic walks
3.1.5.1Test GraphPoet
3.1.5.2Implement GraphPoet
3.1.5.3Graph poetry slam
3.1.6Before you’re done
请按照http://web.mit.edu/6.031/www/sp17/psets/ps2/#before_youre_done的说明,检查你的程序。
如何通过Git提交当前版本到GitHub上你的Lab2仓库。
输入git add .再输入git commit -m “xxx”最后输入git push -u origin master即可完成上传。
3.2Re-implement the Social Network in Lab1
在这里简要概述你对该任务的理解。
该部分要求利用本次实验中的实现了graph接口的ConcreteEdgesGraph类和ConcreteVerticesGraph类中的一个来重构上次实验中的FriendshipGraph类
3.2.1FriendshipGraph类
给出你的设计和实现思路/过程/结果。
原FriendshipGraph类中的addVertex方法和addEdge方法将通过ConcreteEdgesGraph类中的add和set方法实现,而getDistance方法则稍作改动,通过ConcreteEdgesGraph类的vertices()方法来获取顶点集合,通过targets()方法来获取某个点的下一点,以此来实现广度优先遍历。
3.2.2Person类
给出你的设计和实现思路/过程/结果。
该类中成员变量包括人名以及为实现广度优先遍历而设计的visited和记录距离的distance。
3.2.3客户端main()
给出你的设计和实现思路/过程/结果。
加入一定数量的点和边然后输出距离。
3.2.4测试用例
给出你的设计和实现思路/过程/结果。
运行结果
3.2.5提交至Git仓库
如何通过Git提交当前版本到GitHub上你的Lab3仓库。
选择项目所在的文件夹,右键点击后选择git bash here,之后输入git init完成仓库的初始化和建立。
之后输入git remote add origin https://github.com/ComputerScienceHIT/HIT-Lab2-190110513来完成仓库的连接。
然后输入git add .再输入git commit -m “xxx”最后输入git push -u origin master即可完成上传。
4实验过程中遇到的困难与解决途径
遇到的难点 解决途径
不理解题目意思
通过翻译软件将题目翻译成中文并请教同学,最后基本弄明白题目意思
对于泛型和继承等一些Java方面的知识理解不够深刻
查找书籍和网络资料学习
写完后发现有bug,输出结果不符合要求
利用EclEmma来获取代码的执行情况,并适当通过System.out.println(); 方法来在可能出现bug的地方来输出一些信息,以此发现可能的bug。最终找到了bug并改正。
5实验过程中收获的经验、教训、感想
5.1实验过程中收获的经验和教训
通过本次实验,我更加深刻地理解了Java中泛型、接口、类和继承等概念,让我对Java语言有了更深入的了解,同时提高了我的编程能力,让我受益匪浅。
5.2针对以下方面的感受
(1)面向ADT的编程和直接面向应用场景编程,你体会到二者有何差异?
ADT可以先写出与功能相关的代码。而具体场景应用其具体实现方法,可以大大降低工作量,比起直接面向应用场景代码也不会显得赘余
(2)使用泛型和不使用泛型的编程,对你来说有何差异?
使用泛型之后相应类的使用范围更广。
(3)在给出ADT的规约后就开始编写测试用例,优势是什么?你是否能够适应这种测试方式?
优势是在一边实现具体类时可以一边测试,利于修改。
暂时没有,在慢慢适应。
(4)P1设计的ADT在多个应用场景下使用,这种复用带来什么好处?
减小工作量,提高工作效率
(5)为ADT撰写specification, invariants, RI, AF,时刻注意ADT是否有rep exposure,这些工作的意义是什么?你是否愿意在以后编程中坚持这么做?
意义在于让开发者看懂自己写的东西,除了便于与别人交流,更重要的是让自己在开发的时候防止自己忘记自己该干什么,比如这个变量是拿来干嘛的,这些数字表示什么状态。忘了就倒回去看自己写的规约,大大减少无谓思考的时间。
愿意。
(6)关于本实验的工作量、难度、deadline。
工作量偏大,难度偏大,deadline合理。
(7)《软件构造》课程进展到目前,你对该课程有何体会和建议?
本课程教了我们许多关于Java的各种知识和语法,帮助我们掌握Java编程语言以及面向对象的思想,还教会我们如何使用eclipse和git,帮助我们养成了编程的良好习惯,使我受益匪浅。