结构化方法的提出已经是20世纪60年代的事情了。而80年代后,面向对象方法因其克服传统的结构化方法在建立问题系统模型和求解时存在的缺陷,而变得越来越受重视。
其实,结构化方法中提高软件的结构化、模块化及可读性等基本思想是完全正确的,但问题空间和解空间在结构上存在着不一致性,使大型信息系统的开发和设计面临许多困难。解决这一难题的关键在于分析、设计、实现一个系统的方法和过程应尽可能接近我们认识系统的方法和过程,即问题空间与解空间在结构上尽可能一致。面向对象方法解决了传统结构化方法中问题空间和解空间在结构上不一致的问题,避免了从分析和设计到软件模块结构间的多次转换过程,使开发软件变得简捷、高效、合理。
我们着重讨论下结构化方法与面向对象方法的内在联系和区别,以及两者的优缺点。
先说两者的联系。
1、二者在分解和抽象原则上是一致的
分解和抽象是软件开发中控制问题复杂性的重要原则。分解即化整分零,将问题剥茧抽丝,层层消化;抽象则是通过分解体现,在逐层分解时,上层是下层的抽象,下层是上层的具体解释和体现,运用抽象可以不用一次考虑太多细节,而逐渐的有计划有层次的了解更多细节。面向对象方法与结构化方法在运用分解和抽象原则上的要求是完全一致的。
2、二者在局部化和重用性设计上是一致的
局部化是软件开发中的一个重要原则,即不希望软件一部分过多地涉及或影响软件的其它部分。在结构化方法中,局部化主要体现在代码与数据的分隔化,即程序各部分除必要的信息交流外,彼此相互隔离而互不影响,而面向对象方法则采用数据、代码的封装,即将数据、代码和操作方法封装成一个类似“黑箱”的整体对象,提高了程序的可靠性和安全性,同时增强了系统的可维护性。也就是说面向对象方法比结构化方法的运用更加深入更彻底。
除了这些一致性,两者之间的区别似乎更多。
1、处理问题的出发点不同
结构化方法是强调过程抽象化和模块化,以过程为中心构造或处理客观世界问题的,它是一种面向过程的开发方法;面向对象方法强调把问题域的要领直接影射到对象及对象之间的接口上,是用符合人们通常的思维方式来处理客观世界的问题。
2、处理问题的基本单位和层次逻辑关系不同
结构化方法把客观世界的问题抽象成计算机可以处理的过程,处理问题的基本单位是能清晰表达过程的模块,用模块的层次结构概括模块或模块间的关系和功能;面向对象方法是用计算机逻辑来模拟客观世界中的物理存在,以对象的集合类作为处理问题的基本单位,尽可能使计算机世界向客观世界靠拢,以使问题的处理更直截了当,面向对象方法是用类的层次结构来体现类之间的继承和发展。
3、数据处理方式与控制程序方式不同
结构化方法是直接通过程序来处理数据,处理完毕后即可显示处理结果,在控制程序方式上是按照设计调用或返回程序不能自由导航,各模块程序之间存在着控制与被控制的关系;面向对象方法将数据与对应的代码封装成一个整体,原则上其它对象不能直接修改其数据,即对象的修改只能由自身的成员函数完成,控制程序方式上是通过“事件驱动”来激活和运行程序。
4、分析设计与编码转换方式不同
结构化方法强调分析、设计及编码之间按规则进行转换,贯穿软件生命周期的分析、设计及编码之间实现的是一种有缝的连接;面向对象方法从分析到设计再到编码则采用一致性的模型表示,贯穿软件生命周期的分析、设计及编码之间是一种平滑过程,即实现的是一种无缝连接。
尽管有着这么多不同,但并不是说谁就有着绝对的优势。结构化方法与面向对象方法是各有优缺点的。我们从五个方面讨论它们各自的优缺点。
1、执行效率
从执行效率来说。结构化方法比面向对象方法产生的可执行代码更直接, 更高。所以对于一些嵌入式的系统, 结构化方法产生的系统更小, 运行效率更高。
2、重用性
从重用性方面来说。采用结构化方法的系统难以修改和扩充。结构化分析与设计清楚定义了系统的接口, 当系统对外界接口发生变动时, 往往造成系统结构较大变动, 难以扩充新的功能接口。采用结构化方法的系统可复用性较差。结构化方法将数据和操作分离, 导致一些可重用的软件构件在特定具体应用环境才能应用, 降低了软件的可重用性。面向对象方法具有很好的重用性。在遇到类似的问题, 通过应用了抽象继承等技术, 来重用代码。
3、编译器
从程序语言编译器来说。面向对象方法, 通过编译器实现代码的面向对象性。也就是说经过编译器后, 代码会被翻译为相对应的结构化代码。所以要熟练开发, 还要懂一定的结构化方法做为基础。
4、掌握难度
从掌握难度来说, 面向对象方法比结构化对象方法复杂,难于理解。面象对象方法的内容广, 概念多, 而且很多都是难于理解, 做到精通更加不易。应用面向对象方法, 常常需要一种支持的分析, 设计方法,如RUP 方法, 敏捷方法等。这些知识抽象枯燥,难于掌握。面象对象方法要经过长期的开发实践才能很好的理解, 掌握。相比之下, 结构化方法知识内容少, 容易上手。
5、应用范围
从应用的范围看, 结构化方法适用于数据少而操作多的问题。实践证明对于像操作系统这样的以功能为主的系统, 结构化方法比较适应它。面向对象方法正好相反, 对于数据库, 信息管理等以数据为主的而操作较少的系统, 用面向对象方法描述要好于结构化方法。
软件开发的目标是以最小的代价开发出满足用户需求的软件。为此,根据系统的实际需求,分别针对具体情况选择采用不同的设计方法,可以充分发挥面向对象与结构化方法各自的优势。在开发实践中, 从实际出发, 考虑执行效率、开发者的技术水平、系统规模、是否为易需求变化的系统等因素, 尽量利用它们各自的优点, 避免他们的缺点。根据实际出发, 选取合适的软件开发方法, 达到最佳的开发效益。