《UML面向对象设计基础》—第2章2.4节面向对象的益处

2.4 面向对象的益处
UML面向对象设计基础
本节的题目既迎合愤世嫉俗者又符合盲从者。

一些反对者可能会说面向对象没有什么优点;它仅是一种流派或是一场从西方一些地区引发起的全球性阴谋。而一些激进派则宣称面向对象是一流的并且是所有软件成功的唯一途径。面向对象不仅适用于Windows系统,而且还适用于无所不能的分布式Web体系结构。

这两种说法都太极端。作者认为面向对象是有用的,但不能神化,它还不够完美,其特定实用程序依赖于在软件开发过程中的使用方法。

没有一种有价值的软件工程方法可以成为“当年时尚(Fad of the Year)”。当年时尚指某种方法在几个月或一年内变得十分风行(有关“Fad of the Year”的详细信息参见[Page-Jones,1991])。盲从者歇斯底里地指望“当年时尚”可以解决所有的软件问题。怀疑论者则给盲从者泼冷水而坐等其观。当不加选择地使用这种方法而效果平平后,盲从者则放弃这种方法蜂拥地转向下一个当年时尚。如果你的企业在“技术的浪尖上摇摆”,则应马上扭转盲从的局面,可能会从面向对象的技术中获得一些收益。

面向对象不是万能的解决方案,愚蠢的解决问题方案也会使你的企业步入困境。然而正如在本书中将要看到,面向对象尽管充满挑战,但确实是一种有效的软件开发方法。一个成熟而职业化的企业不应该以极端的方式对待面向对象,而应该认真研究面向对象方法并将面向对象纳入开发专业软件的长期计划中。

下面讨论面向对象对企业的六个主要软件活动的内在影响。

2.4.1 用户需求分析
结构化技术的过程分析和数据分析之间的边界在哪儿从未解决。数据流图的过程世界与实体关系图的数据世界难以共存。过程和数据分析在某些场合可以满足要求,而在某些场合就会发生冲突。这种冲突在实时系统模型中尤为突出,如控制过程与数据模型的对应关系经常变得不清晰。

面向对象方法在生命周期的早期就将过程和数据研究融合在一起。尽管不能明确地称为“过程和数据分析”,但在谈论面向对象(如第1章所述)时称“动态和静态分析”更为妥当,使用面向对象概念将这两方面的分析很好地协调起来。难怪有人将面向对象中过程和数据的融合比作Einstein的相对论中空间和时间的融合,尽管这种比喻有些过分。

2.4.2 软件设计
在软件设计中,面向对象既有优势,又有不足。

面向对象的优势是使设计者将软件中的棘手问题利用封装特性隐藏起来,这些问题包括:费解的数据结构、复杂的组合逻辑、详细的过程和数据之间的关系、高深的算法及可怕的设备驱动程序。

面向对象的缺点是应用封装和继承特性使结构本身变得复杂。在面向对象中很难创建一个戈尔地雅斯吊床难结,要么不可建立,要么使得系统的运行像一匹负重的赛马。避免出现这些问题正是面向对象设计者所面临的挑战。

本书旨在提供一些思想、技术和原则使读者可以应付面向对象的设计挑战。本书第二部分介绍 UML的大多数有用特性,UML是描述和探索设计问题的最流行方法。

第三部分介绍一些设计原则和准则,据此您可对设计进行评估。使用这些原则和准则可以创建面向对象的框架,由此可构造协调一致的系统并可独立进行维护。尽管面向对象的设计有时是非常艰辛的,但一旦完成它,对处理大量复杂单元所带来的益处要多于采用其他设计技术。

2.4.3 软件构造
采用面向对象方法建立系统最常考虑的质量要素为: 可重用性、可靠性、健壮性、可扩展性、分布性和可存储性。

(1)可重用性

面向对象通过在类的级别上而不是在各子程序级别上提高代码重用来改进软件可重用性。在企业中通过开发和建立适合企业应用的类库,这种方式实际上是建立一种新的符合特定需求的非常高层的语言。

在实际中,对象类是一个足够复杂的有机体,可以作为独立的软件单元从公司中的一个应用移植到另一个应用。至少类可以利用辅助类的框架来完成其特定功能(在9.1和9.2节将进一步解释)。

(2)可靠性

可靠代码的运行具有可重复性和一致性。仅当能用某种方法证明代码的正确性时,代码才可达到这些质量要求。面向对象代码采用类的不变式(class invariants)确信的断言,借助自身进行验证。类的不变式是指给定类中的每一个对象必须满足的条件。例如,类Person的不变式可能为 dateOfBirth <= todaysDate。

类的不变式(第10章介绍其他有关内容)使得彻底地验证代码成为可能。在静态分析或检查中,可以验证设计或其结果代码是否满足设想的不变式条件。虽然不可能证明(即使采用面向对象)代码绝对正确,但面向对象确实使检查代码的行为变得更加容易。

