结构化方法VS面向对象方法

Ⅰ.结构化方法

1.定义与介绍

  结构化方法的基本要点是:自顶向下、逐步求精、模块化设计、结构化编码。
  结构化分析方法是以自顶向下,逐步求精为基点,以一系列经过实践的考验被认为是正确的原理和技术为支撑,以数据流图,数据字典,结构化语言,判定表,判定树等图形表达为主要手段,强调开发方法的结构合理性和系统的结构合理性的软件分析方法。
  结构化设计方法是以自顶向下,逐步求精,模块化为基点,以模块化,抽象,逐层分解求精,信息隐蔽化局部化和保持模块独立为准则的设计软件的数据架构和模块架构的方法学。
  结构化方法按软件生命周期划分,有结构化分析(SA),结构化设计(SD),结构化实现(SP)。 其中要强调的是,结构化方法学是一个思想准则的体系,虽然有明确的阶段和步骤,但是也集成了很多原则性的东西,所以学会结构化方法,不是能够单从理论知识上去了解就足够的,要的更多的还是实践中慢慢的理解个个准则,慢慢将其变成自己的方法学。

2.分析与设计

2.1分析步骤

  ①分析当前的情况,做出反映当前物理模型的DFD;
  ②推导出等价的逻辑模型的DFD;
  ③设计新的逻辑系统,生成数据字典和基元描述;
  ④建立人机接口,提出可供选择的目标系统物理模型的DFD;
  ⑤确定各种方案的成本和风险等级,据此对各种方案进行分析;
  ⑥选择一种方案;
  ⑦建立完整的需求规约。

2.2设计步骤

  结构化设计方法给出一组帮助设计人员在模块层次上区分设计质量的原理与技术。它通常与结构化分析方法衔接起来使用,以数据流图为基础得到软件的模块结构。SD方法尤其适用于变换型结构和事务型结构的目标系统。在设计过程中,它从整个程序的结构出发,利用模块结构图表述程序模块之间的关系。结构化设计的步骤如下:
  ①评审和细化数据流图;
  ②确定数据流图的类型;
  ③把数据流图映射到软件模块结构,设计出模块结构的上层;
  ④基于数据流图逐步分解高层模块,设计中下层模块;
  ⑤对模块结构进行优化,得到更为合理的软件结构;
  ⑥描述模块接口。

 

2.3设计原则

  结构化设计方法的设计原则:
  ①使每个模块尽量只执行一个功能(坚持功能性内聚);
  ②每个模块用过程语句(或函数方式等)调用其他模块;
  ③模块间传送的参数作数据用;
  ④模块间共用的信息(如参数等)尽量少。

3.更多细节

  “结构化”三个字,描述的不仅仅是软件的结构,也形象地阐述了这种软件工程设计方法中的设计思想。如下图所示:

P1.结构化方法分层与分模块示例图

  在结构化的程序设计中,非常重要的一环就是DFD(数据流图)的绘制。只有正确设计数据流图,才能让结构化的程序运算与执行后达到正确的结果它的本质就是一组数据,而数据流的流向则表现了数据的传递与加工,表达了数据的逻辑流向与逻辑变换。分别以招生管理系统和医院管理系统为例,其数据流图如下:

P2.招生管理系统数据流图

 

 

P3.医院管理系统数据流图

Ⅱ.面向对象方法

1.定义与介绍

  面向对象的方法则不是将程序按照功能的不同分解开来,而是按照不同的对象来进行分解。

  在面向对象的思想里,客观世界中的事物都是对象,对象之间存在一定的关系,并且复杂对象由简单对象构成,而具有相同属性和操作的对象属于一个类,对象是类的一个实例。另外,类与类之间可以有层次结构,即类可以有子类,其中,子类继承父类的全部属性和操作,而且子类有自己的属性和操作。就比如说,动物是一个大类,鸟是动物的一种,把鸟分成一个类的话,那么鸟类就是动物类的子类,而在鸟类中有麻雀,有鹦鹉,这些都是鸟类这个笼统的类的一些实例,他们就是鸟类这个类中的对象。其实从上面的这些示例中就可以看出,在面向对象的思想中,强调充分运用人在日常逻辑思维中经常采用的思想方法与原则,因此,面向对象方法与人的日常思维方法十分的相似,这使得用户与编程者、测试人员都能很容易地理解整个程序的架构和运作方式。

  关于详细的定义,反而与形象的理解相比略显晦涩。百毒百科上给出了如下定义:

面向对象(Object Oriented,OO)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。

2.特点

2.1抽象

  支持面向对象编程语言通常利用继承其他类达到代码重用和可扩展性的特性。而类有两个主要的概念。

  类(Class):定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。

  对象:是类的实例。

  其中类定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。

P4.类与对象

2.2继承

  按照子类与父类的关系,把众多的对象类进一步组织成一个层次系统,这样处于下一层的对象可以自动继承位于上一层的对象的属性和方法。继承提供了一种明确表述共性的方法,使得程序员对共同的属性以及方法只说明一次,并且在具体的情况下可以扩展细化这些属性及方法。

 

P5.类的继承

2.3封装

  意思是有许多形态。在面向对象方法中,是指在一棵继承树中的类中可以有多个同名但不同方法体以及不同形参的方法,即一个对外接口,多个内在实现形式。

2.4多态

  意思是有许多形态。在面向对象方法中,是指在一棵继承树中的类中可以有多个同名但不同方法体以及不同形参的方法,即一个对外接口,多个内在实现形式。

3.分析与设计

