面向对象分析与设计(第3版)(修订版) 9787121286667,7121286661

配送至
$ $ USD 美元

编辑推荐

《面向对象分析与设计(第3版)(修订版)》是UML创始人GradyBooch的代表作之一。全书分为理论和应用两部分。理论部分深刻剖析了面向对象分析与设计(OOAD)的概念和方法。应用部分连续列出了5个不同类型、不同领域的应用,描述如何从初始阶段到交付阶段,将OOAD理论和方法应用到项目中。应用部分所涉及的领域包括系统架构、数据获取、密码分析、控制系统和Web开发,还给出了一些关于重要问题的有效建议,包括分类、实现策略和高性价比的项目管理。

作者简介

Grady Booch在软件架构、软件工程和建模领域的创新工作是世界知名的。从1981年Rational公司创建开始,他就一直担任该公司的首席科学家。Grady于2003年3月成为了IBM院士(IBM Fellow)。
Grady是统一建模语言(UML)最早的开发者之一,也是几个Rational产品的最早开发者之一。Grady曾担任世界各地一些复杂的软件密集型项目的架构师和架构指导者。
Grady是6本畅销书的作者,包括UML Users Guide和Object-Oriented Analysis with Applications。Grady发表了几百篇有关软件工程的技术文章,其中包括在20世纪80年代早期发表的文章,这些文章先提出了面向对象设计的术语和实践。他曾在世界各地演讲和咨询。
Grady是美国计算机协会(ACM)、美国电气电子工程师学会(IEEE)、美国科学促进会(AAAS)、有社会责任的计算机专家协会(CPSR)的成员。他是IBM院士、ACM院士、世界技术网络院士,也是软件开发论坛梦想家。Grady是敏捷联盟、Hillside集团和软件架构师世界学院的创始委员会成员,也是Northface大学的顾问委员会成员。
Grady于1977年从美国空军学院获得学士学位,于1979年从加州大学圣巴巴拉分校获得电子工程科学硕士学位。
Grady与他的妻子和他的猫生活在科罗拉多。他的兴趣包括阅读、旅行、唱歌和弹奏竖琴。
Robert A. Maksimchuk是Unisys Chief Technology Office的一名研究主管。他关注新出现的建模技术,目的是提升Unisys 3D可视企业建模框架的战略方向。Bob为这项任务带来了不同行业的大量系统工程、建模、面向对象分析与设计的专业知识。他是UML for Mere Mortals和UML for Database Design的合著者,也写了许多文章。他曾经周游世界各地,在各种技术论坛上作为重要演讲者发言,举办关于UML和面向对象开发的研讨会和培训。Bob是电气电子工程师学会(IEEE)和国际系统工程学会(INCOSE)的成员。
Michael W. Engle是洛克希德马丁公司的首席工程师。他有超过26年的技术和管理经验——从项目启动到运营支持,涵盖了完整的系统开发生命周期。利用系统工程师、软件工程师和系统架构师的背景,Mike运用了面向对象技术,为复杂的系统开发提供创新的开发方式。
Bobbi J. Young,Ph.D.,是Unisys Chief Technology Office的一名研究主管。她有着多年的IT行业从业经验,与商业公司和国防部合同供应商一同工作。Young博士是一名咨询师,她在项目管理、企业架构、系统工程和面向对象分析与设计方面提供现场指导。在她的职业生涯中,她关注于系统生命周期过程和方法学,同时也关注企业架构。Young博士拥有生物学、计算机科学和人工智能学位,她获得了管理信息系统的博士学位,也曾是美国海军预备役的一名指挥官(已退伍)。
Jim Conallen是IBM Rational的模型驱动开发战略小组的一名软件工程师。在这个小组中,他积极参与,将对象管理集团(OMG)的模型驱动架构(MDA)计划应用于IBM Rational的模型工具中。Jim在基于资产的开发和可复用资产规范(RAS)领域也很活跃。Jim经常在会议上演讲,也经常写文章。他的专业领域是Web应用开发。
他开发了UML的Web应用扩展(WAE)。这是对UML的一种扩展,让开发者能够利用UML在合适的抽象和细节层面上对Web应用的架构进行建模。这项工作是IBM Rational Rose和Rational XDE Web Modeling功能的基础。
Jim与人合著了两个版本的Building Web Applications with UML,第一个版本采用微软公司的ASP技术,后一个版本采用J2EE技术。
Jim的经验也来自于加入Rational之前的工作,那时他曾是独立的咨询师、Peace Corps的志愿者和大学讲师。他还是3个孩子的父亲。Jim从Widener大学获得了计算机和软件工程的学士学位和硕士学位。
Kelli Houston是IBM Rational的IT咨询专家。她是IBM内部方法的方法架构师,负责编写方法并集成IBM的方法。除了方法架构师的角色,Kelli还在IBM内部领导Rational Method Composer(RMC)特别兴趣小组(SIG)工作,为客户和IBM内部咨询师提供有效使用RMC方面的咨询和现场指导服务。

