软件构造 第6讲 ADT

操作的分类

构造器:可能实现为构造函数或静
态函数 工厂方法
变值器通常返回
void

举例

Integer.valueOf() - Creator
        解释: Integer.valueOf() 方法接受一个 int 或 String,并返回一个 Integer 对象(抽象类型)。它创造了一个新的抽象类型实例,所以是 Creator。


BigInteger.mod() - Producer
        解释: BigInteger.mod() 方法接受一个 BigInteger 对象作为参数,并返回一个新的 BigInteger(抽象类型)。它基于输入生产了新的抽象类型实例,所以是 Producer。


List.addAll() - Mutator
        解释: List.addAll() 方法接受一个集合并将其所有元素添加到调用该方法的列表中。它改变了列表的内容,所以是 Mutator。


String.toUpperCase() - Producer
        解释: String.toUpperCase() 方法返回一个新的 String 对象,其内容是调用字符串的大写版本。它基于输入生产了新的对象,所以是 Producer。


Set.contains() - Observer
        解释: Set.contains() 方法检查集合中是否包含指定元素,并返回一个 boolean 值(其他类型)。它不改变集合,只是观察集合的状态,所以是 Observer。


Map.keySet() - Observer
        解释: Map.keySet() 方法返回映射中所有键的集合。虽然它返回的是一个集合,但它只是观察映射的状态,而不改变它,所以是 Observer。


Collections.unmodifiableList() - Producer
        解释: Collections.unmodifiableList() 方法接受一个 List 并返回一个新的不可修改的 List(抽象类型)。它基于输入生产了一个新的抽象类型实例,所以是 Producer。


BufferedReader.readLine() - Mutator
        解释: BufferedReader.readLine() 方法从输入流中读取一行文本,并改变输入流的状态(移动到下一行)。因此,它既返回了一个其他类型(字符串),又改变了状态,所以是 Mutator。

表示独立性(RI)

表示独立性:client使用ADT时无需考虑其内部如何实
现,ADT内部表示的变化不应影响外部spec和客户端。

测试ADT

测试creators, producers, and mutators:调用observers来观察这些 operations的结果是否满足spec;
 测试observers:调用creators, producers, and mutators等方法产生或 改变对象,来看结果是否正确。
风险:如果被依赖的其他方法有错误,可能导致被测试方法的测试结 果失效
不变量:表示不变性,避免表示泄露
总是要假设client有“恶意”破坏ADT的不变量---defensive programming
representation exposure 表示泄露:
不仅影响不变性,也影响了表示独立性:无法在不影响客户
端的情况下改变其内部表示
对策:防御式拷贝

RI&AF

设计ADT
(1) 选择RA
(2) RI --- 合法的表示值;
(3) 如何解释合法的表示值 ---映射AF
做出具体的解释:每个rep value如何映射到abstract value
示意图:

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值