电脑应用技术 二零零六总第六十七期
从结构化到面向对象程序设计的模型转换∗
袁胜忠
山东大学威海分校现代教育技术部 威海264209
摘 要:随着软件系统内在复杂性的不断提高,面向对象技术已经取代结构化设计技术成
为产业化软件开发的主流技术。本文剖析对象模型与结构化设计瀑布模型队程序设计风格
的影响,探讨导致面向对象软件工程失败的主要原因,论证了成功实施面向对象软件工程
的关键技术,帮助软件工程师完成从结构化设计实践向面向对象分析和设计实践的进化。
关键词:对象模型 瀑布模型 迭代和增量式开发 面向对象软件工程
Model Changing From Structured Design Style to
Object-Oriented Programming
YUAN Shengzhong
Department of Modern Education Technology of Shandong University at Weihai, Weihai,
264209
Abstract: In the past several years, with enhance of inherent complex of various systems, the
object-oriented technology have actually become the main stream of industrial software
development. Compared with traditional structured design style and the waterfall model, in this
paper, we strength the correct understand to object model and discuss the main reasons for the
failure of object-oriented development in order to promote the software engineers evolution from
structured design to object-oriented analysis and design.
Keywords: object model; waterfall model; iterative and incremental development;
object-oriented software engineering
1 引 言
面向对象的技术可以分为:面向对象的程序设计语言,面向对象的数据库技术,面向
对象的分析和设计方法。
对应用软件开发组而言,面向对象的分析和设计方法是一种新的方法,它比面向对象
的程序设计语言和面向对象的数据库技术更加难以掌握。因为它与开发组熟悉的结构化设
计方法是两种完全不同的设计风格,在建立系统时,结构化设计方法利用算法作为基本构
件,而面向对象方法利用类和对象作为基本构件。二者要求开发组用不同的思考方法对待
问题的分解,而且面向对象设计方法创造出来的软件体系结构大大超出了
1 ∗作者简介:袁胜忠:男,1965年出生,软件工程师,主要研究方向为应用软件开发,网络管理与优化。 电脑应用技术 二零零六总第六十七期
结构化设计文化的领域。
在应用软件开发中,面向对象方法至今没有得到应有的使用。正如Rentsch曾经准确地
预料到的[1],“我猜想面向对象的编程将出现在20世纪的80年代,就像结构化编程出现在
20世纪的70年代一样。每一个人都会喜欢上它。每个制造商都会改进自己的产品以支持
它。每个管理者都会在口头上承诺它。每个编程人员都会(以不同方式)实践它。但是没
有一个人会知道它是什么”。遗憾的是,在我们的开发过程中,Rentsch的预测至今仍然是
正确的。
现在多数程序员都仅在结构化设计原则方面受过正规或非正规的训练,并利用这些结
构化设计技术开发和实施了无数有用的软件系统。他们即使认识到只使用算法分解可以应
对的复杂性是有限的,必须转向面向对象的分解;他们即使想早日使用面向对象的技术,
反复学习了C++或JAVA,但是,他们发现面向对象技术很难应用,面对问题领域的时候,
设计一开始就不自觉地转换到结构化程序设计上了。这一切都是因为他们还没有真正掌握
面向对象的分析与设计方法,没有深刻认识面向对象的分析和设计方法与结构化设计方法
的根本区别。没有正确的方法指导,只学习面向对象的程序设计语言是远不足以成功实施
面向对象应用软件开发的。如果把C++和JAVA这样的语言作为传统的面向算法的语言来
使用,就不仅不能利用它们所赋予的功能,而且结果比使用更早的语言如C或PASCAL
还差。如果给一个根本不懂电的木匠一把电钻,他有可能把电钻当成锤子来用并在砸弯无
数个钉子后认为电钻不如锤子好用。
本文在第二部分分析如何全面理解面向对象分析的模型,在分析的开始阶段,模型提
供了一种组织大量信息的机制,这些信息起初使分析者无从下手。此外,模型的规范化和
系统化会暴露出系统种的不一致性和缺陷,从而指导后续的开发工作,所以,模型对于正
确掌握面向对象的方法是很重要的。在第三部分,作者结合自己的实践经验总结了导致面
向对象开发失败的主要原因,用反证法论述了成功实施面向对象软件开发的关键概念和技
术,希望帮助那些熟悉结构化设计方法的同行避开这些陷阱,顺利进化到面向对象的分析
与设计开发。第四部分是结论,阐述了什么情况下应该采用面向对象技术。
论述中经常用到的概念有[2]:
(1) 面向对象分析(object-oriented analysis,有时称作OOA)。OOA是一种分析方法,
它以可在问题域的词汇表中找到的类和对象的观点来审视需求,强调利用面向对象的观点
建立真实世界的模型。
(2) 面向对象设计(object-oriented design,有时称作OOD)。OOD是一种设计方法,
它包含面向对象分解的过程,以及一种表示方法,用来描写设计中的系统的逻辑模型与物
理模型和静态模型与动态模型。正是对面向对象分解的支持使得OOD与结构化设计大不
一样:OOD使用类和对象抽象在逻辑上构建系统,而结构化设计使用的却是算法抽象。
上述两个概念的关系是:OOA的结果可以作为OOD开始的模型,接着利用面向对象
编程实现。OOD的结果可以作为完整实现一个系统的蓝图。
(3) 面向对象的开发(object-oriented development)。面向对象的开发是一个迭代和增
量式的开发过程。其宏观过程为[2]:
·建立核心需求(概念化)
·开发要求的行为的模式(分析)
·创立体系结构(设计)
·演化实现(演化)
·管理后续的演化(维护)
微观过程为[2]:
·识别一个给定的抽象层次上的类和对象
2 电脑应用技术 二零零六总第六十七期
·识别类和对象的语义
·识别类和对象之间的关系
·规定这些类和对象之间的接口,然后说明这些类和对象的实现。
2 深刻理解面向对象分析的模型
面向对象的分析,其目的在于有效地描述与刻画问题领域的信息和行为。实现这样一
种描述,必须以一种全局的观点来考虑系统中的各种联系,系统的完整性和一致性。同时,
这种描述能够说明系统中各种操作的细节。
为达到面向对象分析的目的,面向对象的分析提供了有足够表达力的模型:逻辑模型
(类结构、对象结构)和物理模型(模块体系结构、进程体系结构)。对于一个给定的项
目,分析和设计的结果都是通过这些模型表示出来。
其中,类结构的静态语义用类图表示、动态语义用状态转换图表示;对象结构的静态
语义用对象图表示、动态语义用交互图表示;模块体系结构的静态语义用模块图表示、动
态语义用子系统图表示;进程体系结构用进程图表示。
由此可见。面向对象开发的表示法包括四个基本图:类图、对象图、模块图和进程图,
以及两个补充图:状态转换图和交互图。
·类图用来显示类和它们的关系在系统的逻辑设计中的存在。类图代表系统的类结构
视图。
·对象图用来显示在系统的逻辑设计中存在的对象和它们的关系。对象图通常用来表
示场景。
·模块图用来显示在系统物理设计中分配给模块的类和对象。模块图代表系统的模块
体系结构的视图。
·进程图用来显示在系统物理设计中分配给处理器的进程。进程图代表系统的进程体
系结构的视图。
·状态转换图用来显示给定类的实例的状态空间,引起由一个状态向另一个状态转换
的事件,以及由状态变化引起的动作。
·交互图用来跟踪与对象图同一个语境中的场景的执行。
在应用软件开发过程中,设计行为不是一种画图的行为,图只是被用来描绘一个设计。
面向对象方法从以上多个视图来观察设计是很重要的。在面向对象的分析方法中,建立数
据流图的作用,不如其它面向功能的方法明显。因为数据流图中并没有添加任何新的信息[5],但是,建立动态模型可以使系统分析者对系统设计进行精化,把相同或相似的处理操
作进行调整,使系统结构更加完善。
注意,面向对象的系统分析提供了一种独特的方法,它反映了软件问题的本质所在。
软件问题的本质在于数据处理,数据和处理是两件显然的事情,是我们进行软件设计要做
的最基本的工作,在分析数据和信息的过程中分析其处理过程是我们本来应该这样做的。
将数据和处理人为地分离,可能会人为地制造系统分析的障碍。面向对象的分析是一种以
数据或信息为主线,数据和处理紧密结合的方法,这种方法是以建立对象模型为基础的。
3 导致面向对象开发失败的主要原因
3.1 原因之一 ——在面向对象开发过程之上叠加瀑布型思维
如果您的开发过程基本遵循(1)企图定义和稳定绝大部分的需求,然后签署开发协
议;(2)基于需求,进行详细设计;(3)基于设计进行实现;(4)进行集成、系统测试和
部署。这是一个线性的、串行的瀑布型生命周期的典型例子,而且是一个最优先的导致面
3