软件设计:Java语言实践
作者 : [加拿大] 马丁·P.罗毕拉德(Martin P. Robillard) 著
译者 : 乔海燕 郭佳怡 傅禹泽 邹雨桐 译
丛书名 : 计算机科学丛书
出版日期 : 2020-09-04
ISBN : 978-7-111-66402-4
定价 : 89.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 251
开本 : 16
原书名 : Introduction to Software Design with Java
原出版社: Springer-Verlag
属性分类: 教材
包含CD : 无CD
绝版 :
图书简介

本教材提供了关于软件设计深入的介绍,重点关注面向对象的设计,并使用Java编程语言。目的是通过发掘设计过程中的经验来帮助读者学习软件设计。使用这样一种叙述方式:在上下文中介绍设计知识的每一个元素,并探索不同的解决方案,同时辅以数百个代码片段和设计图。

图书特色

十余年软件设计教学经验结晶

图书前言

本书是我在麦吉尔大学讲授软件设计10多年的基础上写成的。最初,我的重点是讲解在高质量参考文献中出现的软件设计技术。但是,我很快意识到讲授软件设计的主要困难在于其他方面:讲解如何应用一种设计技术或者使用一种程序设计语言机制相对容易,真正的难题在于阐明应当在什么样的场景下使用某种设计技术,以及为什么使用这种技术。为此,我需要解释软件开发者如何设计软件。随着时间的推移,我的讲解变得更注重于探讨在一个给定场景下可以做出哪些不同的设计决策。
本书的目的是帮助读者通过发掘设计过程的经验来学习软件设计。我将通过不同的例子分享设计软件的经验,其中每个例子在一个具体场景中解释其设计技术的元素,并探讨在这种场景下的替代解决方案。每个例子将由许多代码块和设计图支撑。
我希望本书能够成为学习软件设计的有效资源和指南。但是,我相信仅仅靠阅读一本书不可能真正掌握设计技术。根据我的学习经验,有效的学习方法包括阅读他人的代码、自己经常性地编写代码,以及不懈地重构现有代码以尝试其他设计方案。为此,本书着重把编写代码和实验作为阅读本书不可或缺的部分。为了支持这种学习过程,本书有一个辅助网站,其中包括练习问题以及能够实践许多设计决策的三个应用实例。这些应用实例的介绍可在每章后面的“代码探索”中找到。
如书名所示,本书使用Java语言讲解软件设计基础。书中的所有代码,包括应用实例,都是用Java(版本8)编写的。但是,Java语言只是讲解设计思想的工具,并非本书的主题。本书内容将覆盖可适用于多种技术的设计概念和方法。许多概念(如封装)是所有技术通用的。有的概念(如继承)是特定于某种程序设计范式的,但适用于多种程序设计语言。无论是通用的还是范式特定的内容,将这些例子改编到其他语言应该是相对容易的。在少数情况下,内容涉及Java特定的语言设计机制(如克隆)。在这种情况下,我将把这种机制呈现为一种更通用技术的实现。
本书面向的读者是那些拥有最少的编程经验,而且希望从编写小型程序和脚本晋级到处理大型系统的开发的人。读者对象自然也包括计算机科学和软件工程专业的大学生。但是,我将必须具备的计算概念限制到最少,以使得没有经过基本计算训练的程序员也可以阅读本书。出于同样的考虑,理解书中的代码只需要极少的语言知识,比如在程序设计入门课程中讲解的内容。用于理解本书内容的关键Java知识可以在附录中找到,必要时书中也讲解了Java的更高级特性,而且对Java语言的类库的特定元素进行了最少的引用。我希望本书对于想写出结构清晰、设计良好的软件的读者都有帮助。
本书组织结构
第1章是软件设计的一般性介绍。后续各章通过特定设计问题逐步引入各种设计概念和技术。在主题内容之外,本书也包含启发读者的内容,以帮助他们进一步探索和学习相关内容。
章节概述:每章开头列出本章覆盖的概念和原理、程序设计机制、设计技术以及模式与反模式。
设计场景:在概述之后有一个题为“设计场景”的段落,介绍本章实例的设计问题。因此,要理解某一章的代码无须阅读先前的各个章节。
图表:每章包含许多表述设计思想的图表。尽管这些图表用于阐释书中的概念,但是它们也可用于讨论设计时的实际图表演示。
代码段:每章包含许多代码段。代码通常遵循附录B的惯例,偶尔为了紧凑有例外。代码段的完成版本可以在辅助网站下载。
小结:在每章有编号的主节后有一个标题为“小结”的未编号节,该节是本章关键信息和建议的总结。这些总结可作为适用设计知识的目录,并假设这些内容已经被读者掌握。这些内容用项目符号形式列出,以便阅读。
代码探索:在“小结”之后有一节标题为“代码探索”,该节讨论实践中的软件设计。为方便实践且避免读者迷失在讨论的细节中,各章讨论的设计场景尽可能保持简单。结果是,软件设计中的某些有趣的方面也在简化中消失。本节的代码探索活动就是让读者学会在实践中应用本章介绍的某些主题。“代码探索”一节关注应用实例代码的特定部分。在阅读“代码探索”一节之前,建议读者重新阅读代码,尽可能多理解代码。“代码探索”一节讨论的应用实例在附录C中均有描述,包括用于创建本书图表的应用JetUML。
延伸阅读:“延伸阅读”一节提供本章内容的进一步参考资料。
辅助网站:本书的附加资源可参见https://github.com/prmr/DesignBook。网站内容包括本章代码的完整注释版本,还有习题及答案。
应用实例:附录C描述的三个Java应用实例是按照本书涵盖的许多原则和技术开发的,可作为进一步学习和探讨的基础。
致谢
非常感谢Mathieu Nassif对全书手稿进行了详细的技术审阅,并提出了大量的更正、建议和有趣的论点。感谢Jin Guo审阅了大部分章节,并在她的教学中实验了大部分内容。感谢Kaylee Kutschera、Brigitte Pientka和Clark Verbrugge对手稿各部分提出的反馈意见。我还要感谢斯普林格负责计算机科学的主编Ralf Gerstner在本项目一开始给予的信任,以及本项目执行过程中他惯有的勤奋和专业精神。

