出版日期:2009年3月                           版次:2009年3月第1次印刷    编目分类: 计算机                          读者定位: 开本:185×260                                印张: 20.5
字数:499千字                              装帧: 平装                              版别:第1版
内容提要:本书全面介绍了Java面向对象程序设计的原理和模式,帮助解决Java程序中的设计问题。此外,该书十分注重Java面向对象程序设计的每个细节,以及继承、方法类、设计模式等在程序设计中起到的关键作用,浓缩了Java的精华。在进行理论介绍的同时,本书十分重视实践技能的培养,一些较为综合的实例贯穿了相关的知识点,使学生理解并掌握它们在程序设计中的真正用处和在提升程序性能方面的作用。   本书不但可作为高校计算机科学专业和教材,还可作为Java程序设计人员的必备参考书。
0.1 本书简介 本书是关于面向对象设计(object-oriented,OO)的介绍,主要面向计算机科学二年级或者更高年级的本科生。本书根据“优雅”(elegance)一词讨论了软件的设计和实现,该词将在第1章中定义。本书将首先回顾面向对象编程的概念,然后介绍软件设计的基本技术、编码风格、重构、UML和设计模式的内容。 本书通过多个实例、一个小型案例分析和两个中等规模的案例分析来介绍设计原则和模式。这些原则和模式都是在需要利用它们来解决设计方面的问题时引入的。在本书中,多个实例和案例分析都会从针对问题的一个“明显的”解决方案开始,然后通过讨论该初始解决方案的优缺点,逐步将其优化为更加优雅的解决方案。 本书并不是要致力于成为关于编码和设计优雅性的完整的、权威的“圣经”。实际上,本书是对于在达到优雅性的这个目标的过程中将会涉及到的很多话题的一个介绍。本书为需要进一步了解这些话题的学生提供了进一步学习的参考文献。 本书中所有的讨论和例子都基于Java 1.5给出,但是提出的概念和原则几乎都具有通用的面向对象的属性,所以可以适用于利用其他面向对象语言的设计和实现。 本书包括了大量的练习题。从第2章到第9章,每章平均有18道练习题。这些练习题包括考察学生关于该章所介绍内容的理解程度的简单测试,但大部分的练习题包括的内容都无法在正文中加以介绍,否则,就会偏离正文的主题太远,并且导致正文过于庞大。 0.2 写作目的 ACM/IEEE的模式课程(ACM/IEEE model curriculum,CC2001)提出“编程的介绍性课程通常过于简化了编程的过程,以使其适用于新生,这些课程相对于概念上简化了的编码过程,对于设计、分析和测试强调得太少了。所以,学生掌握了编程技术的表象,掩盖了他们其实缺乏基本技术的事实,这将会限制学生在未来适应各种不同问题的能力,并限制他们适应解决问题的各种背景的能力”[1]。 上面的叙述很好地总结了笔者在过去20年讲授计算机科学的过程中遇到的情况,尤其是当笔者所在的系10年前使用Java作为介绍性课程以及许多高级课程的实现语言时遇到的情况。在我们的学生使用Java完成了CS1和CS2的课程后,他们知道如何设计和编写可以工作的代码,但是笔者在发现他们并不知道如何设计并编写可读、可维护的代码时,感到十分挫败。同时,当笔者发现这些学生对于Java的面向对象特性(继承、接口、静态变量/实例变量、静态方法/实例方法、动态方法调用)的理解十分肤浅时,也非常有挫败感。比如,如果事先向他们提供继承或者接口,他们会使用,但是如果要求他们自己设计软件的时候,他们就不能恰当地使用继承或者接口。 这样的挫败感部分来源于CS1和CS2课程自身,这些课程需要覆盖太多其他材料,所以在一个学期内没有时间以一种有意义的方式提到面向对象设计和实现的原则。问题之一在于面向对象设计原则事实上在大的应用中比较能体现出自身的优势,但是似乎对于同学们来说,面向对象设计原则对于小的应用,比如我们的CS1和CS2的课程,就大材小用了。在高级课程中,面向对象设计原则将充分发挥作用以协助大型的编程项目,但是此时,学生们却无法鉴赏好的设计,因为他们几乎没有对于大型项目的经验,无论是好的项目还是坏的项目。 作为一名教授,笔者强烈觉得面向对象设计,包括设计模式的使用,是学生们需要具备的重要的技术。而且,笔者希望能和学生们分享一下对于“优雅”设计的热爱。希望同学们对于软件设计能够培养出一种审美感,使得他们可以分辨什么时候软件“闻起来很糟”(smell bad,由Martin Fowler[2]提出),什么时候闻起来很好。希望他们可以将审美感培养到这种程度,即看到优秀的代码时能“全身上下感受到喜悦的颤动”(正如笔者在课程中曾经提出的),而对拙劣的设计则会“反感到想要逃离”。Donald Knuth[3]说过计算机编程既是一门科学,也是一门艺术,它包含创造力和美感。希望同学们可以向艺术家一样,尝试创建具有美感的对象。当成功创建的时候,他们会对自己的工作感到足够的骄傲,以致于同学们会想要像艺术家一样,在作品上签上自己的名字。 本书正是为了帮助指导学生设计和编写出漂亮的面向对象软件。 0.3 读者对象 本书面向已经学习过编程的介绍性课程(CS1)和数据结构课程(CS2)的本科生,但是这些本科生的课程中还没有涵盖大量关于面向对象设计原则和设计模式的内容。本书可以作为大学二年级学生的、循序渐进的第三课程的主要课本,或者本书也可以作为数据结构课程的补充教材。又或者,本书可以作为关于面向对象软件设计的本科生的高级课程的主要教材或者补充教材。 本书假设学生们已经具有如下的背景: ● 编程经验,例如在CS1课程中获得的经验 ● 关于数据结构的基本知识,例如在CS2课程中学习到的知识 ● 关于Java基本原理的理解,如果某个课程曾经是用Java进行教学的,那么就应该具有这些知识 ● 对于下面的Java特性有一些熟悉: • 泛型(来自Java 1.5) • 抛出和捕捉异常 • 内部类 • AWT或者Swing程序包(第8章) 如果对这些话题并不熟悉的话,学生可以在课程的合适阶段学习相关内容。本书和一些可选练习题中都提及了Java的反射能力以及Java线程,但是并不需要提前具备这些知识。 本书使用了四种UML图(状态图、顺序图、状态机图和用例图),但是不需要提前具备UML的知识,因为本书会在第一次使用到UML的时候,对进行适当的介绍。本书还将在附录A中对这四种图进行更深入的介绍。 0.4 教学方法 本书试图通过软件解决方案的演化,指导学生进行面向对象的设计和实现。正如前面提到的,在学生们学习了一系列的介绍性课程之后,他们将知道如何找到解决方案,但是通常却无法分辨不同的解决方案的区别。因此,本书试图首先介绍问题,然后讨论学生很可能首先提出的“明显的”、但是往往是不优雅的解决方案,逐步建立学生对编程过程的理解。然后讨论该解决方案的优缺点,随后给出更好的设计。接着再次讨论新解决方案的优缺点,而这往往会引出更好的设计。通过这种方法,本书在用优雅的方式解决特殊问题的过程中,还将介绍所有重要的软件设计原则和模式。 0.5 本书内容 本书大致可以分为四个部分。 第一部分(第1章)十分简短,实际上类似于简要的介绍。它为本书的其他部分提供了出发点和动机,所以对于理解后续章节的内容是十分重要的。 第二部分(第2~3章)包含了对面向对象基本概念的回顾,比如对象、类、方法、继承、多态和动态方法调用。这部分还讨论了继承的正确使用和错误使用。 第三部分(第4~6章)介绍了设计和实现的优雅性。该部分首先讨论了底层实现的话题,例如编码约定和术语。然后讨论了通用的设计原则。接着介绍一个小规模的案例分析(Money类的设计)。 第四部分(第7~9章)介绍了设计模式。第7章介绍了设计模式的概念,并讨论了几个最简单的模式。随后是两个中等规模的案例分析(一个绘图应用程序和一个语言分析器)。这些章节在案例分析中涉及到新的特性时,逐渐会介绍一些新的模式和原则。 除此之外,本书还包含了两个附录。附录A讨论了关于本书使用的四个UML模式(类、顺序、状态机和用例)的更细节的内容。附录B涵盖了Sun Microsystems [4]提供的Java的许多编码约定,尤其是Javadoc的标记法。除了Javadoc外的大部分编码约定都可能是学生熟悉的内容,但是出于完整性的考虑,本书还是将这些内容列在了附录B中。 下面是关于各章内容的详细信息: 1. 第1章是对本书的介绍和总结。本章定义了“优雅的”的软件,即可用的、完整的、健壮的、高效的、可伸缩的、可读的、可重用的、简洁的、可维护的以及可扩充的软件。笔者试图激发学生学习面向对象设计的动力,这样学生才能够领悟学习本书的价值。 2. 第2章是关于面向对象编程的基本特性的回顾。第2章的目的就是回顾这些学生可能已经学过,但是却没有能够很自如地运用的面向对象的主题。本章提供了学习这些特性的一些动机,这样学生就可以开始培养一种关于面向对象编程相对于非面向对象编程的优点的审美感。 3. 因为实现继承十分复杂并且很容易用错,所以笔者认为需要对此话题进行大量的讨论。笔者将此内容另设了一章,而不是全部填塞在第2章中。所以,第3章讨论了什么时候应该使用实现继承,以及什么时候不应该使用实现继承。该章首先讨论了继承的4个观点,并给出例子来证明,这些观点中大部分都无法独立地显示其充分性。本章还讨论了在什么情况下,应该使用委托来代替继承。 4. 优雅性不仅对于设计阶段十分有用,而且在实现阶段也十分有价值。因此,笔者增加了第4章来讨论实现方法时应该遵循的原则,第4章也包括一些编码约定。在本书的第4章增加这些内容,也是为了便于在后续章节的样例代码和案例分析中涉及到相关内容的时候,可以进行查阅。笔者也希望以一些学生已经熟悉的内容来开始第4章的介绍。第4章还对Java中的equals方法和clone方法进行了大量的讨论,以展现这样一个观点:当需要遵循一些原则时,就需要十分仔细地对方法进行实现。 5. 第5章开始了对于面向对象设计的重点讨论。本章包括了面向对象设计的许多基本原则,对于每个原则,都将介绍其动机以及一个相关例子。 6. 因为这样的设计原则只有在大型(至少不是小型)的例子下才能更好地鉴赏,所以笔者在第6章中列举了一个这样的例子作为案例分析。笔者希望能列举一个学生感兴趣的例子,但是该例子同时也要能够引出一些有趣的设计话题。因而,笔者选择Money类的设计作为分析的案例。 7. 第7章介绍了设计模式。本章通过讨论几个最简单的模式来展示什么是设计模式,以及它们如何在开发优雅的设计中发挥作用。 8. 第8章包含了关于绘图程序的一个较大型的案例分析。该应用基于Kent Beck以及Ralph Johnson[5]开发的HotDraw架构以及John Vlissides[6]的部分工作。首先给出了一个简单的绘图程序,然后逐渐增加新的特性。每个特性的优雅设计通常都会引入一个新的设计模式。 9. 最后一章介绍了另一个案例分析。该案例分析是关于Java子集的分析器。本章中又介绍了几个新的设计模式,例如,本章在讨论由分析器生成的抽象语法树的使用时引入的访问者(Visitor)模式。 0.6 各章关系 第1章应该最先阅读,因为它为后续的章节提供了上下文环境,并且定义了设计和代码的“优雅性”。 第2章和第3章涉及面向对象的基本概念,如对象、类、多态、动态方法调用和继承。所有后续的章节都将会使用这两章的内容。如果学生对这些话题已经非常熟悉,那么可以略过这两章。 第4章和第5章是本书的核心内容,所以所有的学生都需要阅读这两章的内容,尽管第4章的大部分内容对于某些学生而言,可能是十分熟悉的了。 第6章是选读内容。这一章的案例分析使用了第4章和第5章中讨论过的设计原则。 第7章介绍了设计模式。如果学生对这个概念已经非常熟悉,就可以略过这一章。但是学习这一章中介绍的模式对学生来说,还是非常有益的。对于设计模式的动机来源于第4章和第5章的内容。 第8章和第9章是选读内容。这两章在两个案例分析的上下文中介绍了一些新的设计模式。这两章依赖于第4、5、7章中介绍的内容。 附录A和附录B是选读内容。在本书第一次使用UML图的时候,会简要解释这些图和图标。 0.7 本书和ACM模式课程(CC2001)[1]的匹配性 CC2001课程的两个核心知识单元就是PL6和SE1。这两个单元包括如下主题: PL6 面向对象设计 封装和信息隐藏 行为和实现的分离 类和子类 继承(重写、动态调度) 多态(子类型多态与继承) 类层次结构 集合类和迭代协议 对象和方法表的内部表示 SE1 基础设计概念和原则 设计模式 软件体系结构 结构化设计 面向对象分析和设计 组件级别设计 可重用设计 本书实际上包含了这些知识单元的所有内容。本书的案例分析也包含了PF5的内容、HC2的大部分内容以及PL3和PF3的部分内容。将CC2001特别工作组认为是必要的中等规模的团队开发项目,与使用本书的课程相结合是一件很好的做法。 0.8 主要特色 1. 根据代码“优雅性”讨论设计和实现。 2. 使用几个小型和两个中型案例分析来介绍设计原则和模式。在案例分析中需要解决设计方面的问题时,会引入这些原则和模式以解决问题。 3. 许多例子和案例分析都从对问题的一个“明显的”解决方案开始,然后通过讨论这个初始方案的优缺点,将它逐步演化为更加优雅的解决方案。 4. 讨论了如下的话题: (1) 面向对象的基本概念(类、对象、继承、多态、方法)。 (2) 编码风格和实现的话题,如合适的命名以及文档,包括前置条件、后置条件和不变式。 (3) 基本的面向对象设计原则,实际上包括CC2001模式课程中PL6和SE1知识单元的所有主题。 (4) 设计模式。大部分设计模式均在解决某个问题的背景中引入。 5. 在每章的最后都有大量的各种难度的练习题(总共144题,平均每章18题),从考察学生对于该章节知识的理解程度的简单测试,到要求学生对现存的代码进行大量修改或者改善的练习题。 0.9 其他特色 教师用书包含大部分练习题的答案,以及配合本书可以布置给学生的一些中等规模的项目的描述。该书还包括了讲授课程的教学建议。 0.10 参考文献 1. Computing Curricula 2001, Computer Science Volume. 2001. [Cited March 28, 2007; available from ] 2. Fowler, M., Refactoring, Improving the Design of Existing Code. Object Technology Series. 1999. Addison-Wesley. Reading, MA. 3. Knuth, D., Literate Programming. 1992. Chicago, IL: University of Chicago Press. 4. Sun Microsystems, I. Code Conventions for the Java Programming Language. 1999. [Cited March 28, 2007; available from ] 5. Beck, K. and R. Johnson, Patterns generate architectures. In European Conference on Object-Oriented Programming (ECOOP’94). 1994. Bologna, Italy: Springer-Verlag. 6. Vlissides, J., Tooled composite. C__ Report. September 1999.