本文章是对软构实验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并据此设计测试用例。
Poetic Walks
任务理解:
- 根据接口Graph的描述,通过等价类划分完善测试样例;
- 根据测试样例完善ConcreteEdgesGraph和ConcreteVerticesGraph两种实现方法,要注意两种实现方法的数据结构,具体问题具体分析;
- 修改ConcreteEdgesGraph和ConcreteVerticesGraph中的声明,实现泛型;
- 选择ConcreteEdgesGraph和ConcreteVerticesGraph其中一种实现方式,实现Graph.empty();
- 通过构建好的Graph接口构建GraphPoet类,实现构造语料库以及为输入添加桥接词的功能。
Re-implement the Social Network in Lab1
任务理解:
- 运用接口Graph重新实现Lab1中的FriendshipGraph;
- FriendshipGraph需要改变的地方不多,但值得注意的是,为了使FriendshipGraph中运用Graph接口构造的图是私有不可变的,需要添加一些函数(观察器)方便Junit测试。
实验难点
P1 利用语料库改写输入语句
public String poem(String input) {
String[] inputwords = input.split(" ");
String output = new String();
String bridgeword = new String();
Map<String, Integer> sourcesMap = new HashMap<>();
Map<String, Integer> targetsMap = new HashMap<>();
Map<String, Integer> bridgeMap = new HashMap<>();
Set<String> bridgeset = new HashSet<>();
int i = 0, w = 0;
for (i = 0; i < inputwords.length - 1; i++) {//最后一个输入字符之后不会有桥接词
targetsMap = graph.targets(inputwords[i].toLowerCase());//用于储存与该点相连的所有的目标点
sourcesMap = graph.sources(inputwords[i + 1].toLowerCase());//用于储存与该点相连的所有的源点
bridgeMap.clear();
output += inputwords[i] + " ";
for (String word : targetsMap.keySet()) {
if (sourcesMap.containsKey(word)) {
w = targetsMap.get(word) + sourcesMap.get(word);
bridgeMap.put(word, w);
}
}//找到所有的桥接词
bridgeword = "";
int weight = 0;
bridgeset = bridgeMap.keySet();
for (String bridge : bridgeset) {
if (bridgeMap.get(bridge) > weight) {
weight = bridgeMap.get(bridge);
bridgeword = bridge;
}
}//找到权重最大的桥接词,如果有多个权重最大的桥接词,取率先在语料库中出现的
if (!bridgeword.equals("")) {
output += bridgeword + " ";
}//如果存在权重最大的桥接词,则加入该桥接词
}
output += inputwords[inputwords.length - 1];
checkRep();
return output;
}
步骤:
1.遍历输入字符串中的单词,将它们加入输出。在输入的两个相邻单词中,在语料库中找到第一个单词作为源点时,指向它的边的目标点的集合以及第二个单词作为目标点时,指向它的边的源点的集合,将两个表对比找到所有的桥接词,将它们存入一个哈希表;
2.找到权重最大的桥接词,如果有多个权重最大的桥接词,取率先在语料库中出现的;
3.如果存在权重最大的桥接词,则在输出中加入该桥接词;