关于ADT的复习笔记
对于软件构造这门课来说,关于ADT的内容,是我们这门课的重点也是考试的重点,在前面的几篇文章中已经对复用的相关问题进行了讲解,为了让讲解的内容覆盖所有的重点与难点,在接下来的内容中我将对这两个部分进行探讨, 将课堂中的内容与一些个人的感悟相结合
静态检测与动态检测
简单来说,静态检测就是在还没有运行的时候就已经对程序中存在的编译错误进行了检测,而动态检测则需要对程序运行时才能检测出来。
关于怎么区分:可以想想对应的编程语言。其中静态检测出的错误可能还没运行程序已经有提示了标红了,而动态检测则必须运行之后才能显示出来,报错或者异常等。
静态检测能检测的错误:语法错误、类名/函数名错误、参数数目错误、参数类型错误、返回值类型错误
动态:非法参数、非法返回值、越界错误、空指针。
相对而言,动态检测的效果要优于静态检测,毕竟把程序给运行了一遍才发现的问题,所以效果肯定是要好些的。
下面是一些例子:
考试例题:
mutable与immutable
这个问题可以说是老生常谈了,但复习的时候我注意到两个点,需要提一下,关于stringbuilder函数是直接对内容进行改动,而不是创建新的类,而string.trim则是用于去除空格,在此时也会进行创建新的String。
Snapshot diagram
这个问题主要记住以下几点就没问题了:
1.对于基本类型箭头直接指向数值就好了。
2.对于对象类型的值需要有圈,若其内部的值已经复制则需要再拿箭头指出去,不可变的需要用双圈来实现,如果中间对应的值发生了改变则需要用×来给出标注,并指向新的值。
3.对于被final修饰的变量需要画成实线箭头。
同时我们刚刚提到的对字符串的修改也涉及到这个问题,当对象变量赋新值的时候则需要指向另一个圈。
一个具体的例子
后面关于类型的问题我再前面一个博客里讲过了,所以就接着总结后面的内容吧。
ADT的特性:表示泄漏、抽象函数AF、表示不变量RI(重点内容)
ADT(Abstract Data Tyoe)操作的四种类型
这个知识点在18年的考试题中还出现过,接下来给出各种操作的内容:
Creators:创建新类型的对象,可以接受一个对象作为参数,但不能接受正在构造的类型的对象。
Producers:从该类型的旧对象创建新对象。
Observers:返回一个已有的新类型
Mutators:对类型内容进行修改。
相关考试题内容:
表示独立性
定义:
表示独立性:client使用ADT时无需考虑其内部如何实现,ADT内部表示的变化不应影响外部spec和客户端。
除非ADT的操作指明了具体的pre-和post-condition,否则不能改变ADT的内部表示——spec规定了client和implementer之间的契约。
个人感觉这个东西和黑盒测试有些像,你只管用,里面怎么实现的我们不关心,也没必要关心,对于不同类型各种函数调用使用的就是表示独立性。
表示不变量RI、抽象函数AF
抽象函数:R和A之间映射关系的函数,即如何去解释R中的每一个值为A中的每一个值。
RI的定义:某个具体的“表示”是否是“合法的”,
所有表示值的一个子集,包含了所有合法的表示值,
一个条件,描述了什么是“合法”的表示值(课件中的三个定义)
说完了上面的定义我再来说一说我的理解,首先对于RI来说就是,同一个ADT中,不同的内容不管怎么变化总有一个特性是伴随着它的,这个定义对于不同的定义有不同的解释方式,但是其本质都是最基本的那个量是不变的。
在这学期的实验中,我们也多次都对这一内容进行了应用,总的来说设计ADT分为以下三个步骤:(1) 选择R和A;(2) RI —合法的表示值;(3) 如何解释合法的表示值—映射AF。
该过程中需要编写如下的步骤:
ADT中的重要的或者不是很熟练的例子总结如上,ADT在考试中对代码的分析以及一些细碎的知识点还是有一些的,所以希望大家多关注一下课件中的相关内容。