(3)健壮性

软件的健壮性是指软件发生故障时的完全恢复能力。典型故障为声明错误、内存错误、外部设备错误及算法溢出。健壮的软件可以捕获异常并执行故障恢复程序(通常称为异常处理程序或营救程序)。

许多现代的面向对象语言和环境都支持错误检测和处理功能,因此有利于开发健壮的软件。获得健壮的面向对象代码的有效方法是将推断和恒定条件的概念与异常处理的概念相结合。在某些面向对象环境中,在运行时可以监控恒定类和其他推断,当推断发生错误时,软件可以轻松地恢复。

对异常处理的另一种方法就是不进行异常处理:不检测异常,当异常发生时,只是简单地让软件崩溃。当然,也无健壮性可言!

(4)可扩展性

软件的可扩展性简单地用技术术语描述即“说明域与实现域之间是同构的”。用通俗的话说,即解决问题的模型应该满足问题的模型。为此,必须保证用户的一些小的改变不会导致主要系统灾难性的后果。并且,当修改面向对象代码时,很少会引发其他部分产生的莫名其妙的问题。由于面向对象基于更高层次上建立软件单元,它更接近生活的抽象,因此比传统技术更容易建立“同构”。

可扩展性和继承性经常一起使用。用户常在已经声明的主题中增加变量对系统进行扩展。例如:“不仅仅只定义客户,现在需要区分国内客户和国外客户”。使用面向对象技术,可以在已有的超类下增加继承子类的方法实现扩展。

(5)分布性

1989年,面向对象管理组织(Object-Management Group,OMG)承担了一个十分艰巨的任务:将几十个主要硬件和软件厂商统一在面向对象的可互操作标准上。我曾对他们所做的努力表示怀疑,但他们取得的成功使我感到震惊!

最为显著的成果就是公共对象请求代理体系结构(Common Object Request Broker Architecture, CORBA),这种软件体系结构支持分布在多个平台上的面向对象系统(想了解有关CORBA的更多知识,参见[Mowbray and Zahavi,1995]和 [Orfali et al.,1996])。这种体系结构引起了人们的很大关注。CORBA还可使对象“互相交谈”,不仅可以在类似的机器上,而且可以在运行不同操作系统或连接不同网络的机器上进行通信。 

在CORBA环境中,甚至可以用不同的语言编写类,然后用不同的编译程序编译的方式建立对象。此外,最重要的是CORBA提供了各种标准服务(如复制、代理、关系处理和事件仲裁等服务),这样省去了编写许多分布式系统必需的冗长代码。

换言之,CORBA使平台的分布式和异构对用户及应用设计者和编程者透明。编写消息时可采用类似通常的单处理器的方式,让 CORBA服务处理许多繁杂的底层细节。

(6)可存储性

如果不提及面向对象数据库管理系统,那么本节就不能算完整。建立任何面向对象应用,ODBMS都非常有用,特别是应用涉及到声音和图像时更是如此,因为这些数据不适合用标准的表格形式存储。

ODBMS可以存储任意的对象类(不仅包括诸如String、Real、Integer和Date类,而且还包括Customer、Aircraft 、CityMap、VideoClip等),此外,它还提供面向对象封装、继承、多态及其他重要的面向对象特性。大多数 ODBMS提供查询语言(如面向对象查询语言,OQL)来代替关系DBMS的SQL。

2.4.4 软件维护
可重用性、可靠性、健壮性、可扩展性是软件维护的四大支柱。许多企业在软件维护上花费很高。由于面向对象可以提高这四方面质量特性,因此能在以下方面降低系统的维护开销:

可重用性降低了企业整个代码维护的费用。减少了编写新代码及以后系统维护的量,特别是开发头一两个项目后,效果特别明显。
可靠性减少了用户的不满意和对修正问题的痛苦抱怨。
健壮性确保软件可被维护而不至于在桌面上瘫痪。
可扩展性迎合了用户修改系统的“渐进式”倾向,因此,用户可以不断地对软件寻求更多的较小的修改。
2.4.5 软件使用
图形应用一直是面向对象的主要选择。通常人们通过面向对象实现图形用户界面(GUI)。这样做有两个原因:其一是概念;其二是实现。

在概念上,面向对象的隐喻较好地符合典型的窗口/鼠标/图标界面。比如屏幕上有一个图标,该图标可以表示一个对象如客户。用鼠标点击图标选择该客户,弹出一个菜单,菜单选项与应用于该客户的方法一致。如有一个选项对应changeAddress,而另一个选项对应reassessCreditLimit等。而且,国内客户的菜单可以与国外客户的菜单不同。每个菜单只列出特定客户类型的商业行为。