目录

第1篇概念
第1章复杂性
1.1复杂系统的结构
1.1.1个人计算机的结构
1.1.2植物和动物的结构
1.1.3物质的结构
1.1.4社会机构的结构
1.2软件固有的复杂性
1.2.1定义软件复杂性
1.2.2为什么软件在本质上是复杂的
1.3复杂系统的5个属性
1.3.1层次结构
1.3.2相对本原
1.3.3关注点分离
1.3.4共同模式
1.3.5稳定的中间形式
1.4有组织和无组织的复杂性
1.4.1复杂系统的规范形式
1.4.2人在处理复杂性时的能力局限
1.5从混沌到有序
1.5.1分解的作用
1.5.2抽象的作用
1.5.3层次结构的作用
1.6复杂系统的设计
1.6.1作为科学和艺术的工程
1.6.2设计的含义
1.7小结
第2章对象模型
2.1对象模型的演进
2.1.1程序设计语言的换代
2.1.2第一代和第二代早期程序设计语言的拓扑结构
2.1.3第二代后期和第三代早期程序设计语言的结构
2.1.4第三代后期程序设计语言的结构
2.1.5基于对象和面向对象的程序设计语言的结构
2.2对象模型基础
2.2.1面向对象编程
2.2.2面向对象设计
2.2.3面向对象分析
2.3对象模型要素
2.3.1抽象的意义
2.3.2封装的意义
2.3.3模块化的意义
2.3.4层次结构的意义
2.3.5类型的意义
2.3.6并发的意义
2.3.7持久的意义
2.4应用对象模型
2.4.1对象模型的好处
2.4.2开放式问题
2.5小结
第3章类与对象
3.1对象的本质
3.1.1什么是对象,什么不是对象
3.1.2状态
3.1.3行为
3.1.4标识符
3.2对象之间的关系
3.2.1链接
3.2.2聚合
3.3类的本质
3.3.1什么是类,什么不是类
3.3.2接口和实现
3.3.3类的生命周期
3.4类之间的关系
3.4.1关联
3.4.2继承
3.4.3聚合
3.4.4依赖关系
3.5类与对象的互动
3.5.1类与对象的关系
3.5.2类与对象在分析和设计中的角色
3.6创建高品质的类与对象
3.6.1评判一种抽象的品质
3.6.2选择操作
3.6.3选择关系
3.6.4选择实现
3.7小结
第4章分类
4.1正确分类的重要性
4.1.1分类的困难
4.1.2分类的增量和迭代本质
4.2确定类和对象
4.2.1经典方法和现代方法
4.2.2面向对象分析
4.3关键抽象与机制
4.3.1确定关键抽象
4.3.2识别机制
4.4小结
第2篇方法
第5章表示法
5.1统一建模语言
5.1.1简单历史回顾
5.1.2模型与多重视图
5.1.3图分类
5.1.4在实践中使用图
5.1.5概念模型、逻辑模型和物理模型
5.1.6工具的角色
5.1.7面向对象开发的产品
5.1.8规模上的伸缩
5.1.9UML的语法和语义
5.1.10UML 2.0信息资源
5.2包图
5.2.1基本概念:包表示法
5.2.2基本概念:元素的可见性
5.2.3基本概念:依赖关系
5.2.4基本概念:包图
5.2.5高级概念:导入和访问
5.3组件图
5.3.1基本概念:组件表示法
5.3.2基本概念:组件图
5.3.3基本概念:组件接口
5.3.4基本概念:组件实现
5.3.5高级概念:组件的内部结构
5.4部署图
5.4.1基本概念:工件表示法
5.4.2基本概念:节点表示法
5.4.3基本概念:部署图
5.5用例图
5.5.1基本概念:执行者
5.5.2基本概念:用例
5.5.3基本概念:用例图
5.5.4高级概念:《include》和《extend》关系
5.5.5高级概念:泛化
5.6活动图
5.6.1基本概念:动作
5.6.2基本概念:开始和停止
5.6.3基本概念:判断节点和合并节点
5.6.4基本概念:分区
5.6.5高级概念:分叉、结合和并发
5.6.6高级概念:对象流
5.6.7高级概念:其他元素
5.7类图
5.7.1基本概念:类表示法
5.7.2基本概念:类关系
5.7.3高级概念:模板(参数化)类
5.7.4高级概念:可见性
5.7.5高级概念:关联端名称和限定符
5.7.6高级概念:约束
5.7.7高级概念:关联类和注解
5.8序列图
5.8.1基本概念:对象与交互
5.8.2基本概念:生命线与消息
5.8.3高级概念:销毁事件
5.8.4高级概念:执行说明
5.8.5高级概念:交互使用
5.8.6高级概念:控制结构
5.9交互概述图
5.9.1基本概念:框
5.9.2基本概念:控制流元素
5.9.3基本概念:交互图元素
5.10组合结构图
5.10.1基本概念:组合结构的部分
5.10.2基本概念:组合结构的部分与接口
5.10.3基本概念:组合结构连接器
5.10.4高级概念:协作
5.11状态机图
5.11.1基本概念:初始状态、最终状态和简单状态
5.11.2基本概念:转换与事件
5.11.3高级概念:状态活动(入口活动、执行活动和出口活动)
5.11.4高级概念:控制转换
5.11.5高级概念:复合状态与嵌套状态
5.11.6高级概念:并发与控制
5.11.7高级概念:子状态机状态
5.11.8高级概念:其他状态机图元素
5.12时间图
5.12.1基本概念:更多相同之处
5.12.2基本概念:布局
5.12.3基本概念:事件
5.12.4基本概念:约束
5.12.5高级概念:另一种表示形式
5.12.6高级概念:事件与消息
5.13对象图
5.13.1基本概念:对象
5.13.2基本概念:对象关系
5.13.3高级概念:端点名称和限定符
5.14通信图
5.14.1基本概念:对象、链接和消息
5.14.2基本概念:顺序表达式
5.14.3高级概念:消息与同步
5.14.4高级概念:迭代子句和约束条件
5.15小结
第6章过程
6.1首要原则
6.1.1成功项目的特征
6.1.2追求理性的开发过程
6.2宏观过程:软件开发生命周期
6.2.1概述
6.2.2宏观过程的内容维:科目
6.2.3宏观过程的时间维:里程碑和阶段
6.2.4宏观过程的时间维:迭代
6.2.5发行计划
6.3微观过程:分析与设计过程
6.3.1概述
6.3.2抽象层次
6.3.3活动
6.3.4产品
6.3.5微观过程与抽象层次
6.3.6识别元素
6.3.7确定元素间的协作
6.3.8确定元素间的关系
6.3.9详细确定元素的语义
6.4小结
第7章实战
7.1管理和计划
7.1.1风险管理
7.1.2任务计划
7.1.3开发复查
7.2人员配备
7.2.1资源配置
7.2.2开发团队角色
7.3发布版本管理
7.3.1配置管理和版本控制
7.3.2集成
7.3.3测试
7.4复用
7.4.1复用的元素
7.4.2建立复用制度
7.5质量保证和测量指标
7.5.1软件质量
7.5.2面向对象测量指标
7.6文档化
7.6.1开发遗产
7.6.2文档化的内容
7.7工具
7.7.1工具种类
7.7.2组织上的意义
7.8特殊主题
7.8.1领域特定问题
7.8.2采纳面向对象技术
7.9面向对象开发的好处和风险
7.9.1面向对象开发的好处
7.9.2面向对象开发的风险
7.10小结
……
第3篇应用
附录A面向对象编程语言
附录B进一步阅读
注解
术语表

