本此的软件构造实验二确实花了很多的时间,接触了许多之前从来没有用过的功能,感觉是痛苦和收获并存的吧,下面想对这个部分做一点小小的总结
目录
实验目标简介:
- 本次实验训练抽象数据类型(ADT)的设计、规约、测试,并使用面向对象
- 编程(OOP)技术实现 ADT。具体来说:
- 根据 ADT 的规约设计测试用例;
- ADT 的泛型化;
- 根据规约设计 ADT 的多种不同的实现;针对每种实现,设计其表示(representation)、表示不变性(rep invariant)、抽象过程(abstraction function)
- 使用 OOP 实现 ADT,并判定表示不变性是否违反、各实现是否存在表示泄露(rep exposure);
- 测试 ADT 的实现并评估测试的覆盖度;
- 使用 ADT 及其实现,为应用问题开发程序;
- 在测试代码中,能够写出 testing strategy 并据此设计测试用例。
新工具使用:
这次使用的新的工具是EclEmma,这款工具可以帮助我们在测试程序的时候,对测试程序对代码的覆盖度进行一个定量的反映,对于其中哪些语句测试到了,还有那些没有测试到都有所标注。
安装:
这里我们可以直接在eclipse的市场中搜索EclEmma,然后一步步直接点击下一步或者intall就可以完成安装。
遇到的小问题小tips
1.这次的代码编写,有一个我遇到的非常坑的东西(仅仅代表我自己)。就是在老师还没有讲到equal和==符号之间区别的时候,我写了前面部分的代码。所以就导致了,本来是我不想要进行数据是否属于同一引用的判断,只是想说是否是同一字符串而已,所以在构建词库的时候,就一直报错,没法通过。
最大的区别是,==是运算符,equal是方法;
比较基本类型,只能用==,不能用equal,这里的==比较的是两个变量的值;
==比较的是内存地址,因为对象是new出来的,是两个不同的对象,所以地址肯定是不同的,而equal比较的是值;
对于抽象类型,==和equal比较的都是内存地址,因为equal没有被重写,没有被重写的equal都是object的equal方法;
2.对于对象之间的继承,重写,的等等调用关系没有太理解。这主要是对于这部分的知识点还没有掌握,比如在对于object类型的数据类型进行equal重写的时候,一定要注意到,是重写而不是重载,否则在引用你写的那个equal函数的时候,会没有办法引用到。
3.还有一点稍稍需要注意到的是,在重写equal的时候,记得一定要对于hashcode进行重写,因为一定要符合相等的对象,他们的hashcode一定是相等的;但是hashcode相同的并不会一定相等,后面有时间的化,我也会对这一个部分做一个小小的博客来介绍一下。
简单学到的部分是:
- 两个对象相等,hashcode一定相等
- 两个对象不等,hashcode不一定不等
- hashcode相等,两个对象不一定相等
- hashcode不等,两个对象一定不等
收获较大的代码
首先想要提一下的就是这一次对于继承和面向对象的这个部分有着更加深刻的理解。以前都是从C语言的角度进行面向过程的写作。但是这次有机会用了:
1.Test-Driving programming。先写黑盒测试。
2.面向对象,写对象Vertex和Edge来操作
class Edge<L> {
// TODO fields
private final L source,target;
private final int weight;
//Abstraction function:
//AF(source)=起始点位置
//AF(target)=终止点位置
//AF(weight)=边的权值
// Representation invariant:
//weight==0代表没有边,大于0表示有边
// Safety from rep exposure:
//将数据类型全部设置为private类型,和final
/*
*
*/
public Edge(L a,L b,int w)
{
source=a;
target=b;
weight=w;
checkRep();
}
// TODO checkRep
public void checkRep()
{
assert weight>=0;
assert source!=null;
assert target!=null;
}
// TODO methods
public L getsource()
{
return this.source;
}
public L gettarget()
{
return this.target;
}
public int getweight()
{
return this.weight;
}
// TODO toString()
public String toString()
{
String x="从"+this.source+"到"+this.target+"距离是"+this.weight+'\n';
return x;
}
3.泛型编写,使得使用面更广
4.复用代码
在本次实验中,基于在 3.1 节 Poetic Walks 中定义的 Graph<L>及其两种实现,重新实现 Lab1 中 3.3 节的 FriendshipGraph 类
心得技能总结
面向ADT的编程和直接面向应用场景编程,面向对象能够每次完成对某个对象的编程,与面向过程的编程的思路完全不一样。
同时,练习为ADT撰写specification, invariants, RI, AF,时刻注意ADT是否有rep exposure等工作,虽然过程非常的繁琐,但是理解顺畅了以后会非常有帮助。
本实验的工作量较大,难度适中,还是挺有利于我们的学习和进步的。