3.1面向对象分析

  面向对象分析是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题。OOA与结构化分析有较大的区别。OOA所强调的是在系统调查资料的基础上,针对OO方法所需要的素材进行的归类分析和整理,而不是对管理业务现状和方法的分析。OOA模型由5个层次(主题层、对象类层、结构层、属性层和服务层)和5个活动(标识对象类、标识结构、定义主题、定义属性和定义服务)组成。在这种方法中定义了两种对象类之间的结构,一种称为分类结构,一种称为组装结构。分类结构就是所谓的一般与特殊的关系。组装结构则反映了对象之间的整体与部分的关系。OOA在定义属性的同时,要识别实例连接。实例连接是一个实例与另一个实例的映射关系。OOA在定义服务的同时要识别消息连接。当一个对象需要向另一对象发送消息时,它们之间就存在消息连接。OOA的原则主要有以下几条:

  ①抽象:从许多事物中舍弃个别的、非本质的特征,抽取共同的、本质性的特征,就叫作抽象。抽象是形成概念的必须手段。抽象原则有两方面的意义:第一,尽管问题域中的事物是很复杂的,但是分析员并不需要了解和描述它们的一切,只需要分析研究其中与系统目标有关的事物及其本质性特征。第二,通过舍弃个体事物在细节上的差异,抽取其共同特征而得到一批事物的抽象概念。

  ②封装:就是把对象的属性和服务结合为一个不可分的系统单位,并尽可能隐蔽对象的内部细节。

  ③继承:特殊类的对象拥有的其一般类的全部属性与服务,称作特殊类对一般类的继承。

3.2面向对象设计

  面向对象设计(Object-Oriented Design,OOD)方法是OO方法中一个中间过渡环节。其主要作用是对OOA分析的结果作进一步的规范化整理,以便能够被OOP直接接受。它是一种软件设计方法,是一种工程化规范。OOD的目标是管理程序内部各部分的相互依赖。为了达到这个目标,OOD要求将程序分成块,每个块的规模应该小到可以管理的程度,然后分别将各个块隐藏在接口(interface)的后面,让它们只通过接口相互交流。其主要包括以下几项工作:

  ①决定你要的类;

  ②给每个类提供完整的一组操作;

  ③明确地使用继承来表现共同点。

Ⅲ.结构化与面向对象的对比

  首先,我们需要明白的一点是,事物还能拿在一起比较,就一定是各有所长,但同时也各有缺陷。虽然面向对象近些年发展迅速,成为软件开发与设计的后起之秀,但我们也不能过度迷信,认为面向对象的方法就一定很好。通过上面的分析,我们可以大致得到下面的一些论述:

  结构化方法对于一些执行顺序明显、规模较小的问题非常适用,只需要将问题模块化,分块执行的结果就一定是最终的结果;面向对象的方法在设计层面要求较高,需要程序员和软件开发团队有较强的对象抽象能力,能够将现实中的事物抽象为对象。然而,一旦设计完毕,后续的实现便非常简单。因为在设计、测试的各个阶段都可以运用面向对象技术,不会出现“牵一发而动全身”的尴尬,使得整个程序的调试、测试可以建立在某个基线之上。同时,团队的配合也变得非常简单和容易,编程人员只要统一接口,便可完成完全分离的分工。这对于团队协作来说非常重要。

  关于数据方面,面向结构的设计方法中,数据与操作以松散的方式联系在一起,数据往往能够被多个操作访问,它可能在开发人员不知道的情况下被修改,从而导致难于调试的运行错误。此种情况会增大程序理解的复杂度,以及验证程序正确性的成本;而与此相对,面向对象方法,通过使用对象,将数据与操作紧密结合到了一起,每个对象通过数据隐藏,自主管理其状态(即数据),这使得验证程序的正确性成为了可能,同时由于数据处理的局部化,对于程序的理解也更加简单。尤其地,在面向对象方法中,不能被外部擅自修改的关键数据可以设计成protected或private类型,避免了由于数据的操作不当引起的整个软件的bug。

  通过所有以上的分析,我认为结构化的着力点是功能,以功能切割为各自模块进行实现的方式,它是直接面对解决需求问题而来。它将功能分割成小块,使各自的区域隔离解耦,也就是分模块。然后根据设计流程再将这些模块拼接起来,就可以形成一个比较完善功能的程序项目。面向对象,它的基石当然就是对象了。通过分析项目需求搭建对象模型,分析对象的功能及关系。面向对象也是要模块化的,这一点和结构化的模块相近但不同。结构化中模块是基础是自然产物,面向对象中模块化是设计思考的方式。看清楚两者的根本,再去看它们的那些xx设计xx说明xx思想,就不至于混乱了。两者并非对立或者分歧,都是发展历程上的丰碑。优点的话 对象有很多,应该都常识了,问题就是 很容易过度抽象过度设计过度分离过度xx。结构化的话,优点是直接,围绕着解决问题实现功能为目的,至于缺点那就 是面向对象的优点取反。引用论文里的一段话,大致如下:

  程序设计方法的发展经历了 4 代,结构化和面向对象是软件工程的程序设计方法中最本质的思想方法,结构化体现了抽象思维和复杂问题求解的基本原则,面向对象则深刻反映了客观世界由对象组成这一本质特点。各种程序设计方法的一个重要区别在于问题分解的出发点不同(因子),思维模式不同。计算机中数据结构和过程是密切相关的,结构化方法将数据结构和过程分开考虑,面向对象的方法组合数据和过程于对象之中。理论上,对象式实际方法将产生更好的模块内聚和耦合特性,使得软件更易于重用与维护,但在实践中程序设计方法需要工具和环境的支撑,需要考虑软件生命周期的各个环节,在选择程序设计方法时,需要综合考虑这些因素。

 

 

 

 

 

posted @ 2016-12-13 15:14  14231027赵岳  阅读(434)  评论(0编辑  收藏  举报