ADT,全名Abstract Data Type,抽象数据类型。我们传统的定义一个类型的时候关注的是数据的具体表示,而定义抽象数据类型,我们关注的则是“作用于数据上的操作”,并不关注其具体的实现方式和存储方式。举个栗子,我们要设计一棵二叉搜索树,我们就可以设计一个ADT,其中写入插入,删除等方法的声明,然后就可以继承这个ADT来用不同的方式是实现二叉搜索树,比如AVL树,红黑树等等。
ADT是由其操作实现的,与其内部实现无关,它相当于在实现者和客户端之间设立了一道防火墙,避免客户端读取到数据的内部表示,ADT内部的变化不会影响外部的客户端,从而避免引起错误,这也就是我们说的表示独立性。
AF,全名Abstraction Function,简单点说就是一个抽象函数,它反映两个空间的对应关系,一个是表示空间R,一个是抽象空间A。我的理解是表示空间就是我们在实现这个项目时的空间,而抽象空间是用户看到的那个空间。比如我写一个下棋的程序,我采用数组实现棋盘,那么表示空间里是一个数组,抽象空间里是一个棋盘,而AF就是它两者之间的映射,它将数组映射到棋盘上去,相当于一个函数,表示空间是定义域,抽象空间是值域。显然,这个映射是一个满射,我们不会编写无意义的程序,但它不一定是双射,因为可以有多种的实现方法。
RI,全名Representation invariant,我们也可以把它看成一个从R映射到boolean的映射。它是为了判断我们的实现的每个表示是否“合法”,比如,还是刚才的那个棋盘,我要求数组里的所存的黑白色棋子个数相同,这就是一个RI。这个要求是程序无论在任何时候都为true的。我们也可以把它看成一个集合,这个集合里所有元素都是合法的,按刚才的例子说就是这个集合里的数组黑白棋子数都是相等的。
总结一下,设计一个ADT,我们首先要选择某种特定的表示方式R,进而指定某个子集是合法的(RI),并为该子集中的每个值做出“解释”(AF)----即如何映射到抽象空间中的值。
比如我们要设计一个学生类,我设立name,age两个属性,这就为R。进而,我指定name不为空,age>0,(RI),并在注释中解释,name代表学生的名字,age代表学生的年龄(AF)。
如有错误欢迎指正。
软件构造对ADT,AF,RI的理解
最新推荐文章于 2023-04-04 15:30:23 发布