欢迎阅读本书第2版!继本书第1版在1991年写成以后,技术领域已有诸多变化。回想当年,那时,面向对象(OO)技术还相当新颖,初始的兴奋和激情过后,人们对于OO技术究竟是真实可用还是只是一种短暂的时尚,仍怀有疑虑。俱往矣,想一想十多年来发生的变化吧!.
·OO语言。C++已成为主流,Java也得到普遍应用。目前具有主导地位的编程语言都是OO的。
·OO数据库。令人惊奇的是,OO数据库已经过气,但现在的关系数据库已经融入一些OO的特性。
·OO建模。对象管理组织(Object Management Group,OMG)制定的统一建模语言(Unified Modeling Language,UML)标准已经合并和统一了各种相互竞争的表示法。
·OO方法论。目前所有开发方法论都毫无例外地融合了OO的思想和概念。
OO技术已经真正成为计算机技术主流的一部分,它不再是什么“异类”,已经成为通常的实践。
本书内容
本书为软件开发提供了一种面向对象的方法,它的基础是,对来自真实世界的对象进行建模,随后使用这些模型围绕对象构造独立于语言的设计。面向对象建模与设计有助于更好地理解需求,进行更清晰的设计,创建更具维护性的系统。我们描述了一组面向对象的概念和一种独立于语言的图形表示法,它们可被用来分析问题需求,并设计问题的解决方案,之后通过编程语言或数据库加以实现。我们介绍的方法能够在整个软件开发过程中运用相同的概念和表示法。软件开发人员不需要在每个开发阶段都转换不同的表示法。
我们阐释了如何在整个软件生命周期(从分析、设计到实现)中使用面向对象的概念。本书并非以讲述面向对象语言或编程为主。相反,我们强调编程是开发过程中的最后阶段,整个过程包括陈述问题,理解需求,规划解决方案,用特定语言实现程序。好的设计技术会将实现细节推延至设计之后的阶段完成,以保持灵活性。开发过程之前的错误会对最终的产品和产品的完成时间产生巨大的影响。我们还描述了如何用面向对象语言和关系数据库来实现面向对象设计。
本书强调的面向对象技术并不只是一种编程方法,更重要的是,它是一种利用真实世界的概念而非计算机概念来抽象思考的方法。我们发现对于有些人来说,这种转换过程是很困难的。那些强调面向对象编程的书籍往往无法帮助程序员学会抽象思维。我们发现图形表示法有助于软件开发者直观想象问题,而不是过早地去寻求实现的方法。
我们还阐释了对于大多数应用而言,无论其最终是用什么语言实现的,面向对象技术提供的都是一种高效实用的软件开发方法。本书采用了一种非形式化的方法;没有证明或希腊字母表示的形式化定义。借助面向对象技术所捕获的直觉,并且通过提供能够系统应用于实际问题的表示法和方法论,希望形成一种注重实效的解决问题的方法。我们将会同时提供好的和坏的设计技巧和示例,帮助软件开发者避免常见的陷阱。
本书的读者对象
本书面向的读者是软件专业人士和学生。读者可以了解到如何将面向对象的概念应用到软件开发生命周期的全部阶段。我们假定读者事先并不具备任何面向对象概念方面的知识。我们还假定读者熟知基本的计算概念,但不必有太多的形式化背景知识。甚至熟悉面向对象的程序员也会因懂得如何系统地设计程序而大受裨益;他们会吃惊地发现某些常见的面向对象编程实践恰恰违反了良好设计的原则。
数据库设计人员也会对本书感兴趣。尽管面向对象程序设计语言已经受到最大的关注,面向对象数据库设计也还是很引人注目且非常实用的。我们用整整一章的篇幅讲述如何使用关系数据库来实现面向对象模型。
本书可以作为高年级本科生及研究生软件工程或面向对象技术课程的教材。它也可以用作数据库或程序设计语言课程的补充教材。使用本书的前提是掌握现代程序设计语言,了解基本计算机科学术语和概念,如语法、语义、递归、集合、过程、图和状态;详细的形式化背景并不是必需的。
我们的关注点与面向对象编程界的一些人有所不同,但与信息建模与设计方法论界一致。我们强调面向对象构造是真实事物的模型,而不单是用于编程的技术。我们把对象之间的关系提高到和类相同的语义层次,而不是将其隐藏为对象内部的指针。在继承和方法上我们关注得较少。对继承机制的精确细节不予过多强调。我们所大力强调的是类型、类、建模和高级规划。我们还演示了如何将面向对象的概念应用于状态机。
本书由四部分组成。第一部分是以一种高层的、独立于语言的方式描述面向对象的概念。尽管一开始会忽略高级主题,但这些概念对于本书的其余部分都是基础。第一部分还介绍了本书中所使用的UML表示法。第二部分从问题陈述到分析、系统设计和类设计,一步一步地描述了软件开发的面向对象方法学。在这个方法学中除了最后阶段以外所有阶段都是独立于语言的。第三部分用面向对象语言和关系数据库描述了面向对象设计的实现。尽管并不是想替代面向对象编程的书籍,但它还是描述了可应用于不同环境的一些考虑。第四部分描述了成功的面向对象开发所需要的软件工程实践。..
作者曾经接触过许多应用,有着多年面向对象分析、设计、编程和数据库建模的经验。我们热衷于面向对象的方法,发现它几乎适用于各类应用。我们也发现使用面向对象的概念以及图形表示法和开发方法学,可以大大地提高软件的质量、灵活性和可理解性。我们希望本书会有助于传达这些信息。
本书配有丰富的习题,覆盖了一系列应用领域以及实现目标。我们建议读者随着阅读的进度,试着完成其中一些习题。OO技术是无法通过阅读来学习的,必须通过实践。本书的后面包含了部分习题的答案。
本书特色
.市场上有许多关于面向对象技术的图书。本书不同于这些书的地方在于,它讲授的是如何思考面向对象建模,而不仅仅是给出编程语言或建模表示法的技术细节。
许多面向对象方面的书籍常常会从某种语言的角度切入,大多都是讲述编程问题的。在这些书当中有一些也的确讨论了设计问题,但仍然以关于编程为主。很少有书是关注于面向对象分析或设计的。我们阐释了面向对象概念可以也应该在整个软件生命周期内使用。
除此之外,有很多书也描述了UML的概念。本书的不同之处在于,它不仅解释了概念,还解释了它们的基本用途,以及该如何用它们来构建软件。我们没有解释每一个概念和个中细微差别,但我们集中精力阐述了UML的核心——这足以帮助读者学会如何使用UML来构建更好的软件。
自第1版以来的变化
自我们完成本书的第1版以来,已有14年的时间。其间技术上有诸多改进,因此这一版也有许多变化。
·表示法。我们把OMT表示法替换成了UML表示法(UML 2.0)。UML现在已占统治地位,是OO建模的标准语言。
·过程。第2版在软件开发过程中增加了更多的内容。现在,我们把领域分析和应用分析区分开来。我们还加入了实现建模。我们特意把过程弄得简单并且“轻量级”,这样更适合学生掌握。本书的过程是“重量级”过程(如IBM Rational的RUP)的子集。
·三个模型。我们延续第1版的重点——“三个模型”,因为我们相信它有助于OO建模教学和学习。但是,我们取消了功能模型,因为它并没有像我们期望的那样有用。取而代之,我们增加了交互模型来合并用例和顺序图并给出对对象之间的行为的更完整的认识。
·软件工程。第四部分包含了几种重要的软件工程专题:迭代开发、模型的管理以及遗留系统的处理。
·编程语言。在过去十年当中,编程语言发生了巨大的变化。Smalltalk渐渐远去,C和Fortran的重要性也慢慢减弱。现在,C++和Java是占主导地位的OO编程语言,因此,我们也相应把重点放在它们身上。
·数据库。OO模型不仅为程序设计编码提供了一个可靠的基础,也为关系数据库提供了一个可靠的基础。本书用完整的一章描述如何从UML模型构建有效的、正确的和可扩展的数据库。
·案例研究。在第1版出版的时候,我们感觉有必要验证OO技术的合理性,因此我们包括了几个案例研究。如今,文献当中可以找到许多案例研究,因此我们在本书中就把它们剔除。
在这一版中,我们延续了第1版的风格和注重实用的思想,同样给出了许多示例和习题。
网站
我们把与本书相关的资料放在了网站www.modelsoftcorp.com上。
致谢
在过去这些年当中,我们曾与许多人一起共事,他们将其所长传授给我们,给我们机会尝试自己的思想,帮助我们在这个过程中学习。我们要感谢这些人,从以前GE研发中心管理层直到最近我们业务上的朋友和客户。
第1版还有另外三个人参加编写,他们是Bill Premerlani、Fred Eddy和Bill
Lorensen,本版却只有我们两个人。感谢他们过去所做的贡献,那是第2版的基础。感谢他们在我们编写第2版的过程中给予的支持和鼓励。
Chris Kelsey在第2版中担任了重要的角色,应该特别提出。她是第18章(OO编程语言)的主要作者,同时也是积极的审稿人。
感谢其他审稿人(Mickael Berndtsson、Peter Chang、Bill Premerlani以及John Putnam)花时间阅读我们的书稿,并给予极赋见地的批评意见。...
最后,感谢我们的家人和同事,感谢在本书编写的过程中,他们对诸多干扰所显示出的耐心。
Michael Blaha
于密苏里州切斯特菲尔德
blaha@computer.org
James Rumbaugh
于加利福尼亚州库珀蒂诺