软件构造Lab2实验总结
本次实验训练抽象数据类型(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并据此设计测试用例。
本实验分为两个部分,每部分的难点以及要点如下:
1.第一个实验是从头设计一个Graph,重难点在于对每种实现的表示,不变性以及抽象过程。另一个需要注意的点是在实现方法之前需要先写测试用例和测试策略,这样在具体实现不同方法的时候就可以对各种可能的输入空间进行划分,从而使代码实现更加具有可扩展性以及模块化。测试用例和测试策略注意要对所有可能的输入进行覆盖,用笛卡尔覆盖的方法划分输入空间可以保证输出样例全覆盖。然后根据测试策略写能够覆盖每种情况的最小集合的测试。
然后实现以边为主的图形和以点为主的图形,其中重点在于对两种不同的实现方法,我们对数据结构和方法的设计也不同。以边为主的方式是每个边用起点,终点,权重表示,然后和点集一起构成图形的实现。至于方法的具体设计如下:
ConcreteEdgesGraph需要实现Graph的6个函数,还要完成一个toString函数。
add函数:set集合中的add方法刚好可以保证加入不重复的点,所以直接使用即可。加入成功返回true,不成功返回false。
set函数:以权重大于0,小于0,等于0分别进行讨论。小于0直接输出错误信息;等于0看点存不存在,不存在就不用管,都存在且有边的话就删掉边;大于0的话就加点加边,边存在的话就改值。但Edge类是immutable的,所以只能删掉原来的edge,再新建一个edge。
remove函数:点集里删除点,边集里把相关边也删掉。
vertices函数:返回set集合vertices即可,但为了外面的人不能调用,新建一个集合返回即可。
sources函数:找所有target是输入的边,然后把source和weight加到新建的map里返回即可。
targets函数:找所有source是输入的边,然后把target和weight加到新建的map里返回即可。
toString函数:把图的所有点和边按顺序输出即可,格式规范就好。
以点为主的图形设计类似,只是点的实现关键在以点为主,所以存边的方式可以用Map,当然这两个量为了防止泄露,还是使用private final格式。以点为主的话,我们需要做的就是存点的标记(现在是String),然后边的话就是用Map,存target和权重。
然后用泛型L代替String,只要对每个相关函数和方法加个标签就可以了。然后实现Graph也很简单,用以边为主的图形和以点为主的其中一个新建就可以了。经过测试,覆盖率很高,结果也都是正确的。
2.第二个实验是重新实现Lab1的FriendshipGraph函数,用这次的Graph来实现。改代码的难度很小,因为方法是固定的,主要难点在于对FriendshipGraph函数的每种实现的表示,不变性以及抽象过程。还有测试用例也要补充测试策略,并根据测试策略的结果进行测试样例的编写。其他都不算特别难,所以总的难度不算很大。
以上就是我总结的本实验的要点,希望对大家有所帮助。