软件构造Lab2心得与感受
上周日刚刚结束了lab2的提交,可惜没有时间来进行lab2的总结与感受,所以在这周一尽快将这次的实验小总结一下。
本次lab2的目的是:
1. 针对给定的应用问题,从问题描述中识别所需的ADT;
2. 设计ADT 规约(pre-condition、post-condition)并评估规约的质量;
3. 根据ADT 的规约设计测试用例;
4. ADT的泛型化;
5. 根据规约设计ADT 的多种不同的实现;针对每种实现,设计其表示(representation)、表示不变性(rep invariant)、抽象过程(abstraction function)6. 使用OOP 实现ADT,并判定表示不变性是否违反、各实现是否存在表示泄露(rep exposure);
7. 测试ADT 的实现并评估测试的覆盖度;
8. 使用ADT 及其实现,为应用问题开发程序;
9. 在测试代码中,能够写出testing strategy 并据此设计测试用例。
首先,我们先回顾一下lab2的主要内容:
1.我们需要完成一个图的各种功能的实现,并且通过junit测试来测试我们编写代码的正确性;之后,通过我们已经构建好的图的实现,来构思一个关于诗的小功能,包括句子的扩充,将句子拆分表示等等;
2.我们需要用第1个任务中实现了的图的功能来进行lab1中人物关系图的改编,并通过junit测试对代码的正确性进行测试;
3.这也是lab2的一个新东西的引入,需要查看我们代码的覆盖率。
之后,我们对每个任务的进行一个详细的讨论:
任务1.
这也是lab2中百分之八十的工程量。这个任务比较颠覆我们认知的是需要我们先编写test文件,之后再进行类的实现,这样做的目的是明确我们的思路,从而只需要根据自己的思路进行各种方法的实现即可。
(1) ConcreteEdgesGraph的实现
首先,我们需要设计Edges类,即边,定义边的起点,终点和权重为private
private final L source,target;
private final int weight;
然后完成一些关于边的方法,可以按照以下的框架进行构造:
(1)求该边的起点 (2)求该边的终点 (3)求该边的权重 (4)toString函数 (5)检查表示不变性
之后再开始实现ConcreteEdgesGraph
这里已经给出了定义
private final Set<String> vertices=new HashSet<>()
private final List<Edge> edges=new ArrayList<>();
还是给出需要构造的方法的框架:
(1)添加顶点 (2)移除顶点 (3)添加新边 (4)返回图中所有的点 (5)已知起点求边 (6)已知终点求边 (7)检查表示不变性
(2)ConcreteVerticesGraph实现
还是先设计Vertex类,定义点的名字,它的所有起点和重点为private
private final L point;
private final Map<String,Integer> itssource;
private final Map<String,Integer> itstarget;
然后完成一些它的算法,框架如下:
(1)初始化 (2)检查表示不变性 (3)返回点的名字 (4)返回该点的起点和对应的边 (5)返回该点的终点和对应的边 (6)加入或删除一个起点 (7)加入和删除一个终点
之后实现ConcreteVerticesGraph
这里也是已经给出了定义private final List<Vertex> vertices=new ArrayList<>();
需要构造的方法的框架:
(1)添加点 (2)添加边 (3)删除一个点 (4)返回所有的点 (5)求一个点的起点和对应的边(6)求一个点的终点和对应的边
然后,到了一个比较坑的地方,突然告诉我们需要进行implementations generic,即改成泛型,这里不要慌,eclipse有报错和自动纠错功能,按照提示将edge类和vertex类改为edge<L>和vertex<L>,然后根据eclipse的提示进行修改即可。修改完之后图的大致功能就基本实现了,开始进行诗的部分的编写。
诗的部分的方法框架:
(1)从文件终读入诗句,将相邻的元素间构造边 (2)扩充字符串 (3)将诗连城字符串输出
这里说一下扩充字符串的一个思路:
每次读取一个词,作为起点,记为A,下一个词作为终点,记为B,在图中寻找A起点的终点集中是否有与B的起点集相同的元素,并找到权重最大的和的点加入到A与B之间。
任务2.
走到这里基本标志着lab2的完成,我们通过引用构造好的图的实现来完成lab1的人物关系图
这里用ConcreteEdgesGraph和ConcreteVerticesGraph均可实现,我们以ConcreteEdgesGraph为例子
首先建立private final ConcreteEdgesGraph<Person> persongraph
需要的方法框架:
(1)加入新的人物(对应于加入点) (2)为某人添加朋友(对应于两人之间建立一条权重为1的边) (3)计算两人的最长距离(其实还是对数据结构内容的回顾)
之后设计测试文件即可,这里有一个问题是在写测试文件的时候,无法测试加入点的方法,因为点集是被设置为private的类型,如果我们坚持要测试该方法,可以通过将private删去进行测试,但是无法做到二者同时满足,我只好在边的测试里测试点的加入,如果点的加入不正确的话,边的加入必然不正确,所以间接测试点的加入的正确性。
实验的部分大致就这样,下面简单说一下进行了5周的软件构造课的感受。
软件构造确实是每一个程序员必须掌握的知识,其课程的重要性十分显然,老师上课也非常的认真,并且对学生很负责,几次的缺课都想办法补了回来,并且在外地仍然通过摄像头为大家进行了实验的讲解,但是还是我们毕竟是初学者,全英文的PPT和实验手册实在是读的吃力,老师上课的语速也实在有点跟不上,希望老师可以削微削微讲的慢一点,方便大家课堂上更好的掌握。