甚至多态性也可以出现在用户界面中,多态性指一个方法对于不同的类可以有不同的含义和不同的实现。如屏幕上有一个图标表示电子表格对象,而另一个图标表示文档对象。当用户双击Open菜单项时,可以根据这两个图标哪个被加亮,对该对象执行电子表格程序或文本处理程序。换言之,Open方法的特定版本的执行依赖于被加亮的类是Spreadsheet还是Document。

在实现上,允许用户可以建立窗口/鼠标/图标界面的许多商用软件库都是用面向对象语言编写的。由于窗口本身具有许多面向对象的属性,因此大多数窗口界面的开发工具,都有通过窗口运行面向对象的痕迹。

因此,如果说面向对象本身增加了软件的易用性不太准确,但可以准确地说,好的图形用户界面增加了软件的易用性,而面向对象是建立支持GUI软件库的最佳途径。

2.4.6 软件项目管理
目前为止,本书涉及的大部分内容是面向技术人员的。但针对经理的内容是什么?面向对象的另一个技术特色是否一定会慢慢消亡或转到另一个企业?或者面向对象仅仅是使经理搬起石头砸自己脚的绊脚石?

回答是否定的。面向对象不仅适合普通人员,也适合经理们。例如,降低维护开销的技术可以释放管理者的资源,将其投入到待处理的应用中。在经理们看来,面向对象不是纯技术的,面向对象既能给企业的组织也能给经理的工作带来变化。

当一个企业采纳了面向对象,其组织将发生变化。 类的重用需要类库和类库管理人员。 每个程序员都要加入到两个组中的一个:一个是设计和编写新类组,另一个是应用类创建新应用程序组。面向对象不太强调编程(重用性意味减少新代码),需求分析相对地将变得更加重要。

新的符号语言如UML也将带来重大影响。尽管需求分析和软件设计是不同的两个方面,但UML被广泛地应用到这两个模型中。这使现代的O.O.符号化,而结构技术在这方面是非常缺乏的。直到我遇到一家新的面向对象企业的经理告诉我下面一段话,我才意识到这两方面是密不可分的:

过去,技术人员在画圆形图(数据流图中的过程)时,知道他们在做分析,转到画方框图(结构图中的模块)时,知道他们开始设计。现在我从不知道他们在做什么并对此十分担心!

作为转向面向对象企业的经理,应该意识到组织的变化。让职员适应新的角色,在这些角色中需要管理参与工作的人员,鼓励重用而不主张重复编码。需要给技术人员充足的时间考虑类的设计使得构造的类可以满足重用的要求。总之,应该使用不同的术语、不同的工具和不同生命周期以及新的目标来管理项目。

如果经理将面向对象作为一种方法而不是作为一种目标,将会取得良好的效果。面向对象是有可维护性、可扩展性、健壮性、分布性、GUI支持,减少交付时间等诸多益处。作为经理应始终确立目标,并将面向对象作为一种技术来达到预定的目标。

如果在头脑中没有目标,那么面向对象的所有事物开销(金融、组织、社会及感情)似乎都是昂贵的代价。然而,如果不仅知道做什么,而且知道为什么这样做,你就能实现你所追求的面向对象目标。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

时间: 2025-01-21 01:49:17

《UML面向对象设计基础》—第2章2.4节面向对象的益处的相关文章

《UML面向对象设计基础》—第2章2.1节面向对象的起源

第2章 面向对象简史 UML面向对象设计基础 前面讨论了面向对象的固有特性,现在来看一下面向对象是如何适用于软件开发的广阔领域. 当听说Wolfgang Pauli教授提出一种新的基本粒子(μ介子,μ- meson或muon)时,Isidor I .Rabi教授曾经立即予以反驳:"谁承认这种说法?"鉴于此事例,我在本章开头部分列出一些对面向对象有贡献的人士.下面将面向对象置于社会环境中,讨论对这种软件方法的看法.然后,将面向对象置于工程环境中,将面向对象与电子学做一个类比.最后,阐述面

《UML面向对象设计基础》—第2章2.2节面向对象的成熟期

2.2 面向对象的成熟期 UML面向对象设计基础 本节介绍软件工业如何促进面向对象时代的真正到来. 老生物学家们常爱发表这样的言论:个体生物重演了生物发展史.其含义是个体生物胚胎的发展通常演绎着生物整体发展的进化过程(如人类胚胎的发育过程).当然在时间上存在很大的差异.个体生物的发展可能只有几个月,而整体生物却世代繁衍. 尽管老生物学家的说法无庸置疑,但在软件工程中却出现了一种新观点:面向对象软件工程的历史重演了传统软件工程的历史.当然在时间跨度上也存在很大的差异.形成成熟的过程和数据库结构花费

《面向对象设计实践指南:Ruby语言描述》—第1章 1.4节 面向对象编程简介

