本节书摘来自异步社区《UML面向对象设计基础》一书中的第2章2.4节面向对象的益处,作者【美】Meliir Page-Jones,更多章节内容可以访问云栖社区“异步社区”公众号查看。
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支持,减少交付时间等诸多益处。作为经理应始终确立目标,并将面向对象作为一种技术来达到预定的目标。
如果在头脑中没有目标,那么面向对象的所有事物开销(金融、组织、社会及感情)似乎都是昂贵的代价。然而,如果不仅知道做什么,而且知道为什么这样做,你就能实现你所追求的面向对象目标。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。