超越类:包
类是当前程序员们实现模块化(modularity)的最佳方式。不过模块化是个很庞大的话题,其影响范围要远远超出类。在过去几十年间,软件开发的进展在很大程度上要归功于我们在编程时进行工作的粒度的增长。首先是语句,这在当时算得上是自从机器指令以来迈进的一大步。接下来就是子程序,再后来则是类。
很显然,如果我们能有更好的工具来把对象聚合起来,我们就可能更好地朝着抽象和封装的目标迈进。Ada语言早在十多年前就已经支持包(package)的概念了,现如今Java语言也支持包了。如果你所用的编程语言不能直接支持包的概念,你也可以自行创建自己的包(的“可怜程序员版/poor-programmer’s version”),并通过遵循下列编程标准来强制实施你的包:
■ 用于区分公用的类和包私用的类的命名规则
■ 为了区分每个类所属的包而制定的命名规则和/或代码组织规则(即项目结构)
■ 规定什么包可以用其他什么包的规则,包括是否可以用继承和/或包含等
这些变通之法也是展示“在一种语言上编程”和“深入一种语言去编程”之间区别的好例子。关于这一节的更多信息,请参见第34.4节“深入一种语言去编程,而不仅是在一种语言上编程”。
|
CHECKLIST: Class Quality 对表:类的质量 q 你是否把程序中的类都看做是抽象数据类型了?是否从这个角度评估它们的接口了? 抽象 q 类是否有一个中心目的? q 类的命名是否恰当?其名字是否表达了其中心目的? q 类的接口是否展现了一致的抽象? q 类的接口是否能让人清楚明白地知道该如何用它? q 类的接口是否足够抽象,使你能不必顾虑它是如何实现其服务?你能把类看做黑盒子吗? q 类提供的服务是否足够完整,能让其他类不用动用其内部数据? q 是否已从类中除去无关信息? q 是否考虑过把类进一步分解为组件类?是否已尽可能将其分解? q 在修改类时是否维持了其接口的完整性?
封装 q 是否把类的成员的可访问性降到最小? q 是否避免暴露类中的数据成员? q 在编程语言所许可的范围内,类是否已尽可能地对其他的类隐藏了自己的实现细节? q 类是否避免对其使用者,包括其派生类会如何使用它做了假设? q 类是否不依赖于其他类?它是松散耦合的吗? 继承 q 继承是否只用来建立“是一个/is a”的关系?也就是说,派生类是否遵循了LSP(Liskov替换原则)? q 类的文档中是否记述了其继承策略? q 派生类是否避免了“覆盖”不可覆盖的方法? q 是否把公用的接口、数据和行为都放到尽可能高的继承层次中了? q 继承层次是否很浅? q 基类中所有的数据成员是否都被定义为private而非protected的了? 跟实现相关的其他问题 q 类中是否只有大约七个或更少的数据成员? q 是否把类直接或间接调用其他类的子程序的数量减到最少了? q 类是否只在绝对必要时才与其他的类相互协作? q 是否在构造函数中初始化了所有的数据成员? q 除非拥有经过测量的、创建浅层复本的理由,类是否都被设计为当作深层复本使用? 与语言相关的问题 q 你是否研究过所用编程语言里和类相关的各种特有问题? |
Aditional Resources
更多资源
Meyer, Bertrand. 《Object-Oriented Software Construction》, 2d ed. New York, NY: Prentice Hall PTR, 1997. 这本书详细地讲解了抽象数据类型,并解释了它是如何构成类的基础的。第14至16章深入地讲解了继承。在第15章中,Meyer提出了支持多重继承的正面论据。
Riel, Arthur J. 《Object-Oriented Design Heuristics》. Reading, MA: Addison-Wesley, 1996. 这本书就如何改善程序的设计给出了大量的建议,这些建议大多是从类的角度出发的。有几年时间我一直回避这本书,因为它看上去实在太庞大了。不过,这本书的主体部分只有约200页厚。Riel的写作风格通俗易懂,令人赏心悦目。这本书内容集中,很有实用性。
C++
Meyers, Scott. 《Effective C++: 50 Specific Ways to Improve Your Programs and Designs》, 2d ed. Reading, MA: Addision-Wesley, 1998。
Meyers, Scott, 1996, 《More Effective C++: 35 New Ways to Improve Your Programs and Designs》. Reading, MA: Addison-Wesley, 1996. Meyers的这两本书都可以称得上是C++程序员的圣典了。他的书在诙谐之中向我们传达了一位语言大师对于C++细微之处的品味。
Java
Bloch, Joshua. 《Effective Java Programming Language Guide》. Boston, MA: Addison-Wesley, 2001. Bloch在该书中给出了很多关于Java语言的实用建议,同时也介绍了一些更为常用的、合理的面向对象实践。
Visual Basic
下面这几本书都是与Visual Basic中的类相关的不错的参考资料:
■ Foxall, James. 《Practical Standards for Microsoft Visual Basic .NET》. Redmond, WA: Microsoft Press, 2003.
■ Cornell, Gary, and Jonathan Morrison. 《Programming VB .NET: A Guide for Experienced Programmers》. Berkeley, CA: Apress, 2002.
■ Barwell, Fred, et al. 《Professional VB .NET》, 2d ed. Wrox, 2002.
Key Points
要点
■ 类的接口应提供一致的抽象。很多问题都是由于违背该原则而引起的。
■ 类的接口应隐藏一些信息——如某个系统接口、某项设计决策、或一些实现细节。
■ 包含往往比继承更为可取——除非你是要对“是一个/is a”的关系建模。
■ 继承是一种有用的工具,但它却会增加复杂度,这有违于软件的首要技术使命——管理复杂度。
■ 类是管理复杂度的首选工具。要在设计类时给予足够的关注,才能实现这一目标。







