新書推薦:
《
东南亚的传统与发展
》
售價:HK$
67.2
《
乾隆制造
》
售價:HK$
87.4
《
资治通鉴臣光曰辑存 资治通鉴目录(司马光全集)(全二册)
》
售價:HK$
304.4
《
明代社会变迁时期生活质量研究
》
售價:HK$
316.2
《
律令国家与隋唐文明
》
售價:HK$
76.7
《
现代吴语的研究(中华现代学术名著3)
》
售價:HK$
65.0
《
天下的当代性:世界秩序的实践与想象(新版)
》
售價:HK$
77.3
《
德国天才4:断裂与承续
》
售價:HK$
109.8
內容簡介:
本教材提供了关于软件设计深入的介绍,重点关注面向对象的设计,并使用Java编程语言。目的是通过发掘设计过程中的经验来帮助读者学习软件设计。使用这样一种叙述方式:在上下文中介绍设计知识的每一个元素,并探索不同的解决方案,同时辅以数百个代码片段和设计图。
關於作者:
马丁·P.罗毕拉德(Martin P. Robillard)是麦吉尔大学的计算机科学系教授。他从2005年开始教授Java软件设计,并拥有20多年的Java程序设计经验。他目前的研究重点是与软件演化、体系结构和设计以及软件重用相关的问题。Martin是第20届ACM软件工程基础国际研讨会FSE 2012和第39届ACMIEEE软件工程国际会议ICSE 2017的项目联合主席。
目錄 :
出版者的话
译者序
前言
第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.clone120
6.6.4 捕获CloneNotSupported-Exception121
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 函数式STRATEGY218
9.5.2 函数式COMMAND220
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
內容試閱 :
本书是我在麦吉尔大学讲授软件设计10多年的基础上写成的。最初,我的重点是讲解在高质量参考文献中出现的软件设计技术。但是,我很快意识到讲授软件设计的主要困难在于其他方面:讲解如何应用一种设计技术或者使用一种程序设计语言机制相对容易,真正的难题在于阐明应当在什么样的场景下使用某种设计技术,以及为什么使用这种技术。为此,我需要解释软件开发者如何设计软件。随着时间的推移,我的讲解变得更注重于探讨在一个给定场景下可以做出哪些不同的设计决策。
本书的目的是帮助读者通过发掘设计过程的经验来学习软件设计。我将通过不同的例子分享设计软件的经验,其中每个例子在一个具体场景中解释其设计技术的元素,并探讨在这种场景下的替代解决方案。每个例子将由许多代码块和设计图支撑。
我希望本书能够成为学习软件设计的有效资源和指南。但是,我相信仅仅靠阅读一本书不可能真正掌握设计技术。根据我的学习经验,有效的学习方法包括阅读他人的代码、自己经常性地编写代码,以及不懈地重构现有代码以尝试其他设计方案。为此,本书着重把编写代码和实验作为阅读本书不可或缺的部分。为了支持这种学习过程,本书有一个辅助网站,其中包括练习问题以及能够实践许多设计决策的三个应用实例。这些应用实例的介绍可在每章后面的“代码探索”中找到。
如书名所示,本书使用Java语言讲解软件设计基础。书中的所有代码,包括应用实例,都是用Java(版本8)编写的。但是,Java语言只是讲解设计思想的工具,并非本书的主题。本书内容将覆盖可适用于多种技术的设计概念和方法。许多概念(如封装)是所有技术通用的。有的概念(如继承)是特定于某种程序设计范式的,但适用于多种程序设计语言。无论是通用的还是范式特定的内容,将这些例子改编到其他语言应该是相对容易的。在少数情况下,内容涉及Java特定的语言设计机制(如克隆)。在这种情况下,我将把这种机制呈现为一种更通用技术的实现。
本书面向的读者是那些拥有最少的编程经验,而且希望从编写小型程序和脚本晋级到处理大型系统的开发的人。读者对象自然也包括计算机科学和软件工程专业的大学生。但是,我将必须具备的计算概念限制到最少,以使得没有经过基本计算训练的程序员也可以阅读本书。出于同样的考虑,理解书中的代码只需要极少的语言知识,比如在程序设计入门课程中讲解的内容。用于理解本书内容的关键Java知识可以在附录中找到,必要时书中也讲解了Java的更高级特性,而且对Java语言的类库的特定元素进行了最少的引用。我希望本书对于想写出结构清晰、设计良好的软件的读者都有帮助。
本书组织结构
第1章是软件设计的一般性介绍。后续各章通过特定设计问题逐步引入各种设计概念和技术。在主题内容之外,本书也包含启发读者的内容,以帮助他们进一步探索和学习相关内容。
章节概述:每章开头列出本章覆盖的概念和原理、程序设计机制、设计技术以及模式与反模式。
设计场景:在概述之后有一个题为“设计场景”的段落,介绍本章实例的设计问题。因此,要理解某一章的代码无须阅读先前的各个章节。
图表:每章包含许多表述设计思想的图表。尽管这些图表用于阐释书中的概念,但是它们也可用于讨论设计时的实际图表演示。
代码段:每章包含许多代码段。代码通常遵循附录B的惯例,偶尔为了紧凑有例外。代码段的完成版本可以在辅助网站下载。
小结:在每章有编号的主节后有一个标题为“小结”的未编号节,该节是本章关键信息和建议的总结。这些总结可作为适用设计知识的目录,并假设这些内容已经被读者掌握。这些内容用项目符号形式列出,以便阅读。
代码探索:在“小结”之后有一节标题为“代码探索”,该节讨论实践中的软件设计。为方便实践且避免读者迷失在讨论的细节中,各章讨论的设计场景尽可能保持简单。结果是,软件设计中的某些有趣的方面也在简化中消失。本节的代码探索活动就是让读者学会在实践中应用本章介绍的某些主题。“代码探索”一节关注应用实例代码的特定部分。在阅读“代码探索”一节之前,建议读者重新阅读代码,尽可能多理解代码。“代码探索”一节讨论的应用实例在附录C中均有描述,包括用于创建本书图表的应用JetUML。
延伸阅读:“延伸阅读”一节提供本章内容的进一步参考资料。
辅助网站:本书的附加资源可参见https:github.comprmrDesignBook。网站内容包括本章代码的完整注释版本,还有习题及答案。
应用实例:附录C描述的三个Java应用实例是按照本书涵盖的许多原则和技术开发的,可作为进一步学习和探讨的基础。
致谢
非常感谢Mathieu Nassif对全书手稿进行了详细的技术审阅,并提出了大量的更正、建议和有趣的论点。感谢Jin Guo审阅了大部分章节,并在她的教学中实验了大部分内容。感谢Kaylee Kutschera、Brigitte Pientka和Clark Verbrugge对手稿各部分提出的反馈意见。我还要感谢斯普林格负责计算机科学的主编Ralf Gerstner在本项目一开始给予的信任,以及本项目执行过程中他惯有的勤奋和专业精神。
Martin P. Robillard
2019年4月