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 并据此设计测试用例。

要实现功能本身并不难,但是这种新的设计思路让人感觉很有挑战性。在实验完成过程中,大把的时间都花在了弄懂实验要求和课程知识的联系,撰写注释等事情上。但是总的来讲,这些工作是有意义的,认真思考过mutability/ immutability、AF、RI 后写成的代码更加易读易懂,有逻辑性,莫名其妙的错误也少了很多。

下面记录在写实验中遇到的问题和解决方案

  • 如何撰写immutable的类
    1.所有变量都应该是私有的,final的(有时不是final也可以)
    2.对象应该是final的,来避免继承(但是这次实验我没有考虑)
    3.不提供任何的mutator
    4.对于mutable的成员,返回时需要defensive copy 来保证安全,即保证safety from rep exposure

  • 什么是AF、RI
    AF是实现时用到的值空间到需要支持的值空间的映射。由于需要支持的值空间必须被满足,所以AF必须为满射。
    RI通俗地说就是合法表示的集合。所以要书写checkrep函数在每次返回前检查表示是否满足RI的要求。这样做有利于保证程序的正确性。

  • 关于泛型编程
    这次实验的泛型化很简单,查找+替换就完事了。但是也让人体会到泛型编程对于代码复用的好处。写的图的ADT可以支持各种数据类型了。
    泛型信息只存在于编译阶段,运行时就会被擦除,替换为限定类型或者object,如图:
    类型擦除

  • spec的书写
    override的方法不需要重新写spec。写spec时使用/**标识,方便生成Javadoc。

  • 关于test
    应用课程中介绍的等价类方法写测试,尽量确保每一种情况都被测试到。eclipse带的插件EclEmma可以帮助测试代码覆盖率,并且显示哪一行代码没有运行到。
    可以根据coverage的运行结果修改完善测试的方案。

  • 下棋
    这个实验一开始做的时候有些手忙脚乱。导致piece,player类里面写了根本没用到的方法,浪费自己的时间。回过头来看的话,感觉应该先确定每个类是mutable还是immutable的,不然没办法确定rep的安全性,写方法的时候参数和返回值的类型也不好确定,因为类之间会互相使用,难以保证safety from exposure。接下来再分配每个类的具体功能,先写好方法的名称再进一步实现,避免后面又推翻自己的设计。这也就可以看出来写好spec有多么重要了。
    另外,写的下棋类的功能要封装好,分隔开,不能把一部分任务甩给用户,这样单元测试也不好做。

猜你喜欢

转载自blog.csdn.net/qq_43351085/article/details/89285662
今日推荐