Martin P. Robillard
2019年4月

上架指导

计算机\程序设计

封底文字

本书使用Java语言对面向对象的软件设计进行了深度介绍。作者的目的是让读者通过体验设计过程学会软件设计。为此,作者使用叙事的方式逐步引入各种场景中设计技术的元素,并探讨在该场景下的其他可能的解决方案。每个例子由许多代码块和设计图表支撑。
第1章是软件设计的一般性介绍。后续各章通过特定设计问题逐步引入各种设计概念和技术。之后的章节涵盖了有效使用类型与接口、封装、复合、继承、设计模式和单元测试等许多概念和技术。作者强调了编写代码和实验是阅读本书的必要补充。为了支持这种学习过程,作者提供了包含三个应用实例的辅助网站,这些应用实例涉及各种设计决策的使用。每章结尾的“代码探索”给出对这些应用实例的指导。尽管本书使用Java语言作为介绍设计理念的工具,但是,本书的目标是介绍可应用于大量场景的概念和技术。
本书面向具有少量程序设计知识,而且希望从编写小程序或者脚本晋级到设计大型系统的读者,读者对象自然包括计算机科学和软件工程专业的大学生。由于本书对读者需要具备的计算概念限制到最少,因此没有经过基本计算训练的程序员也可以阅读本书。出于同样的考虑,理解书中的代码只需要极少的语言知识,比如掌握程序设计入门课程中讲解的内容即可。

作者简介
马丁·P. 罗毕拉德(Martin P. Robillard) 是麦吉尔大学的计算机科学系教授。他从2005年开始教授Java软件设计,并拥有20多年的Java程序设计经验。他目前的研究重点是与软件演化、体系结构和设计以及软件重用相关的问题。Martin是第20届ACM软件工程基础国际研讨会(FSE 2012)和第39届ACM/IEEE软件工程国际会议(ICSE 2017)的项目联合主席。

作者简介