1.4 面向对象编程简介 面向对象设计实践指南:Ruby语言描述 面向对象的应用程序由对象和它们之间传递的消息构成.其中,消息相对更为重要.但在本节的简介里(以及在本书的前面几个章节里),这两个概念都同等重要. 1.4.1 过程式语言 相对于非面向对象(或过程式)的编程来说,面向对象编程是面向对象的.依据这两种风格的差异来考虑它们很有意义.假设有这么一种通用的编程语言,它可用来创建简单的脚本.在这门语言里,你可以定义变量(即组成多个名称),并将这些名字与少量的数据相关联.一旦进行了分配,便可以通

《UML用户指南(第2版.修订版)》—第1章1.3节面向对象建模

1.3 面向对象建模UML用户指南(第2版.修订版)土木工程师构造了很多种模型.通常这些模型能帮助人们可视化并说明系统的各部分以及这些部分之间的相互关系.根据业务或工程中所着重关心的内容(例如为了帮助研究一个结构在地震时的反应)工程师也可以建立动态模型.各种模型的组织是不同的,各有自己的侧重点.对于软件,有好几种建模的方法.最普通的两种方法是从算法的角度建模和从面向对象的角度建模. 传统的软件开发是从算法的角度进行建模.按照这种方法,所有的软件都用过程或函数作为其主要构造块.这种观点导致开发人员

《设计模式解析(第2版•修订版)》—第1章 1.6节面向对象范型

1.6 面向对象范型 设计模式解析(第2版•修订版) 使用对象将责任转移到更局部的层次 面向对象范型以对象概念为中心,一切都集中在对象上.编写代码时是围绕对象而非函数进行组织的. 对象是什么?对象传统上被定义为带有方法(面向对象领域称呼函数的术语)的数据.糟糕的是,这是一种非常有局限性的对象观.稍后我会给出一个更好的对象定义(在第8章中还会谈到).我说到对象的数据时,可能指数值和字符串这样的简单事物,也可能指其他对象. 使用对象的优点在于,可以定义自己负责自己的事物(参见表1-2).对象天生就知

《设计模式解析(第2版•修订版)》—第1章 1.7节面向对象程序设计实践

1.7 面向对象程序设计实践设计模式解析(第2版•修订版)我们再次考察一下本章开始讨论的形状实例.怎样用面向对象的方式实现它呢?请记住,我们必须完成以下任务. 1.在数据库中找到形状列表. 2.打开形状列表. 3.按某种规则将列表排序. 4.在显示器上显示各个形状. 为了用面向对象方式解决这个问题,我需要定义一些对象和这些对象具有的责任. 在Shape程序中使用对象 所需要的对象如下表所示. 运行程序现在主程序的步骤应该与下面给出的类似. 1.主程序创建一个数据库(ShapeDataBase)对

《设计模式解析(第2版•修订版)》—第1章 1.2节面向对象范型之前:功能分解

1.2 面向对象范型之前:功能分解 设计模式解析(第2版•修订版) 功能分解是一种处理复杂问题的自然方法 让我们从对一种常用的软件开发方法的考察开始吧.如果给你一个任务,要编写一段代码,访问在数据库中存储的形状描述然后显示出来.按照所需要的步骤来思考,是一种很自然的选择.比如,你可能认为应该按照以下步骤解决这个问题. 1.在数据库中找到形状列表. 2.打开形状列表. 3.按某种规则将列表排序. 4.在显示器上显示各个形状. 还可以选取以上任意一个步骤,进一步分解成实现所必需的若干步.例如,可以将

《测试驱动数据库开发》—第2章2.2节面向对象编程语言中的类

2.2 面向对象编程语言中的类 测试驱动数据库开发 为何对象的类来到应用开发世界的时间要远远比数据库的类早呢?首先,与在应用开发世界相比,在数据库世界中能让类成为必要元素的影响力没有那么强大,这一点先暂且不谈.其次,相比创建数据库实例,我们能够更加容易地建立可靠的方法来在应用会话中创建对象. 2.2.1 类的构建很容易:构建新对象即可 在面向对象编程的世界中,类其实仅有两个职责:创建新对象和析构(destroy)被废弃的对象.就本书的目的而言,析构其实并不重要.然而,对象的创建绝对是重要的. 在

《UML面向对象设计基础》—第1章1.10节本章小结

1.10 本章小结 UML面向对象设计基础 因为"面向对象"在英语中就没有绝对优势的定义,因此,针对面向对象定义的特性从来就没有一致的意见.我本人认为以下特性对面向对象是至关重要的:封装.信息/实现隐藏.状态保持.对象标识.消息.类.继承.多态性及一般性. 面向对象的封装产生一个由表示对象状态的属性及其操作组成的软件结构("对象"),用实现的术语讲,就是操作的方法处理保持对象状态的变量.封装确保对对象内部信息的任何修改(或访问)都必须通过对象的操作. 信息/实现隐藏