面向对象的思考过程(原书第5版)
上QQ阅读APP看书,第一时间看更新

前言

本书内容概要

正如书名所述,本书阐述了面向对象的思考过程。选择一本书的主题和书名是很重要的,但如果主题的概念性很强的话,做决定就没那么容易了。大部分书籍都只涉及编程与面向对象设计的某个方面。一些流行的书则阐述了诸如面向对象分析、面向对象设计、面向对象编程、设计模式、面向对象的数据结构(XML)、统一建模语言(UML)、面向对象Web开发、面向对象移动开发、各种面向对象编程语言等与面向对象编程(OOP)相关的主题。

然而,许多人仔细研读这些书后,未曾注意到这些主题都建立在同一个基础之上,即如何以面向对象的方式进行思考。从学生到软件开发专业人员,他们往往只是阅读了这些书,却没有付出充分的时间和努力来真正理解代码背后的设计理念。

我认为仅学习一种特定的开发方式、一种编程语言或者一组设计工具并不能说明学会了面向对象这一概念。面向对象的软件开发简单来说就是一种思考方式。本书就是关于这种面向对象的思考过程的。

把面向对象的思考过程从语言、开发实践以及工具中剥离出来并不是一个简单的任务。人们在学习面向对象这一理念时,往往被要求先深入学习一门编程语言。例如,很多年以前,大量的C语言程序员在没有直接接触面向对象概念之前,就开始通过C++语言来了解面向对象。

学习面向对象的概念与学习使用面向对象语言进行编程有着巨大差异,理解这一点很重要。我在撰写本书第1版前就意识到了这一点。Craig Larman在“What the UML Is-and Isn’t”一文中指出:

不幸的是,在软件工程和UML图表语言上下文中,阅读和编写UML标记的技能有时等同于面向对象分析和设计的能力。当然,事实并非如此,而且后者远比前者重要。因此,我推荐寻找一些教学材料来学习使用面向对象分析和设计的知识技能,这优先于学习UML标记或者辅助工具。

因此,尽管学习一门建模语言是非常重要的步骤,但先学习面向对象的技能更加重要。在完全理解面向对象概念前就学习UML,就像还未了解任何与电路相关的知识就开始学习电路图一样。

学习编程语言也有相同的问题。如前所述,很多C语言程序员还未直接了解任何面向对象概念,就想通过使用C++语言来达到面向对象的水平。在面试中经常会出现这样的情况,很多抱怨C++的程序员其实只是会简单使用C++编译器的C语言程序员。甚至现在,诸如C# .NET、VB .NET、Objective-C、Swift以及Java等语言已经相当普及了,但工作面试中的一些关键问题还是可以迅速暴露出这些程序员缺乏面向对象的思想。

Visual Basic的早期版本并不是面向对象的。C语言也不是面向对象的,而C++在设计时就向后兼容C语言。因此,使用C++编译器编写只含C语言语法的程序,而放弃使用C++的面向对象功能是完全可能的。Objective-C被设计为标准ANSI C语言的一个扩展。最糟糕的是,程序员可能使用“半瓶子”的面向对象功能把程序写成既不是面向对象的也不是面向过程的“四不像”产品。

因此,在学习使用面向对象的开发环境之前,先学习基本的面向对象概念至关重要。与其直接学习一门编程语言,不如把时间花在学习面向对象的思考过程上。

第5版中的新内容

就像在前言中经常提到的那样,我对第1版的愿景是坚持概念,而不是专注于某项特定的新兴技术。对于第5版,我仍然坚持这个愿景,但我也会介绍比早期版本中更多的“相反观点”。我想表达的是,尽管到目前为止,面向对象的软件开发是市面上最大的游戏,但它并不是唯一的游戏。

自从本书的第1版于1999年完成以来,市场上出现了许多技术,同时也有些技术已经逐渐消失。当时,Java刚刚发布,并且是最主要的面向对象开发语言;网页即将成为日常生活和商业的一部分。如今,我们都知道移动设备已经变得无处不在。在过去的20年中,软件开发人员经历了XML、JSON、CSS、XSLT、SOAP和RESTful Web服务。Android设备过去使用Java,现在使用Kotlin,而iOS设备使用Objective-C和Swift。