[加拿大] 马丁·P.罗毕拉德(Martin P. Robillard) 著:马丁·P.罗毕拉德(Martin P. Robillard)是麦吉尔大学的计算机科学系教授。他从2005年开始教授Java软件设计,并拥有20多年的Java程序设计经验。他目前的研究重点是与软件演化、体系结构和设计以及软件重用相关的问题。Martin是第20届ACM软件工程基础国际研讨会(FSE 2012)和第39届ACM/IEEE软件工程国际会议(ICSE 2017)的项目联合主席。

译者序

计算机软件的设计与其他产品的设计有着很大的差异。不像其他有形产品的设计,软件的设计似乎不存在简单可遵循的规范和步骤。实际上,如何设计符合用户需求的高质量软件仍然是专家研究和讨论的话题,因此,教授学生学习软件设计也并非易事。
本书作者马丁·P.罗毕拉德(Martin P. Robillard)是麦吉尔大学教授,他的研究方向包括软件演化、架构和设计以及软件重用。罗毕拉德教授自2005年以来一直在为本科生讲授软件设计课程,并且具有多年的程序设计经验。本书是在作者多年教授软件设计的基础上写成的,因此,在引导学生如何设计软件方面具有独到之处。
作者用叙事的方式,通过扫雷游戏、单人纸牌游戏和JetUML三个大家比较熟知的应用实例以及大量的代码段,让读者体验软件设计过程中应该遵循的设计原则,面对问题和需求时不同设计决策带来的影响,各种设计模式的适用场景,以及如何使用面向对象程序设计语言提供的各种支持机制解决设计问题。三个应用实例涵盖了各种设计问题和解决方案,包括有效利用类型和接口、封装、复合、继承、设计模式、单元测试和函数式程序设计机制等。书中配备的大量代码段为读者理解和掌握内容提供了很好的帮助。全书每章开始都给出本章要介绍的设计原理、程序设计机制和设计模式等,每章结尾给出指导性的小结,以及读者可以进一步学习的“代码探索”,并为此提供了包含三个实例全部代码的辅助网站。每章最后还为读者提供了延伸阅读的文献指引。这些都为读者更好地掌握内容提供了便利和帮助。
本书在翻译过程中得到了刘锋编辑和李美莹编辑的大力支持,我们在此表示感谢!
限于译者水平,译文中难免出现疏漏和错误,欢迎大家批评指正!

译者
2020年4月于广州

图书目录

