程序员的底层思维
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.4.5 抽象设计要完整

好的抽象设计是内聚而完整的。为了支持相关的方法,可能会影响抽象的内聚性和完整性。例如,要在数据结构中添加和删除元素,抽象该数据结构的类型必须同时支持方法add()和remove();如果只支持相关方法中的一个,那么抽象设计就不是内聚和完整的。

例如,在JDK 1.1的接口javax.swing.ButtonModel中,只提供了setGroup()方法,而没有提供getGroup(),这是一种典型的“不完整的抽象设计”坏味道。修复它的最理想的方法是在这个接口中定义方法getGroup(),然而由于JDK是公开的API,在接口上添加方法将破坏实现了该接口的既有类。为了向后兼容,在JDK 1.3中,将方法getGroup()加入了派生类DefaultButtonModel中。

这个例子告诉我们:修改接口是一件很难的事情,因此在最初设计API的时候,要尽量做到抽象完整。

有一种检查抽象设计是否完整的方法,是查看接口或类是否缺少“互补和对称”。如果缺少,则可能存在着“不完整的抽象设计”。表1-1列出了一些常见的互补方法对,请注意这些方法名会根据不同的情况而有差异。例如,在表示栈的类中,会使用操作名push和pop;而在数据流中,同样的操作可能使用名称source和sink。

表1-1 一些常见的互补方法对