序言

出版说明
经久不息的回荡
今时的读书人,不复有无书可读之苦,却时有品种繁多而无从择优之惑,
甚而专业度颇高的技术书领域,亦日趋遭逢乱花迷眼的境地。此时,若得觅权
威书评,抑或有公信力的排行榜,可按图索骥,大大增加选中好书的命中率。
然而,如此良助,不可多得,纵观中外也唯见一枝独秀——素有“软件业奥斯
卡”之美誉的 Jolt 奖!
震撼世界者为谁
在计算设备已经成为企业生产和日常生活之必备工具的今天, 专业和大众
用户对于软件的功能、 性能和用户体验的要求都在不断提高。 在这样的背景下,
如何能够发挥出软件开发的最高效率和很大效能, 已经是摆在每一个从业者面
前的重大课题,而这也正是 Jolt 大奖横空出世的初衷及坚持数年的宗旨。
Jolt 大奖历时 20 余年, 在图书及软件业知名度极高, 广受推崇。 奖如其名,
为引领计算机科学与工程发展主流, Jolt 坚持将每年的奖项只颁给那些给整个
IT 业界带来震撼结果的图书、工具、产品及理念等,因一流的眼光及超高的专
业度而得以闻名遐迩,声名远播。
除图书外, Jolt 针对软件产品设有诸多奖项分类,如配置管理、协作工具、
数据库引擎/数据库工具、设计工具/建模、开发环境、企业工具、库/框架、移
动开发工具等。但图书历来是 Jolt大奖中很受瞩目且传播最广的一个奖项分支。
Jolt 曾设有通用类图书、技术类图书等分类,每个分类又设有“奖”( Jolt
Award,一般为一个)和“生产力奖”( Productivity Award,一般为 2 或 3 个)。
IV 面向对象分析与设计(第 3 版)(修订版)
获奖技术图书一经公布,即打上经典烙印,可谓一举“震撼全世界”(赞助商
Jolt 可乐的广告词)。
作为计算机技术图书的后进,我们总在追问——是谁在震撼世界,是谁在
照亮明天? Jolt 大奖恰似摆在眼前的橱窗, 让我们可以近距离观看潮流在舞蹈,
倾听震撼在轰鸣!
朝花夕拾为哪般
Jolt 像是一年一度的承诺,在茫茫书海中为我们淘砺出一批批经得起岁月
冲刷的杰作, 头顶桂冠的佳作也因而得以一批批引进中国, 为国人开阔了眼界,
滋补了技术养分。然而,或因技术差距造就的生不逢时、水土不服,或因翻译、
制作的不如人意,抑或是疏于宣传等诸多原因,这些经典著作在国内出版后,
尽管不乏如获至宝的拥趸,却仍不为诸多人所知,从而与大量本应从中获益的
读者擦肩而过。既然这生生错失的遗憾本不该发生,则更不应延续。为此,我
们邀国外出版同行、国内技术专家一道,踏上朝花夕拾之路,竭力为广大读者
筛选出历久弥新、震撼依旧的 Jolt 图书精品。
Jolt 获奖图书皆由业界专家一致评出,并得到软件从业人员的高度认可,
虽然这些书今天读来, 不再能看到 20 世纪史诗时代那般日新月异的理论突破,
以及依赖于高深繁复的科学研究所取得的系统化成果, 更多是在日复一日的开
发实践中总结和提炼出来的工程思想和方法论。重新选材之所以有所弃取,从
Jolt 多年来的评奖规律中可窥端倪——
一万小时真理见
凡是在工程思想领域取得革命性、颠覆性突破的图书,就被归于“震撼”
获奖分类。比如,从基于过程的程序设计模型过渡到面向对象的全新模型,就
是软件开发思想上的一次带来巨大震撼的革命;再比如,打破传统的瀑布模型
而转向持续集成的软件交付模型,这也是一场业界的重大思想转变。像这样的
重大思想突破,可以说是数年甚至数十年一遇的,而荣获 Jolt 大奖的图书中更
为常见的,则是基于佳实践的“生产效率”获奖者。获得此类殊荣的图书,
都是作者们从平凡的、重复的,甚至用一般人的眼光看来不怎么起眼的日常开
经久不息的回荡 重看面向对象V
发实践中,以独具的慧眼、过人的耐心和大胆的创新,闯开一条不平常道路的
心血与经验总结。
这些图书所涉及的主题,都是普通的软件开发人员每天要面对的工作——
代码阅读、 撰写测试用例、 修复软件问题……但就是这样貌似平淡无奇的工作,
是否能每一天、每一个项目都做好,着实拉开了软件开发人员素质的差距,也
决定了软件企业开发出来的产品和服务的质量。我们中国有一句古话,叫作熟
能生巧;某位著名企业家也说过一句家喻户晓的名言:“把简单的事千百万次
地做好,就是不简单的。”这些朴素而实际的真理,同样也是本套丛书最能彰
显的所谓程序员精神。它建立在脚踏实地的实践基础之上,也充满了对于自由
和创新的向往。
名作可堪比名曲
就不因岁月流逝而褪色来说,与这些 Jolt 名作相媲美者,只有那些百年响
彻、震撼古今的经典名曲。希望本丛书带给大家的每部著作,也如百听不厌的
乐曲,掩卷良久方余音绕梁,真知存心。仔细想来,软件开发与古典音乐岂非
有异曲同工之妙?既是人类心智索问精确科学的探究, 亦是寻觅美学享受的追
求。工程是艺术的根基,而艺术是工程的顶峰。衷心地希望各位读者能够认真
阅读本丛书的本本珍品,并切实地用于自 己的日常工作中,在充分享受大师魅
力的同时,为中国的软件事业谱写更多、更震撼的乐章。
VI 面向对象分析与设计(第 3 版)(修订版)
谨以本书献给 Jan:
我的朋友,我的爱人,我的妻子。
——Grady
重看面向对象VII
重看面向对象
软件的本质是什么?从不同的角度来看,会有不同的答案。有人认为是程
序加文档, 有人认为是人机交互,有人认为是增删改查, 有人认为是抽象模型,
而我认为是算法。
计算机科学的基石是图灵机抽象:一个输入集合,一个输出集合,一个内
部状态集合,一个计算规则集合。这个抽象十分强大,我们甚至可以认为一头
奶牛也是一个图灵机:吃的是草,挤的是奶。
一个表达式也是一个图灵机,其中的操作数是输入,求值的结果是输出。
一个函数也是图灵机,参数是输出,返回值是输出。编程或设计软件就是在通
用图灵机的基础上,设计一个具体的图灵机。我们设计软件接受怎样的输入,
设计软件内部的状态,设计表示计算规则的代码,设计软件的输出。
近年来逐渐流行的函数式编程,就是建立在这个抽象的基础上。而且函数
式编程的思想由来已久,可以追溯到最古老的高级语言之一: Lisp。这种思想
非常简单:给定一个输入集合,经过函数的处理,给出一个输出集合。由此也
导出了 Map-Reduce 等流行的架构设计模式: 一个计算集群仍然是一个图灵机。
纯粹的函数有一点不足, 它没有内部状态。 可以说, 它是简化了的图灵机。
但在有些时候,我们确实需要内部状态。根据内部状态的不同,对于同样的输
入,可能给出不一样的输出。于是便有了闭包的概念,它是一个函数加上相关
的上下文环境状态。这样,我们可以毫无困难地构建任何具体的图灵机(好吧,
正确实现一个算法还是比较困难的)。
闭包可以看成是拥有内部状态的函数,这就相当于一个简单的对象,它只
有一个方法。反过来,对象可以看成是几个闭包,它们共享了内部状态。所以
有人说:闭包是懒人的对象,对象是懒人的闭包。因此,函数式编程和面向对
VIII 面向对象分析与设计(第 3 版)(修订版)
象思想,在底层基础上是一致的。
面向对象思想的历史和函数式一样久远。实际上,它们都是我们在设计算
法时的一种抽象。只有利用抽象概念,才能实现人与人之间的沟通。“你想吃
苹果吗?”这里的“苹果”就是一个抽象概念,它隐藏了苹果实现的许多细节。
人的大脑喜欢工作在一组抽象概念上。名词是结构或存在的抽象,动词是行为
或过程的抽象。
我们在设计算法时,既需要函数抽象,也需要对象抽象。今天,面向对象
和函数式编程的思想在各种编程语言中融合,可以说是殊途同归。
抽象是强大的工具,但用得不好,也会产生不良的后果。最重要的问题,
就是创建太多不必要的抽象。毕竟,抽象只是我们脑中的概念,我们可以创造
出任何概念。比如上帝和各种鬼神,直到科学家说,在科学的系统里不需要假
设存在一个上帝。面向对象在这方面遇到的问题比较多。举例来说,一个 Java
的 Hello world 程序,就要涉及好几个概念,直接导致程序的代码比较长。而
在函数式编程中, 这通常只是一次函数调用。又比如, 在一个使用 Struts、 Spring、
Hibernate 构建的 Java Web 应用程序中,处理一个 Get 请求的调用栈,可能是
长长的一串。数据在不同的概念抽象之间反复倒手,白白浪费了计算资源。
任何两种观点都是互补的。 面向对象思想在过去的软件开发中取得了辉煌
的成绩。函数式编程让我们能从另一个角度审视面向对象,更进一步体会面向
对象抽象的强大,也发现面向对象中一些误用的地方。如无必要,勿增实体。
也许我们不需要假设以太的存在,就能解释光在真空中的传播。
多年后重读这本书, 促使我重新思考, 需要利用哪些抽象来设计我的算法。
这些年来,这本书让我受益良多,再次向大家郑重推荐。
王海鹏
2016 年 1 月 5 日
特别的 Booch,特别的书IX
特别的Booch,特别的书
以下几点也许是您购买本书的理由。
1.读过 Robert C. Martin 的 Agile Principles 的读者,很容易注意到该书前
言的第一句话,“ Bob,你说过去年就能写完这本书的——Claudia Frers 在 1999
年 UML World 大会上抱怨。”“这本书”指的是 Robert C. Martin 在 20 世纪 90
年代的代表作 Designing Object-Oriented C++ Application using the Booch
Method。 Agile Principles 本来是作为 Designing 一书的第 2 版。 由此可见, Robert
C. Martin 深受 Booch 的影响。
2. Grady Booch 是最早提出面向对象分析设计方法的方法学家之一。 20
多年来, Grady Booch 一直担任 Ration

