结构化方法和面向对象方法是计算机软件设计中最常用的两种方法。结构化方法在一定程度上解决了软件的可靠性、可维护性和可理解性等问题,而20世纪80年代中期以后,面向对象方法开始风靡全球,被广泛应用于计算机软件的各个领域,如计算机仿真、系统设计、图形处理和人工智能程序设计等各个方面,进而深入到计算机硬件设计及其它工程设计领域,显示出其强大的生命力。从结构化方法到面向对象方法,表面上看是软件开发工具在城头变换大王旗,实质上反映了一种深刻的认识论的变革和一种技术发展的模式的演化。
今天我们就来讨论下什么是结构化方法,什么是面向对象方法,以及它们之间的联系与区别。
结构化方法(Structured Methodology)是计算学科的一种典型的系统开发方法。它采用了系统科学的思想方法,从层次的角度,自顶向下地分析和设计系统。结构化方法包括结构化分析(Structured Analysis,简称SA)、结构化设计(Structured Design,简称SD)和结构化程序设计(Structured Program Design,简称SP)三部分内容。其中,SA和SD主要属于学科抽象的内容,SP则主要属于学科设计方面的内容。[1]
面向对象(Object Oriented,简称OO)方法是以面向对象思想为指导进行系统开发的一类方法的总称。这类方法以对象为中心,以类和继承为构造机制来抽象现实世界,并构建相应的软件系统。[1]
结构化方法学和面向对象方法学有诸多的异曲同工之处,都很好地促进了软件工程的发展,同时,他们在许多方面也是不同的。
结构化方法与面向对象方法的内在联系[2]
1. 二者在分解和抽象原则上一致
分解和抽象是软件开发中控制问题复杂性的重要原则。分解即化整分零,将问题剥茧抽丝,层层消化;抽象则是通过分解体现,在逐层分解时,上层是下层的抽象,下层是上层的具体解释和体现,运用抽象可以不用一次考虑太多细节,而逐渐的有计划有层次的了解更多细节。面向对象方法与结构化方法在运用分解和抽象原则上的要求是完全一致的。
2. 局部化和重用性设计上的一致
局部化是软件开发中的一个重要原则,即不希望软件一部分过多地涉及或影响软件的其它部分。在结构化方法中,局部化主要体现在代码与数据的分隔化,即程序各部分除必要的信息交流外,彼此相互隔离而互不影响,而面向对象方法则采用数据、代码的封装,即将数据、代码和操作方法封装成一个类似“黑箱”的整体对象,提高了程序的可靠性和安全性,同时增强了系统的可维护性。也就是说面向对象方法比结构化方法的运用更加深入更彻底。
结构化方法与面向对象方法的区别
我们首先通过下面这张表格从基本思想、逻辑工具、运行效率等方面来总体了解结构化方法和面向对象方法的不同之处。
|
项目 |
结构化设计 |
面向对象设计 |
|
基本思想 |
自顶向下设计过程库,逐步求精,分而治之 |
自底向上设计库类 |
|
概念或术语名词 |
过程、函数、数据等 |
对象、类、消息、继承等 |
|
编程的语言 |
C、BASIC、FORTRAN 等 |
C++、VB、JAVA等 |
|
逻辑工具 |
数据流图、系统结构图、数据字典状态转移图、实体关系图 |
对象模型图、数据字典动态模型图、功能模型图 |
|
处理问题的出发点 |
面向过程 |
面向问题 |
|
控制程序方式 |
通过设计调用或返回程序 |
通过“事件驱动”来激活和运行程序 |
|
可扩展性 |
功能变化会危及整个系统,扩展性差 |
只需修改或增加操作,而基本对象结构不变,扩展性好 |
|
重用性 |
不好 |
好 |
|
层次结构的逻辑关系 |
用模块的层次结构概括模块和模块之间的关系和功能 |
用类的层次结构来体现类之间的继承和发展 |
|
分析、设计、编码的转换方式 |
按规则转换,有缝连接 |
平滑过程,无缝连接 |
|
运行效率 |
相对高 |
相对低 |
表1 结构化方法与面向对象方法的区别[2]
1. 基本概念的区别[3]
结构化方法学里最常用的概念是系统流程图,数据流程图,模块等。系统流程图是描绘物理系统的传统工具,表达的是信息在系统各部件(程序、文件、数据库、表格和人工过程等)之间流动的情况。数据流图是描绘逻辑系统的工具,图中没有任何物理的元素,只是描绘信息在系统中流动和处理的情况。模块是组成结构化软件的基本单位,能够完成一项独立的功能。
面向对象方法学里最常用的概念是对象、类、封装、继承、消息、方法。对象是具有特殊属性(数据)和行为方式(方法)的集合体。数据是对象的静态特征,而方法是对象的动态特性。类是具有相同或类似属性和方法的对象的集合体。一个类的上层可以有超类,下层可以有子类,形成一种层次结构。继承性是自动地共享类、子类和对象中的方法和数据的机制。封装机制,它是一种信息隐藏技术,用户只能看到对象封装界面上的信息,对象内部对用户是隐藏的。封装的目的在于将对象的使用者和对象的设计者分开,使用者不必知道行为实现的细节,只需使用设计者提供的消息来访问对象。消息是对象与对象之间进行通讯的工具,发送消息的对象称为发送者,接收消息的对象称为接收者。消息告诉对象要求做什么,而不管采用何种方式做。方法是对象的动态特征,它能够响应对象发送过来的消息,采用何种方式实现其功能,以及如何改变对象的属性。
2. 程序设计方法的区别
结构化程序设计方法着重于过程,“程序设计 = 算法 + 数据结构”是其基本指导思想。在结构化程序设计中其有严格的理论基础,结构化方法学的创始人Dijkstra在1972 年讨论了三种支持结构化程序设计的数学推理方法:枚举、推理和抽象。而在面向对象程序设计中以对象为中心,“程序设计 = 对象 + 类 + 继承”是面向对象程序设计的基本原则。面向对象方法的基本概念如类、对象、继承等虽说在一定程度上有了形式化描述,但总的讲来其缺乏一种统一严格的数学理论基础。
3. 软件开发过程的区别[3]
软件开发的过程就是利用计算机语言将人们关心的现实世界的问题映射到计算机世界的过程。可以这样描述:现实世界——建立模型——编程实现——计算机世界执行求解。
在结构化设计中,程序员分析了问题域之后,得到了一个面向过程的模型,其实现过程可描述为:现实世界——流程图——面向过程语言——执行求解。结构化方法有三大缺陷:一是没有一个联系各个阶段的统一模型;二是后期的变化和改动困难;三是不支技术重用。
在面向对象方法设计中,其实现过程为:现实世界——类图——面向对象语言——执行求解。面向对象方法软件设计中,对象的概念弥漫着整个从分析、设计到编码的开发过程。对象和它们之间的关系成为各个阶段的共同表达媒介。开发的重心由编码向分析偏移,从以功能为中心转向以数据为中心。开发过程的迭代和无缝性使得重用变得更加自然。
结构化方法与面向对象方法各自的优缺点
1. 从执行效率来说。结构化方法比面向对象方法产生的可执行代码更直接,效率更高。所以对于一些嵌入式的系统,结构化方法产生的系统占用更小,运行效率更高;
2. 从重用性方面来说。采用结构化方法的系统难以修改和扩充。结构化分析与设计清楚定义了系统的接口,当系统对外界接口发生变动时,往往造成系统结构较大变动,难以扩充新的功能接口。采用结构化方法的系统可复用性较差。结构化方法将数据和操作分离,导致一些可重用的软件构件在特定具体应用环境才能应用,降低了软件的可重用性。面向对象方法具有很好的重用性。在遇到类似的问题,通过应用了抽象继承等技术,来重用代码;
3. 从程序语言编译器来说。面向对象方法,通过编译器实现代码的面向对象性。也就是说经过编译器后,代码会被翻译为相对应的结构化代码。所以要熟练开发,还要懂一定的结构化方法做为基础;
4. 从掌握难度来说,面向对象方法比结构化对象方法复杂,难于理解。面象对象方法的内容广,概念多,而且很多都是难于理解,做到精通更加不易。应用面向对象方法,常常需要一种支持的分析,设计方法,如RUP 方法,敏捷方法等。这些知识抽象枯燥,难于掌握。面象对象方法要经过长期的开发实践才能很好的理解,掌握。相比之下,结构化方法知识内容少,容易上手;
5. 从应用的范围看,结构化方法适用于数据少而操作多的问题。实践证明对于像操作系统这样的以功能为主的系统,结构化方法比较适应它。面向对象方法正好相反,对于数据库,信息管理等以数据为主的而操作较少的系统,用面向对象方法描述要好于结构化方法。
不论哪一种设计方法,正确清晰的需求界定都是开发一个成功的软件系统必不可少的前提条件,否则再好的设计方法也无济于事。[4]综上,软件开发的目标是以最小的代价开发出满足用户需求的软件。为此,根据系统的实际需求,分别针对具体情况选择采用不同的设计方法,可以充分发挥面向对象与结构化方法各自的优势。目前在大多数软件系统的分析设计过程中,这两种方法都兼而有之。[2]开发者在开发实践中,要从实际出发,考虑执行效率、开发者的技术水平、系统规模、是否为易需求变化的系统等因素,尽量利用它们各自的优点,避免他们的缺点。如对于开发一些小型嵌入式实时监控系统或同等稳定小系统,可用结构化方法;对于开发入门者,使用结构化方法和面向对象方法相结合;对于大型系统或者需求易变系统,使用面向对象方法。总之,根据实际出发,选取合适的软件开发方法,达到最佳的开发效益。
参考文献
[1] 汪寒昊、谢加胜、邢跃 软件开发方法——结构化方法与面向对象方法比较 科技信息2011年第13期
[2] 喻梅 结构化程序设计方法与面向对象程序设计方法之比较
[3] 赵玉鹏、梁国钊 从结构化方法学走向面向对象方法1003-5680(2004) 05-0048-04
[4] 霍迎旦 软件工程中结构化方法与面向对象方法之比较 内蒙古电大学刊2007年第2期(总第90期)