5.5 过多的类
Last updated
Last updated
学生们最常犯的错误是将他们的代码分为大量的浅类,这导致了类之间的信息泄露。一个小组使用了两个不同的类来接收HTTP请求;第一个类将请求从网络连接中读成一个字符串,第二个类则解析这个字符串。这是一个时序分解的例子(“首先我们读取请求,然后我们解析它”)。发生信息泄露的原因是,如果不解析大部分信息,就无法读取HTTP请求;例如,请求头中的Content-Length
规定了请求体的长度,所以必须解析请求头以计算请求的总长度。因此,这两个类都需要理解HTTP请求的大部分结构,而且解析代码在两个类中都是重复的。这种方法也给调用者带来了额外的复杂性,他们必须以特定的顺序调用不同类中的两个方法来接收一个请求。
由于这两个类共享如此多的信息,最好是将它们合并到一个处理请求读取和解析的类中。这提供了更好的信息隐藏,因为它将所有关于请求格式的知识隔离在一个类中,而且它还为调用者提供了更简单的接口(只有一个方法可以调用)。
这个例子说明了软件设计中的一个普遍的主题:信息隐藏通常可以通过将一个类变得稍微大一点来改善。这样做的一个原因是将所有与某一特定能力(如解析HTTP请求)相关的代码集中在一起,这样产生的类就包含了与该能力相关的一切。增加类的大小的第二个原因是为了提高接口的水平;例如,与其为一个计算的三个步骤中的每一步都采用单独的方法,不如用一个方法来执行整个计算。这可以带来更简单的接口。这两个好处都适用于上一段的例子:合并类将所有与解析HTTP请求有关的代码集中在一起,并且将两个外部可见的方法替换为了一个。合并后的类比原来的类更深。
当然,也有可能把更大的类的想法做得太过火(比如整个应用程序都用一个类)。将讨论在哪些条件下,将代码分离成多个小类是有意义的。