首页 > 代码库 > 结构化方法与面向对象方法之应用比较

结构化方法与面向对象方法之应用比较

使用过C语言和Java 的朋友们都知道,这两种语言在编写程序中有着很大的不同。这种不同不仅是语法上面的不同,更是考虑问题角度上的不同。C语言强调解决问题的过程,Java强调描述问题中的对象的属性,二者各有优劣。编写小程序的时候,我们需要根据自己的需求来选择适当的开发方式,编写软件的时候更是如此。在软件开发的过程中,面对不同的项目规模以及用户需求,我们需要合理地选择自己的开发方式。那么这两种方法究竟有什么不同,又各有什么优点和缺点呢?如下是我们对于二者的比较。

什么是结构化方法

结构化方法概述

首先我们需要了解什么是结构化方法。结构化方法,也就是我们平时所说的面向对象方法。其本质是通过不断把复杂的处理逐层分解来简化问题,他从内部功能上模拟客观世界,面向过程设计空间的解域,强调自顶向下,逐步求精、模块化设计。使用结构化方法开发的软件运行效率较高,且能够增加软件系统的可靠性。

结构化方法的建模步骤

结构化分析(SA)通常有如下步骤:

  1. 分析当前的情况,构建当前问题的DFD;
  2. 推导出等价的逻辑模型的DFD;
  3. 设计新的逻辑系统,生成数据字典和基元描述;
  4. 建立整体结构,确定目标物理系统模型的DFD。

在以上分析完成之后,我们还需要进行更加细致地结构化设计(SD),基本步骤如下:

  1. 评审和细化数据流图;
  2. 确定数据流图的类型;
  3. 把数据流图映射到软件模块结构,设计出上层结构;
  4. 基于数据流图逐步分解高层模块;
  5. 对模块结构进行忧伤啊,得到更为合理的软件结构;
  6. 描述模块接口。

接下来我将对以上步骤中的几个重要概念进行说明,首先需要解释的是DFD。我们在使用结构化方法进行编程之前,首先需要进行需求的分析,理清各个功能点之间的关系。结构化方法也可以说是一种面向数据流的方法,当我们需要描述程序中数据的变化时就需要使用数据流图,也就是DFD(Data Flow Diagram)。

数据流图是结构化分析方法中使用的工具,它反映了系统必须完成的逻辑功能,是一种功能模型。数据流图有两种比较典型的结构,一种是变换型结构,他描述的工作可以表示为输入、朱处理和输出,呈线性状态。另一种是事务型结构,这种数据流图呈束状,即一束数据流平行流入后流出,可能同时又几个事物要求处理。下图列举了两种比较典型的数据流图,前者是变换型结构的数据流图,右边是事务型结构的数据流图,可以看出两种类型还是有很大区别的:

技术分享

图一 变换型结构的数据流图

技术分享

图二 事务型结构的数据流图

 

在完成了整体大致的数据流图绘制之后,我们就需要将需求逐步细分,逐层实现,至此就完成全部设计的步骤,之后只需要实现具体的功能即可。这里借用一张比较经典的图来说明该过程,注意图中很好地体现了自顶向下设计的思想。

 技术分享

图三 自顶向下分析,逐步求精

结构化方法的优点与局限

首先结构化方法的优点很明显,由于结构化方法是面向过程的,这与我们人解决问题的思路相一致,开发比较轻量方便。当需要编写的软件体量较大时,我们可以采用自顶向下分析法,将复杂的系统逐步分解为一个个独立的子功能并逐一实现。这种模块化,逐步求精的方式一方面提高了我们软件的开发效率,另一方面也增强了代码的重用性。此外,数据流图本身也是一种良好的描述软件执行过程的工具,这有利于开发人员与用户的交流,有利于需求的实现。

