新書推薦:
《
别纠结啦:不被情绪牵着走的通透生活指南(“当代一休”小池龙之介治愈新作!附赠精美书签!)
》
售價:NT$
295.0
《
第二人生:找到重新定义人生的智慧
》
售價:NT$
440.0
《
唐朝三百年
》
售價:NT$
490.0
《
反操纵心理学:夺回人生主导权 拒绝被操纵
》
售價:NT$
249.0
《
同工异曲:跨文化阅读的启示(修订版)(师承钱锺书先生,比较文学入门,体量小但内容丰,案例文笔皆精彩)
》
售價:NT$
199.0
《
牛津立法研究手册
》
售價:NT$
1630.0
《
制度为什么重要:政治科学中的新制度主义(人文社科悦读坊)
》
售價:NT$
290.0
《
梦醒子:一位华北乡居者的人生(1857—1942))(第2版)
》
售價:NT$
340.0
|
編輯推薦: |
面向对象编程(OOP)是现代编程语言(包括C 、Java、C#、Visual Basic .NET、Ruby、Objective-C和Swift)的基础。对象也构成了许多Web技术(如JavaScript、Python和PHP)的基础。
在开始使用面向对象的开发环境之前,了解面向对象的基本概念至关重要。OOP促进了良好的设计实践、代码可移植性和重用性,但是需要转变思维才能完全理解OOP。刚接触OOP的程序员应该抵制直接跳入特定编程语言或建模语言的诱惑,首先花时间学习本书作者提出的“面向对象的思考过程”。
尽管编程技术多年来一直在变化和发展,但是无论平台如何演进,面向对象仍然是一个不变的概念。本书侧重于在过去20年中幸存下来并保持其核心的OOP技术,其中包括新的和扩展的设计模式、避免依赖关系以及SOLID原则,以帮助开发人员使软件设计易于理解、灵活和可维护。
通过阅读本书,你将学到:
面向解决方案的方法
继承和组合的正确用法
聚合和联合之间以及接口和实现之间的重要区别
第5版新增内容
相比前几版而言,作者对内容做了大量修改,删除了一些与面向对象不太相关的章节,突出了
|
內容簡介: |
本书是一部独具特色的面向对象技术著作。书中结合代码示例生动透彻地讲述了面向对象思想的精髓,让读者真正学会以对象方式进行思考。本书共15章,在结构上可以分为两部分:第壹部分包括第1~10章,探讨面向对象的基本概念,比如封装、多态、继承等;第二部分包括第11~15章,专注于将这些概念应用于一些通用的面向对象技术中,并结合了一些实用的应用程序。
|
目錄:
|
译者序
前言
致谢
关于作者
第1章 面向对象的概念简介1
1.1 基本概念1
1.2 对象及遗留系统2
1.3 过程式编程与面向对象编程对比4
1.4 由面向过程开发过渡到面向对象开发7
1.4.1 过程式编程7
1.4.2 面向对象编程8
1.5 什么是对象8
1.5.1 对象数据8
1.5.2 对象行为9
1.6 什么是类13
1.6.1 创建对象13
1.6.2 属性15
1.6.3 方法15
1.6.4 消息15
1.7 使用类图作为可视化工具16
1.8 封装和数据隐藏16
1.8.1 接口17
1.8.2 实现18
1.8.3 接口/实现范式的一个真实示例18
1.8.4 接口/实现范式的模型19
1.9 继承20
1.9.1 超类和子类21
1.9.2 抽象21
1.9.3 is-a关系23
1.10 多态性24
1.11 组合27
1.11.1 抽象27
1.11.2 has-a关系28
1.12 本章小结28
第2章 如何以对象的方式进行思考29
2.1 清楚接口和实现之间的区别30
2.1.1 接口32
2.1.2 实现32
2.1.3 一个接口/实现示例33
2.2 使用抽象思维设计接口37
2.3 尽可能提供小化的用户接口39
2.3.1 确定用户39
2.3.2 对象行为40
2.3.3 环境约束40
2.3.4 识别公共接口40
2.3.5 识别实现41
2.4 本章小结42
2.5 参考文献42
第3章 更多面向对象概念43
3.1 构造函数43
3.1.1 什么是构造函数调用44
3.1.2 构造函数中包含什么44
3.1.3 默认构造函数45
3.1.4 使用多个构造函数46
3.1.5 设计构造函数49
3.2 错误处理50
3.2.1 忽略问题50
3.2.2 检查问题并中止应用程序50
3.2.3 检查问题并试图恢复51
3.2.4 抛出异常51
3.3 作用域的重要性54
3.3.1 局部属性?54
3.3.2 对象属性55
3.3.3 类属性57
3.4 操作符重载58
3.5 多重继承59
3.6 对象操作60
3.7 本章小结62
3.8 参考文献62
第4章 类的剖析63
4.1 类名63
4.2 注释65
4.3 属性65
4.4 构造函数67
4.5 访问器69
4.6 公共接口方法71
4.7 私有实现方法72
4.8 本章小结72
4.9 参考文献73
第5章 类设计指导75
5.1 对现实世界系统建模75
5.2 识别公共接口76
5.2.1 小化公共接口77
5.2.2 隐藏实现78
5.3 设计健壮的构造函数(以及析构函数)78
5.4 在类中设计错误处理79
5.4.1 记录类并使用注释80
5.4.2 构建可以合作的对象80
5.5 设计时请考虑重用81
5.6 设计时请考虑可扩展性81
5.6.1 保持命名具有描述性82
5.6.2 抽象不可移植的代码82
5.6.3 提供一种方式来复制和比较对象83
5.6.4 保持尽可能小的作用域83
5.7 设计时请考虑可维护性84
5.7.1 在开发过程中使用迭代85
5.7.2 测试接口85
5.8 使用对象持久化87
5.9 本章小结89
5.10 参考文献89
第6章 使用对象进行设计91
6.1 设计指导91
6.1.1 进行正确的分析95
6.1.2 编写工作陈述文档95
6.1.3 收集需求95
6.1.4 开发系统原型96
6.1.5 识别类96
6.1.6 确定每个类的职责96
6.1.7 确定类之间如何协作96
6.1.8 创建类模型来描述系统97
6.1.9 在代码中创建用户接口原型97
6.2 对象包装97
6.2.1 结构化代码98
6.2.2 包装结构化代码99
6.2.3 包装不可移植的代码101
6.2.4 包装已有类102
6.3 本章小结103
6.4 参考文献103
第7章 精通继承和组合105
7.1 重用对象105
7.2 继承107
7.2.1 泛化和特化109
7.2.2 设计决策110
7.3 组合112
7.4 为什么封装是面向对象的本质115
7.4.1 继承如何减弱封装115
7.4.2 关于多态性的一个具体例子118
7.4.3 对象职责118
7.4.4 抽象类、虚方法和协议122
7.5 本章小结123
7.6 参考文献124
第8章 框架和重用:使用接口和抽象类进行设计125
8.1 代码:重用还是不重用125
8.2 什么是框架126
8.3 什么是契约128
8.3.1 抽象类129
8.3.2 接口131
8.3.3 综合运用133
8.3.4 编译器佐证136
8.3.5 创建契约137
8.3.6 系统插件139
8.4 一个电子商务示例139
8.4.1 一个电子商务问题140
8.4.2 非重用方式141
8.4.3 电子商务解决方案143
8.4.4 UML对象模型143
8.5 本章小结147
8.6 参考文献148
第9章 创建对象及面向对象设计149
9.1 组合关系150
9.2 分阶段构建151
9.3 组合类型153
9.3.1 聚合153
9.3.2 联合154
9.3.3 同时使用联合和聚合155
9.4 避免依赖156
9.5 基数157
9.5.1 多个对象联合158
9.5.2 可选的联合160
9.6 一个综合性示例160
9.7 本章小结161
9.8 参考文献162
第10章 设计模式163
10.1 为什么使用设计模式164
10.2 Smalltalk的模型/视图/控制器165
10.3 设计模式类型167
10.3.1 创建型模式?167
10.3.2 结构型模式171
10.3.3 行为型模式174
10.4 反模式175
10.5 本章小结176
10.6 参考文献177
第11章 避免依赖和高度耦合的类179
11.1 继承、组合和依赖注入181
11.1.1 继承182
11.1.2 组合183
11.1.3 依赖注入186
11.2 本章小结189
11.3 参考文献189
第12章 面向对象设计的SOLID原则191
12.1 面向对象设计的SOLID原则概述192
12.1.1 SRP:单一职责原则192
12.1.2 OCP:开闭原则196
12.1.3 LSP:里氏替换原则198
12.1.4 ISP:接口隔离原则201
12.1.5 DIP:依赖倒置原则202
12.2 本章小结208
12.3 参考文献208
|
內容試閱:
|
本书内容概要
正如书名所述,本书阐述了面向对象的思考过程。选择一本书的主题和书名是很重要的,但如果主题的概念性很强的话,做决定就没那么容易了。大部分书籍都只涉及编程与面向对象设计的某个方面。一些流行的书则阐述了诸如面向对象分析、面向对象设计、面向对象编程、设计模式、面向对象的数据结构(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。你可以自学这些知识。同样重要的是要理解这是一本阐述概念的书。在本书中,示例的意图并非描述设计类的方法,它们更是一种教育性的练习,旨在使你思考面向对象的概念。例如,很明显,你不会在工作中创建许多企鹅和无吠犬模型,但是使用它们是演示概念的一种有趣方式。考虑到所有这些,我希望本书能引起你对其他面向对象主题的兴趣,例如面向对象分析、面向对象设计和面向对象编程。
|
|