过去20年来,我们已经采用了许多技术(以及本书的前四版)。第5版的主要目标是将所有内容浓缩到第1版的初始意图,即简单的面向对象概念。我认为本书的第1版取得的所有成功,都是源于它专注于面向对象的基本概念。在某些方面,第5版囊括了前面所有版本提到的技术。

最后,将这些技术封装到设计方法中的概念由SOLID表示,该概念贯穿本书的所有章节。

SOLID原则是:

·SRP——单一职责原则

·OCP——开闭原则

·LSP——里氏替换原则

·ISP——接口隔离原则

·DIP——依赖倒置原则

本书的前9章代表了我认为的经典面向对象原则,而最后3章(关于设计模式、避免依赖和SOLID原则)代表了一种强大的方法论。

目标读者

本书是对面向对象基本概念的全面介绍。“概念”一词很重要——虽然可以通过使用代码示例来加深对本书中讨论的内容的理解,但本书的焦点是使读者理解面向对象的思考过程。对于程序员来说,需要强调一点:面向对象编程并不是唯一的标准(正如许多人认为的那样)——面向对象编程,仅仅是现代软件开发人员可以使用的庞大工具包的一部分。

当我于1995年首次准备本书第1版的素材时,面向对象的概念才刚刚兴起。我之所以这么说,是因为当时除了Smalltalk之类的面向对象语言外,还没有真正意义上的面向对象语言。不强制执行面向对象规则的C++,是当时占主导地位的C风格的编程语言。Java 1.0于1996年才发布,C# 1.0于2002年才发布。事实上,当本书的第1版于1999年出版时,我们还无法确定面向对象是否会真正成为领先的开发规则。(Java 2直到1998年12月才发布。)尽管面向对象编程目前占主导地位,但其中仍有一些有趣的问题需要解决。

显然,本书第1版的读者与今天的读者有所不同。

从1995年到2010年,我基本上是在面向对象的技术方面对许多结构化程序员进行重新培训。这些学员中的绝大多数都是在大学和工作期间,与COBOL、FORTRAN、C和VB一起成长的。而如今,大学毕业、编写电子游戏、创建网站,或创作移动应用程序的学生,几乎可以肯定已经学会了使用面向对象语言的编程。因此,本书这一版采用的方法与第1版或第2版等有很大不同。我们现在不是在教结构化程序员如何成为面向对象开发人员,而是在教那些使用面向对象语言成长起来的程序员。

本书适合任何想要全面了解面向对象概念的业务经理、设计师、开发人员、程序员和项目经理阅读。我的希望是,阅读本书能为学习更高级的主题奠定坚实的基础。

本书叙述方式

显然,我坚定地认为,熟悉面向对象的思考过程优先于学习编程语言或建模语言。本书中有不少代码示例及UML类图,但阅读本书并不需要掌握一门具体的编程语言或UML。我已经说过了要先学习概念本身,那为什么本书会有如此多代码和类图?

首先,代码和类图可以很好地展示面向对象概念。其次,它们对于面向对象的使用方式是极其重要的,有助于介绍和展示如何使用面向对象。关键在于不要过分关注Java、C#等编程语言,而应当使用它们来帮助理解面向对象的深层理念。

要注意的是,在理解类及其自身的属性和方法时我非常喜欢使用UML类图实现可视化。事实上,本书中只用到了UML组件中的类图。我认为UML类图提供了一种强大的方式来模拟对象模型的概念本质。我依旧使用对象模型作为教学工具来展示类的设计以及类之间的关系。

本书中的代码示例阐述了诸如循环和函数之类的概念。然而,理解代码本身并不是理解面向对象概念的先决条件。如果你想了解语言本身的更多细节,那么有一本讲解语言语法的书放在手边则非常有用。

我不能过分强调本书不教授Java、C# .NET、VB .NET、Objective-C、Swift或UML。你可以自学这些知识。同样重要的是要理解这是一本阐述概念的书。在本书中,示例的意图并非描述设计类的最佳方法,它们更是一种教育性的练习,旨在使你思考面向对象的概念。例如,很明显,你不会在工作中创建许多企鹅和无吠犬模型,但是使用它们是演示概念的一种有趣方式。考虑到所有这些,我希望本书能引起你对其他面向对象主题的兴趣,例如面向对象分析、面向对象设计和面向对象编程。