文摘

出版说明
经久不息的回荡
今时的读书人,不复有无书可读之苦,却时有品种繁多而无从择优之惑,甚而专业度颇高的技术书领域,亦日趋遭逢乱花迷眼的境地。此时,若得觅权威书评,抑或有公信力的排行榜,可按图索骥,大大增加选中好书的命中率。然而,如此良助,不可多得,纵观中外也唯见一枝独秀——素有“软件业奥斯卡”之美誉的 Jolt 奖!
震撼世界者为谁
在计算设备已经成为企业生产和日常生活之必备工具的今天, 专业和大众用户对于软件的功能、 性能和用户体验的要求都在不断提高。 在这样的背景下,如何能够发挥出软件开发的最高效率和很大效能, 已经是摆在每一个从业者面前的重大课题,而这也正是 Jolt 大奖横空出世的初衷及坚持数年的宗旨。
Jolt 大奖历时 20 余年, 在图书及软件业知名度极高, 广受推崇。 奖如其名,为引领计算机科学与工程发展主流, Jolt 坚持将每年的奖项只颁给那些给整个IT 业界带来震撼结果的图书、工具、产品及理念等,因一流的眼光及超高的专业度而得以闻名遐迩,声名远播。
除图书外, Jolt 针对软件产品设有诸多奖项分类,如配置管理、协作工具、数据库引擎/数据库工具、设计工具/建模、开发环境、企业工具、库/框架、移动开发工具等。但图书历来是 Jolt大奖中很受瞩目且传播最广的一个奖项分支。Jolt 曾设有通用类图书、技术类图书等分类,每个分类又设有“奖”( JoltAward,一般为一个)和“生产力奖”( Productivity Award,一般为 2 或 3 个)。获奖技术图书一经公布,即打上经典烙印,可谓一举“震撼全世界”(赞助商Jolt 可乐的广告词)。
作为计算机技术图书的后进,我们总在追问——是谁在震撼世界,是谁在照亮明天? Jolt 大奖恰似摆在眼前的橱窗, 让我们可以近距离观看潮流在舞蹈,倾听震撼在轰鸣!
朝花夕拾为哪般
Jolt 像是一年一度的承诺,在茫茫书海中为我们淘砺出一批批经得起岁月冲刷的杰作, 头顶桂冠的佳作也因而得以一批批引进中国, 为国人开阔了眼界,滋补了技术养分。然而,或因技术差距造就的生不逢时、水土不服,或因翻译、制作的不如人意,抑或是疏于宣传等诸多原因,这些经典著作在国内出版后,尽管不乏如获至宝的拥趸,却仍不为诸多人所知,从而与大量本应从中获益的读者擦肩而过。既然这生生错失的遗憾本不该发生,则更不应延续。为此,我们邀国外出版同行、国内技术专家一道,踏上朝花夕拾之路,竭力为广大读者筛选出历久弥新、震撼依旧的 Jolt 图书精品。
Jolt 获奖图书皆由业界专家一致评出,并得到软件从业人员的高度认可,虽然这些书今天读来, 不再能看到 20 世纪史诗时代那般日新月异的理论突破,以及依赖于高深繁复的科学研究所取得的系统化成果, 更多是在日复一日的开发实践中总结和提炼出来的工程思想和方法论。重新选材之所以有所弃取,从Jolt 多年来的评奖规律中可窥端倪——一万小时真理见凡是在工程思想领域取得革命性、颠覆性突破的图书,就被归于“震撼”获奖分类。比如,从基于过程的程序设计模型过渡到面向对象的全新模型,就是软件开发思想上的一次带来巨大震撼的革命;再比如,打破传统的瀑布模型而转向持续集成的软件交付模型,这也是一场业界的重大思想转变。像这样的重大思想突破,可以说是数年甚至数十年一遇的,而荣获 Jolt 大奖的图书中更为常见的,则是基于佳实践的“生产效率”获奖者。获得此类殊荣的图书,都是作者们从平凡的、重复的,甚至用一般人的眼光看来不怎么起眼的日常开发实践中,以独具的慧眼、过人的耐心和大胆的创新,闯开一条不平常道路的心血与经验总结。
这些图书所涉及的主题,都是普通的软件开发人员每天要面对的工作——代码阅读、 撰写测试用例、 修复软件问题……但就是这样貌似平淡无奇的工作,是否能每一天、每一个项目都做好,着实拉开了软件开发人员素质的差距,也决定了软件企业开发出来的产品和服务的质量。我们中国有一句古话,叫作熟能生巧;某位著名企业家也说过一句家喻户晓的名言:“把简单的事千百万次地做好,就是不简单的。”这些朴素而实际的真理,同样也是本套丛书最能彰显的所谓程序员精神。它建立在脚踏实地的实践基础之上,也充满了对于自由和创新的向往。
名作可堪比名曲
就不因岁月流逝而褪色来说,与这些 Jolt 名作相媲美者,只有那些百年响彻、震撼古今的经典名曲。希望本丛书带给大家的每部著作,也如百听不厌的乐曲,掩卷良久方余音绕梁,真知存心。仔细想来,软件开发与古典音乐岂非有异曲同工之妙?既是人类心智索问精确科学的探究, 亦是寻觅美学享受的追求。工程是艺术的根基,而艺术是工程的顶峰。衷心地希望各位读者能够认真阅读本丛书的本本珍品,并切实地用于自 己的日常工作中,在充分享受大师魅力的同时,为中国的软件事业谱写更多、更震撼的乐章。
谨以本书献给 Jan:
我的朋友,我的爱人,我的妻子。
——Grady