以上都是结构化开发方法的优点,而其优点其实也像优点一样明显。由于结构化方法在需求分析中对问题域的认识和描述不是问题中的对象为基本单位的,当我们需要设计比较复杂的系统时,我们很难去验证我们所做的设计是否正确。例如,当我们所需要描述的对象的结构发生了变化时,我们并不能第一时间定位所有需要修改的地方,而是只能通过数据流注意寻找需要修改修改的函数或模块。这就给我们程序的修改和扩展增加了麻烦。另一方面,由于我们程序主要描述的是解决问题的过程,对程序所涉及的关键对象的描述可能就不会很完整,这样的程序很难与说明文档建立直接的对应,也会为程序的正确性和完整性埋下隐患。

什么是面向对象方法

面向对象方法概述

面向对象方法考虑问题的角度与结构化方法有所不同,它使用现实世界的概念抽象地思考问题,从而自然地解决问题,强调模拟现实世界中的概念强调过程或算法,支持代码的重用。

面向对象方法的建模步骤

面向对象方法的分析过程(OOA),主要包括以下几步:

  1. 确定问题域;
  2. 区分类和对象;
  3. 区分整体对象以及组成部分,确定类的关系以及结构;
  4. 定义属性和服务;
  5. 确定附加的系统约束;

和结构化编程一样,在完成简单的分析之后,我们还需要进行更加精细的设计过程,具体分为如下过程:

  1. 改进和完善系统分析的结果;
  2. 设计交互过程和用户结构;
  3. 设计任务管理,以及子系统以及任务之间的协调方式;
  4. 设计全局资源,确定任务或子系统的资源分配;
  5. 对象设计。

这里来谈谈我们在进行面向对象分析中需要用到的工具。通常我们需要绘制UML图来分析设计整个软件系统,UML的组成如下图所示:

技术分享

通常我们在结束对对象的设计之后就可以通过具体的代码来实现对象了。通常面向对象的代码可以和文档中的设计结合的比较紧密,对象可以通过封装来屏蔽外界对于对象内部的操作,并留出外部操作的接口,这些都是面向对象方法设计程序所独有的优势。

面向对象方法的优点与局限

上过OO课的同学们应该都知道面向对象编程的三个特点:封装、继承、多态。这三点在本文中不做赘述,但是我们需要肯定的是,面向对象是一种用来解决复杂软件设计问题的一种重要方法。它通过结构组成问题中的对象来分析问题,而对象本身往往是客观世界中的直接映像,这也符合人们认识世界的方式。我们在进行面向对象的软件开发的时候,核心就是对“对象”本身进行开发,从开始的分析、设计阶段开始,一步步完善其中的属性、方法,最终通过对象之间的不同活动来将整个程序串联起来。此外,使用面向对象开发方法着重描述了问题域中客观存在的事物,因此代码的复用性一般会十分优秀,这样可以减少开发的工程量。另一方面,封装和继承的存在可以避免把所有的代码都暴露在用户面前,进一步提升了软件的安全性和可靠性。对象的存在使得程序可以较容易地进行系统维护,更好地适应需求的变更,有利于构建大型的工程。

面向对象方法的不足也很明显。首先,如何建立对象并不像描述过程一样统一,解决同一个问题,不同的人可能会将不同的事物确定为一个对象。即便最终确定下来,在考虑对象行为的时候不同的人可能也会有不同的设计,这样很难保证软件描述的正确性。此外,面向对象方法主张的是描述问题所设计的对象的属性和方法,通过对象的行为来串联起整个问题的结构。

结束语

在进行软件开发之前,合理地选择开发的模式尤为重要。结构化方法和面向对象方法各有优劣,并非完全对立,需要根据实际的情况加以选择。通过结构化方法构建小型项目结构简单,逻辑清晰,但是当软件的体量增大时可能会变得难以维护;面向对象方法有利于处理复杂的系统关系,但是需要留心是否存在过度封装或者设计错误等问题。软件开发没有银弹,只有就事论事,因地制宜,才能获得最好的开发效果。

结构化方法与面向对象方法之应用比较