7.4 接口与实现
“不同的层,不同的抽象”规则的另一个应用是,一个类的接口通常应该与它的实现不同:内部使用的表示方法应该与出现在接口中的抽象不同。如果两者的抽象相似,那么这个类可能就不是很深。例如,在第6章讨论的文本编辑器项目中,大多数团队以文本行为单位实现了文本模块,每行单独存储。一些团队还围绕行来设计文本类的API,如getLine
和putLine
等方法。然而,这使文本类变得浅且难以使用。在更高级别的用户界面代码中,在行的中间插入文本(例如,当用户正在打字时)或删除跨行的一段文本是很常见的。使用文本类的面向行的API,调用者被迫分割和连接行来实现用户界面的操作。这段代码并不简单,而且它被重复并分散在用户界面的实现中。
当文本类提供面向字符的接口时,使用起来就容易多了,比如一个insert
方法可以在文本的任意位置插入一个任意的文本字符串(可能包括换行符),一个delete
方法可以在文本的两个任意位置之间删除文本。在内部,文本仍然以行为单位表示。一个面向字符的接口将行的分割和连接的复杂性封装在文本类内部,这使得文本类更深,并简化了使用该类的高级别代码。采用这种方法,文本API与面向行的存储机制有很大的不同;这种不同表示该类提供了有价值的功能。
Last updated