重看面向对象
软件的本质是什么?从不同的角度来看,会有不同的答案。有人认为是程序加文档, 有人认为是人机交互,有人认为是增删改查, 有人认为是抽象模型,而我认为是算法。
计算机科学的基石是图灵机抽象:一个输入集合,一个输出集合,一个内部状态集合,一个计算规则集合。这个抽象十分强大,我们甚至可以认为一头奶牛也是一个图灵机:吃的是草,挤的是奶。
一个表达式也是一个图灵机,其中的操作数是输入,求值的结果是输出。一个函数也是图灵机,参数是输出,返回值是输出。编程或设计软件就是在通用图灵机的基础上,设计一个具体的图灵机。我们设计软件接受怎样的输入,设计软件内部的状态,设计表示计算规则的代码,设计软件的输出。
近年来逐渐流行的函数式编程,就是建立在这个抽象的基础上。而且函数式编程的思想由来已久,可以追溯到最古老的高级语言之一: Lisp。这种思想非常简单:给定一个输入集合,经过函数的处理,给出一个输出集合。由此也导出了 Map-Reduce 等流行的架构设计模式: 一个计算集群仍然是一个图灵机。纯粹的函数有一点不足, 它没有内部状态。 可以说, 它是简化了的图灵机。但在有些时候,我们确实需要内部状态。根据内部状态的不同,对于同样的输入,可能给出不一样的输出。于是便有了闭包的概念,它是一个函数加上相关的上下文环境状态。这样,我们可以毫无困难地构建任何具体的图灵机(好吧,正确实现一个算法还是比较困难的)。
闭包可以看成是拥有内部状态的函数,这就相当于一个简单的对象,它只有一个方法。反过来,对象可以看成是几个闭包,它们共享了内部状态。所以有人说:闭包是懒人的对象,对象是懒人的闭包。因此,函数式编程和面向对象思想,在底层基础上是一致的。
面向对象思想的历史和函数式一样久远。实际上,它们都是我们在设计算法时的一种抽象。只有利用抽象概念,才能实现人与人之间的沟通。“你想吃苹果吗?”这里的“苹果”就是一个抽象概念,它隐藏了苹果实现的许多细节。人的大脑喜欢工作在一组抽象概念上。名词是结构或存在的抽象,动词是行为或过程的抽象。
我们在设计算法时,既需要函数抽象,也需要对象抽象。今天,面向对象和函数式编程的思想在各种编程语言中融合,可以说是殊途同归。
抽象是强大的工具,但用得不好,也会产生不良的后果。最重要的问题,就是创建太多不必要的抽象。毕竟,抽象只是我们脑中的概念,我们可以创造出任何概念。比如上帝和各种鬼神,直到科学家说,在科学的系统里不需要假设存在一个上帝。面向对象在这方面遇到的问题比较多。举例来说,一个 Java的 Hello world 程序,就要涉及好几个概念,直接导致程序的代码比较长。而在函数式编程中, 这通常只是一次函数调用。又比如, 在一个使用 Struts、 Spring、Hibernate 构建的 Java Web 应用程序中,处理一个 Get 请求的调用栈,可能是长长的一串。数据在不同的概念抽象之间反复倒手,白白浪费了计算资源。
任何两种观点都是互补的。 面向对象思想在过去的软件开发中取得了辉煌的成绩。函数式编程让我们能从另一个角度审视面向对象,更进一步体会面向对象抽象的强大,也发现面向对象中一些误用的地方。如无必要,勿增实体。也许我们不需要假设以太的存在,就能解释光在真空中的传播。
多年后重读这本书, 促使我重新思考, 需要利用哪些抽象来设计我的算法。
这些年来,这本书让我受益良多,再次向大家郑重推荐。
王海鹏
2016 年 1 月 5 日
ISBN9787121286667,7121286661
出版社电子工业出版社
作者格雷迪·布奇 (Grady Booch)
尺寸16