本书涵盖范围.
顾名思义,这是一本关于面向对象(object-oriented,OO)思想的书。显然,选择书的主题和书名非常重要,不过,做出这些决定并不那么容易。有很多书已经在不同层面讨论了面向对象。一些畅销书讨论了OO分析、OO设计、OO程序设计、设计模式、OO数据(XML)、UML(Unified Modeling Language,统一建模语言)、OO Internet开发以及各种OO编程语言等主题,还涉及了有关OO开发的许多其他方面。
不过,如果陷入如此众多浩如烟海的书中,很多人会忘记最根本的一点,即所有这些主题都建立在一个共同的基础之上:如何用OO的方式思考。遗憾的是,软件专业人员往往没有花费适当的时间和精力来真正理解基本概念,就匆忙地一头扎入这些书中。
我要申明的是,学习OO概念绝对不是通过学习一种特定的开发方法或者一套工具就能做到的。简单地讲,采用OO的方式行事是一种思维方式。本书就专门讨论OO思维过程。
将具体的方法和工具与OO思想区分开并不容易。很多人都是通过某种方法或工具才开始接触到OO概念的。例如,很多年以前,大多数C程序员最早都是通过直接移植到C++才对面向对象有所了解的,而在此之前,他们甚至根本没有接触过任何OO概念。其他软件专业人员最早了解面向对象,也是因为看到了一些包含UML对象模型的演示,同样,他们此前完全没有直接接触过OO概念。很多编程书和课程直到学习过程后期才谈到OO概念,这种情况并不鲜见。
重要的是,需要了解学习OO概念与使用支持OO的方法和工具之间存在着显著差别。在我写本书的第1版之前就注意到了这个问题,那时我读了一些文章,比如Craig Larman的“What the UML Is—and Isn’t”。在这篇文章中,他指出:
遗憾的是,在软件工程和UML图示语言领域中,有人认为读写UML记法的技巧有时与面向对象分析和设计的技巧地位相同。当然,事实并非如此,后者要比前者重要得多。因此,强烈建议寻找适当的教学培训和教学资源,其中要更强调面向对象分析和设计的技术技巧,而不只是介绍UML或某个用例工具的使用。
尽管学习建模语言是很重要的一步,但首先学习OO技巧更为重要。如果在学习OO概念之前先学UML,这就像是在完全不知电为何物的前提下学习如何读懂电路图。
学习程序设计语言也存在同样的问题。如前所述,很多C程序员都是通过移植到C++而转向面向对象领域,但在此之前他们没有直接接触过OO概念。这一点往往会在程序员面试时暴露出来。很多情况下,程序员声称自己是C++程序员,但实际上他们只是使用C++编译器的C程序员。即使是现在,尽管有C#.NET、VB.NET和Java等优秀的语言可以使用,但在求职面试中,几个关键问题就能很快暴露出面试者缺乏对OO的理解。
VB的早期版本不是OO的。C也不是OO的,C++则开发为与C向后兼容。正因如此,完全可以使用一个C++编译器(只使用C语法编写代码)而不利用C++的任何OO特性。更糟糕的是,如果程序员做法不当,只是使用一些OO特性就能让OO程序员和非OO程序员都无法读懂他的程序。
因此,如果你正在OO开发的道路上探索,最重要的就是首先学习基本的OO概念。一定要抵制住诱惑,不要贸然直接沉溺到某种编程语言中(如VB.NET、C++、C#.NET或Java),或者深陷到某种建模语言中(如UML),应当花些时间来学习面向对象思维过程。
20世纪80年代末,在我学Smalltalk的第一堂课上,老师告诉全班同学,新的OO范型是一种全新的思维方式(尽管早在60年代它就已经存在了)。他还说,尽管我们都很有可能成为非常棒的程序员,但是我们当中大约10%~20%的人可能无法真正领悟OO的工作方法。如果他所讲的是真的,这很可能就是因为一些人根本没有花时间先完成开发范型的转换并学习基本的OO概念。
第3版新增内容
至此已经多次提到,第1版主要是作为一本介绍概念的书。尽管第2版和第3版仍然追求这个目标,但我又做了补充,增加了一些与面向对象概念密切相关的应用主题。在第3版中,我扩展了第2版中的许多主题,并加入了一些全新的章节。经过修订和更新的概念包括:
XML用于对象通信;
对象持久性和串行化;
XML集成到语言对象定义;
为属性增加特性;
基于XML的因特网应用;
客户/服务器技术;
.更多采用Java、C#.NET和VB.NET编写的代码示例。
介绍这些主题的各章从本质上讲仍是概念介绍,不过,很多章都包含Java代码,用来展示这些概念是如何实现的。第3版中很多章后面还增加了一个代码附录,列出了该章中的C#.NET和VB.NET示例。
本书面向的读者
本书提供了基本OO概念的一般性介绍,并通过代码示例来强调这些概念。在提供技术性很强的实际代码的同时,还要保证内容作为概念性介绍,这是本书最大的难点之一。本书的目标是使读者理解OO概念和技术,不需要借助编译器。不过,如果读者手头确实有一个编译器可用,那么完全可以利用本书中提供的代码进行分析研究。
本书面向的读者包括企业经理、设计人员、开发人员、程序员、项目经理以及想粗略了解面向对象是什么的任何人。读这本书将会为你奠定坚实的基础,使你能够顺利地转向讨论更高级OO主题的其他图书。
在这些更高级的书中,Stephen Gilbert和Bill McCarty著的Object-Oriented Design in Java一直是我最喜欢的书之一。我非常推崇这本书的方法,甚至在我讲授的一门有关OO概念的课程中,还把这本书作为教材。本书中会经常引用Object-Oriented Design in Java,建议你读完本书后一定要好好研读该书。
还有一些书我认为很有帮助,包括Scott Meyers所著的Effective C++、Stephen R. Schach所著的Classical and Object-Oriented Software Engineering、Bruce Eckel所著的Thinking in C++、Martin Flower所著的UML Distilled,以及Peter Coad和Mark Mayfield合著的Java Design。
由于本书本质上是概念性介绍,所以相对于其他计算机技术书,它采用了一种独特的视角。强调特定技术(如编程语言)的书一直在随技术的演变而改变,而本书则有一个得天独厚的优势,它介绍的是成熟的概念,尽管可能会稍稍有所调整,但不会发生根本性的改变。基于此,多年前所引用的很多书如今仍为本书所引用,因为概念基本上是一样的。
本书内容
很显然,我坚信在深入某种编程语言或建模语言之前必须先熟悉面向对象思维过程。本书中包含大量代码示例和UML图,不过,阅读本书并不要求你了解某种编程语言或UML。毕竟我说过要先学习概念,那么为什么这里又有那么多Java、C#.NET和VB.NET代码,还有那么多UML图呢?首先,这些代码和UML图可以很好地解释OO概念;其次,它们对于OO过程都至关重要,应当在入门阶段就明确。但关键是不要把重点放在Java、C#.NET和VB.NET或UML上,而只是使用它们来帮助理解基本概念。
本书中的Java、C#.NET和VB.NET示例展示了循环和函数等概念。不过,理解代码本身并不是理解概念的先决条件。如果你还想更详细地了解,最好手边准备一本介绍具体语言语法的书。..
必须强调,本书并不会教你Java、C#.NET和VB.NET或UML,其中任何一种语言本身都需要整本书来介绍。我对本书的期望是,你可以把它作为学习其他OO主题(如OO分析、面向对象设计和OO程序设计)的“开胃小菜”。
本书约定
本书使用以下约定:
代码行、命令、语句和与代码相关的词都采用等宽字体(如Courier)。
代表实际键入内容的占位符采用斜等宽字体(如Courier)。要键入的文本采用粗等宽字体(如Courier)。
贯穿全书有一些特殊内容,如
注解
注解表示与当前讨论内容相关的有趣信息,可能更深入,或者引申出一种新技术。
提示
提示会提供一些建议,或者向你展示一种更简便的做法。
注意
注意会提醒你可能存在某种问题,提出如何避免这个问题的有关建议。
本书源代码
可以从图灵网站(www.turingbook.com)免费注册下载本书中讨论的所有源代码和示例。
致谢
与前两版一样,这本书是很多人通力合作的结果。我非常希望能够向尽可能多的人表示感谢,因为没有他们的帮助,这本书绝对无法问世。
首先,也是最重要的,我要感谢我的妻子Sharon,感谢她的全力帮助。在这本书漫长的写作过程中,她给予了我无尽的支持和鼓励,而且她还是全部手稿的第一位文字编辑。
还要感谢我的母亲以及其他家人对我始终如一的支持。
在完成这本书的3个版本期间,我与Pearson出版社工作人员的合作非常愉快。与编辑Mark Taber、Seth Kerney、Vanessa Evans和Songlin Qiu共事确实是一件乐事。
还要特别感谢Jon Upchurch的帮助,他帮助我改进了大量代码,并完成了手稿的技术编辑。
最后要感谢我的女儿Stacy和Stephanie,还要感谢我的猫咪Duffy常伴我左右。...