出版者的话
译者序
前言
第1章 绪论 1
1.1 定义软件设计 3
1.2 软件开发过程中的设计 5
1.3 获取设计知识 6
1.4 共享设计技术 8
1.4.1 设计模式 8
1.4.2 设计反模式 10
小结 10
延伸阅读 11
第2章 封装 12
2.1 封装与信息隐藏 12
2.2 将抽象编码为类型 13
2.3 作用域与可见性限制 16
2.4 对象图 18
2.5 逃逸引用 20
2.5.1 返回指向内部对象的引用 21
2.5.2 在内部存储外部引用 22
2.5.3 通过共享结构泄露引用 22
2.6 不可变性 23
2.7 提供内部数据 25
2.7.1 扩展接口 25
2.7.2 返回副本 26
2.7.3 高级机制 27
2.8 契约式设计 27
小结 30
代码探索 30
延伸阅读 32
第3章 类型与接口 33
3.1 行为与实现解耦合 33
3.2 指定接口的行为 36
3.3 类图 38
3.4 函数对象 40
3.5 迭代器 43
3.6 ITERATOR设计模式 45
3.7 STRATEGY设计模式 46
3.8 接口分离原则 47
小结 50
代码探索 50
延伸阅读 52
第4章 对象状态 53
4.1 软件系统的静态和动态视图 53
4.2 定义对象状态 54
4.3 状态图 55
4.4 设计对象生命周期 57
4.4.1 无效和无用的状态 58
4.4.2 不必要的状态信息 58
4.5 可空性 59
4.5.1 无须对不存在的值建模 60
4.5.2 对不存在的值建模 61
4.5.3 可选值类型 62
4.5.4 NULL OBJECT设计模式 63
4.6 终极域和变量 64
4.7 对象身份、相等和唯一 66
4.8 FLYWEIGHT设计模式 68
4.9 SINGLETON设计模式 71
4.10 嵌套类的对象 72
4.10.1 内部类 72
4.10.2 匿名类 74
小结 75
代码探索 76
延伸阅读 77
第5章 单元测试 78
5.1 单元测试简介 78
5.2 JUnit单元测试框架基础 81
5.3 测试代码的组织 82
5.4 元程序设计 83
5.4.1 内省 84
5.4.2 程序的操作 86
5.4.3 程序元数据 87
5.5 测试构建 88
5.6 测试和异常条件 91
5.7 封装与单元测试 93
5.8 桩测试 95
5.9 测试覆盖 96
5.9.1 语句覆盖 98
5.9.2 分支覆盖 98
5.9.3 路径覆盖 99
小结 99
代码探索 100
延伸阅读 101
第6章 复合 102
6.1 复合与聚合 102
6.2 COMPOSITE设计模式 105
6.3 时序图 109
6.4 DECORATOR设计模式 112
6.5 COMPOSITE与DECORATOR的结合 116
6.6 多态对象复制 118
6.6.1 声明实现Cloneable接口 119
6.6.2 重写Object.clone()方法 120
6.6.3 调用super.clone() 120
6.6.4 捕获CloneNotSupported-Exception 121
6.6.5 把clone()加入接口 122
6.7 PROTOTYPE设计模式 123
6.8 COMMAND设计模式 124
6.9 迪米特法则 127
小结 128
代码探索 129
延伸阅读 131
第7章 继承 132
7.1 继承的实例 132
7.2 继承和子类 134
7.2.1 向下类型转换 135
7.2.2 单根的类层次结构 136
7.3 继承域 137
7.4 继承方法 139
注解重写方法 143
7.5 重载方法 143
7.6 继承与复合 145
7.7 抽象类 147
7.8 重温DECORATOR设计模式 149
7.9 TEMPLATE METHOD设计模式 151
7.9.1 终极方法与终极类 152
7.9.2 抽象方法 153
7.9.3 模式总结 154
7.10 正确使用继承 155
7.10.1 限制基类客户端的行为 155
7.10.2 不适合作子类型的子类 158
小结 159
代码探索 159
延伸阅读 161
第8章 控制流反转 162
8.1 使用控制流反转的动机 162
8.2 模型–视图–控制器分解 164
8.3 OBSERVER设计模式 165
8.3.1 模型和观察者的连接 165
8.3.2 模型和观察者间的控制流 166
8.3.3 模型和观察者间的数据流 168
8.3.4 事件驱动程序设计 170
8.3.5 小结 172
8.4 应用OBSERVER设计模式 173
8.5 图形用户界面开发导论 177
8.6 图形用户界面组件图 178
8.6.1 用户体验视角 178
8.6.2 逻辑视角 179
8.6.3 源代码视角 179
8.6.4 运行时视角 181
8.6.5  定义对象图 181
8.7 事件处理 183
8.8 VISITOR设计模式 186
8.8.1 具体和抽象访问者 188
8.8.2 在类层次结构中集成操作 189
8.8.3 遍历对象图 191
8.8.4 OBSERVER模式中使用继承 194
8.8.5 在访问者结构中支持数据流 196
小结 197
代码探索 198
延伸阅读 200
第9章 函数式设计 201
9.1 一等函数 201
9.2 函数式接口、lambda表达式和方法引用 203
9.2.1 函数式接口 203
9.2.2 lambda表达式 204
9.2.3 方法引用 207
9.3 使用函数复合行为 208
9.4 用函数作数据供给者 212
供给者函数与OBSERVER模式 217
9.5 一等函数和设计模式 218
9.5.1 函数式STRATEGY 218
9.5.2 函数式COMMAND 220
9.6 函数式数据处理 221
9.6.1 数据作为流 222
9.6.2 将高阶函数应用于流 223
9.6.3 过滤流 224
9.6.4 映射数据元素 225
9.6.5 规约流 226
小结 228
代码探索 228
延伸阅读 230
附录A Java程序设计语言的重要概念 231
附录B 代码规范 237
附录C 应用实例 240
参考文献 242

教学资源推荐
作者: 郑阿奇 主编 王燕平 汤玫 编著
作者: 高屹 沙俊星
作者: [英]理查德·伯德(Richard Bird) 著
作者: (英)Roger Garside, John Mariani
参考读物推荐