先说明能做什么
队列可以由创建、加入、取出和判空等操作描述,使用者不必先知道它由数组还是链表存储。抽象数据类型关注这种操作层面的约定:哪些值可以建立、操作接收什么、结果应该遵守什么关系。它把一个数据结构的用途与一份具体存储布局分开。
隐藏表示保护约束
如果调用者能够任意修改内部节点或计数,就可能产生操作无法正确处理的状态。隐藏表示使构造和更新经过受控接口,帮助维护内部约束。OCaml的模块签名可以只公开类型名与操作,而不公开类型的具体定义;这是一种语言工具,不等于程序仅靠命名约定就获得同样保护。
实现可以更换但约定要保持
相同接口之下,可以用不同结构实现队列,但它们仍应保持先入先出等约定。内部变化也可能改变时间和空间成本,因此“调用代码不用改”不等于性能完全不变。接口若遗漏空队列取出等情况的说明,使用者仍需面对歧义;抽象不能替代对操作行为的清楚定义。
抽象类型与类不是同义词
模块系统能够提供抽象类型,而不要求每份数据都是带方法的类实例;类也不一定隐藏所有表示。两者在封装问题上有交集,却使用不同组织方式。ML证明工具用抽象类型限制定理值的构造,正体现了这一边界:使用者能够组合合法操作,但不能直接伪造内部数据来绕过约束。