哈工大软件构造之ADT学习心得

1.分类类型和操作

1.1可变和不可变数据类型

        可变类型的对象可以更改:也就是说,它们提供的操作在执行时导致对同一对象的其他操作的结果产生不同的结果。例如日期是可变的,因为您可以调用setMonth()并通过getMonth()操作观察变化。但是String是不可变的,因为它的操作创建新的String对象,而不是改变现有的。简单来说改变可变数据的值时是改变其内部的值,而不可变类型改变了之后其实是改变了其引用,使其指向新地址。有时,一个类型会以两种形式提供:可变形式和不可变形式。

1.2对抽象类型的操作进行分类

构造器:可以接受对象作为参数,但不能接受正在构造的类型的对象。创建器可以像new一样被实现为构造函数ArrayList(),或者简单地使用静态方法,比如arrays . aslist (), List.of()。作为静态方法实现的创建器通常称为工厂方法。

生产器:例如,String的concat()方法是一个生成器:它接受两个字符串,并生成一个表示它们的连接的新字符串。

观察器:接受抽象类型的对象并返回不同类型的对象。例如,List的size()方法返回int类型。

变值器:改变对象。例如,List的add()方法通过在末尾添加一个元素来改变列表。mutator通常由void返回类型表示,也可能返回非空类型。

各个操作类型变化如下:

2.设计抽象类型

        设计抽象类型包括选择好的操作和确定它们应该如何表现。应当设置简洁、一致的操作。最好有几个简单的操作,它们可以以强大的方式组合在一起,而不是大量复杂的操作。每个操作应该有一个明确的目的,应该有一个连贯的行为,而不是一堆特殊情况。例如,我们可能不应该向List添加求和操作。它可能会帮助处理整数列表的客户端,但是对于字符串列表呢?或者嵌套列表?所有这些特殊情况会使sum操作难以理解和使用。再者要足以支持client对数据所做的所有操作需要,且用操作满足client需要的难度要低。一个好的测试是检查该类型对象的每个属性是否都可以提取。例如,如果没有get操作,我们将无法找出列表的元素是什么。

 

3.Rep Invariant and Abstraction Function(RI和AF)

3.1两个表示空间:R空间和A空间

        R:表示值的空间(rep值),由实际实现实体的值组成。ADT将作为单个对象实现,但更常见的是需要一个小的对象网络,因此值通常是相当复杂的。A:抽象值的空间由该类型设计支持的值组成。ADT开发者关注表示空间R,client关注抽象空间A。

两者的关系是满射、未必单射、未必双射的。

3.2AF

        Abstraction Function,即抽象函数,表示R和A之间映射关系的函数,即如何去解释R中的每一个值为A中的每一个值。在函数的术语中,这些性质可以表示为函数是满射(也称为映上),不一定是单射(一对一),因此不一定是双射

3.3RI

表示不变量Rep Invariant:某个具体的“表示”是否是“合法的”,也可将RI看作:所有表示值的一个子集,包含了所有合法的表示值,或者是一个条件,描述了什么是“合法”的表示值。

即使是同样的R、同样的RI,也可能有不同的AF,即“解释不同”。即表示空间可以有不同的值映射到抽象空间。所以要选择R和A,做出具体的解释:每个rep value如何映射到abstract value,而且要把这种选择和解释明确写到代码当中。

4.总结

        这一块的重难点主要在RI、AF,除此之外也要区分四种抽象类型的操作,给出一种操作或者代码需要能够判别是哪种操作。着重注意不变量问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值