2022年春季学期
计算学部《软件构造》课程
Lab 2实验报告
姓名 | 赵卓凡 |
学号 | 120L021804 |
班号 | 2003006 |
电子邮件 | 759140563@qq.com |
手机号码 | 13804501310 |
3.1.1 Get the code and prepare Git repository 1
3.1.2 Problem 1: Test Graph <String> 1
3.1.3 Problem 2: Implement Graph <String> 1
3.1.3.1 Implement ConcreteEdgesGraph 2
3.1.3.2 Implement ConcreteVerticesGraph 2
3.1.4 Problem 3: Implement generic Graph<L> 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
本次实验训练抽象数据类型(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 并据此设计测试用例。
简要陈述你配置本次实验所需环境的过程,必要时可以给出屏幕截图。
特别是要记录配置过程中遇到的问题和困难,以及如何解决的。
直接下载即可
在这里给出你的GitHub Lab2仓库的URL地址(Lab2-学号)。
https://github.com/ComputerScienceHIT/HIT-Lab2-120L021804.git
请仔细对照实验手册,针对两个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。
利用ADT和OOP,在两个类中实现Graph和其相应的功能。
从https://github.com/rainywang/Spring2022_HITCS_SC_Lab2/tree/master/P1下载代码并解压,之后git init创建初始库,git add *.*将文件加入git库,再用git commit -m “init”标注为初始文件,再git push origin master传到自己的远程库上。
在Graph的empty中返回一个新的ConcreteEdgesGraph
在ConcreteEdgesGraph中返回vertices
用GraphStaticTest进行测试
在GraphInstance中设计了针对Add、Set等功能的测试代码,但暂时无法测试,需在测试GraphEdges时才能测试
以下各部分,请按照MIT页面上相应部分的要求,逐项列出你的设计和实现思路/过程/结果。
先写Edge类
再构建ConcreteEdgesGragh类
得到测试结果
覆盖度如上,其中覆盖度低的百分之二十分布在try{}catch(Exception e)中和checkRep这些无法测试到的部分
先写Vertex类
再写ConcreteVerticesGraph类
依照上图按照报错依次把String转为L即可
如图new出一个新图然后返回
如图构建测试
先设计Graphpoem
再设计poem
输出结果如下
上图为覆盖度。
如上图把莎士比亚的十四行诗创建成图,当输入I love you more and more.时应该输出I love you more lovely and more.
请按照http://web.mit.edu/6.031/www/sp17/psets/ps2/#before_youre_done的说明,检查你的程序。
如何通过Git提交当前版本到GitHub上你的Lab2仓库。
在这里给出你的项目的目录结构树状示意图。
git add *.*
git commit -m “first”
git push origin master
结构:
Src
P1
Graph
Poem
Teat
P1test
Graph
poem
用上个实验里设计的Graph类重写上次实验的人际关系图
如图设计addVertex,addEdge,getDistance三个函数
如图设计Person类
沿用上一次实验的main
沿用上一次实验的测试用例
如何通过Git提交当前版本到GitHub上你的Lab2仓库。
在这里给出你的项目的目录结构树状示意图。
git add *.*
git commit -m “first”
git push origin master
结构:
Src
P4
interval
P4
interval
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。
不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。
日期 | 时间段 | 计划任务 | 实际完成情况 |
5.13.2022 | 15:30-19:30 | 完成3.1.2 | 延后 |
5.14.2022 | 10:00-21:30 | 完成3.1.3 | vertex的set的测试一直不成功,延后完成 |
5.15.2022 | 9.00-18:30 | 完成3.1.5 | 延后,困难3还未解决 |
5.16.2022 | 13:00-21:00 | 完成3.2 | 完成 |
遇到的难点 | 解决途径 |
3.1.2中测试一直不成功 | 返回vertices时多写了一个(),导致方法套方法,还不会报错,一直没发现,蚌埠住了 |
3.1.3中测试一直不成功 | 一直没找到问题所在,先跳过 |
3.1.5.2中,创造图一直不成功,如果set(string[3],string[4],1)的话无法创造出该边,但要是将字符串写出来的话set(“test”,”of”,1)却成功,可是二者理论上应该是等价的,不知道错在哪里 | 暂未解决(5.16更新:已解决) |
困难3 | 解决了,字符串比较要么全用equal,要么==不能混用,离谱 |
- 实验过程中收获的经验、教训、感想
- 实验过程中收获的经验和教训
学习了很多java的写法,学习了ADT和OOP的相关知识
- 面向ADT的编程和直接面向应用场景编程,你体会到二者有何差异?
ADT感觉可能应用到实际会更方便
- 使用泛型和不使用泛型的编程,对你来说有何差异?
泛型比较麻烦,需要修改的比较多,自己手写会bug很多
- 在给出ADT的规约后就开始编写测试用例,优势是什么?你是否能够适应这种测试方式?
在类更多的时候便于管理,便于直到输入输出,暂时还不适应
- P1设计的ADT在多个应用场景下使用,这种复用带来什么好处?
节省时间,更方便
- 为ADT撰写specification, invariants, RI, AF,时刻注意ADT是否有rep exposure,这些工作的意义是什么?你是否愿意在以后编程中坚持这么做?
防止出错,不想写,但感觉应该很有用,还是写吧
- 关于本实验的工作量、难度、deadline。
虽然感觉不难,但在写的时候出了很多很难解决的bug,耗费了非常多的时间,比预计完成晚了很久
- 《软件构造》课程进展到目前,你对该课程有何体会和建议?
感觉这门课比较抽象,挺难的