1.5.2 指定数据和操作(2)
最后来看一下包中的内容。我们定义了一个将包中的项放入向量中的方法,而不是提供了一个显示包中所有项的方法。这样客户可以使用自己喜欢的方法显示包中的部分项或者全部项。下面是最后一个方法的规范:
- // Gets all entries in the bag.
- +toVector(): vector
与前面开发的包方法的规范类似,我们使用了UML表示法。图1-7显示了这样做的结果。

注意,CRC卡以及UML图并没有给出所有的细节,例如所做的假设以及特殊情况。然而,当已经明确了这些情况后,应该指明方法在这些情况下的行为。正如我们在下面的表格中所做的那样,应该记录与方法行为有关的决策。然后可以将这些信息描述组合到用于说明方法的C++注释中。
|
抽象数据类型:包
|
|
数据
|
|
● 有限数量的对象,不必不同,没有特定的顺序,具有相同的数据类型
● 集合中对象的数量
|
|
操作
|
|
伪 代 码
|
描 述
|
|
getCurrentSize()
|
任务:报告当前包中对象的数目
输入:无
输出:当前包中对象的数目
|
|
isEmpty()
|
任务:检测包是否为空
输入:无
输出:根据包是否为空,输出true或者false
|
|
add(newEntry)
|
任务:将给定对象添加到包中
输入:newEntry对象
输出:根据添加动作是否成功,输出true或者false
|
|
remove(anEntry)
|
任务:如果可能的话,将特定对象从包中删除
输入:anEntry对象
输出:根据删除动作是否成功,输出true或者false
|
(续表)
|
抽象数据类型:包
|
|
clear()
|
任务:从包中删除所有对象
输入:无
输出:无
|
|
getFrequencyOf(anEntry)
|
任务:计算包中某个对象的出现次数
输入:anEntry对象
输出:用于表示anEntry在包中出现次数的整数
|
|
contains(anEntry)
|
任务:检测包是否包含某个特定对象
输入:anEntry对象
输出:根据anEntry对象是否在包中,输出true或者false
|
|
toVector()
|
任务:获取包中所有对象
输入:无
输出:包含当前包中所有项的向量
|
提示:处理特殊情况
如前所述,必须决定如何处理特殊情况。ADT包的文档必须反映出前面的讨论中所做的决定及其细节。例如,remove方法的规范指明如果客户试图从空包中删除某项将返回false。我们也可以给这个方法一个前置条件保证这个包不为空,然后由客户在调用这个方法之前检测这个前置条件是否满足。注意,客户可以使用ADT包中的其他方法完成这个任务,例如isEmpty和getCurrentSize。
问题1 使用UML表示法为函数编写规范,这个函数计算具有n个任意整数的数组中前5个正整数的和。