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

Posted grandmoi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构化方法vs面向对象方法相关的知识,希望对你有一定的参考价值。

结构化方法

  • 什么是结构化方法

  通过网上的查找,我得到了这样的定义:

  结构化分析方法(Structured Method)是强调开发方法的结构合理性以及所开发软件的结构合理性的软件开发方法。

  结构的合理性通过系统内各个组成要素之间的相互联系、相互作用的框架来进行约束。而结构化开发方法的作用就在于提出了一组提高软件结构合理性的准则,如分解与抽象、模块独立性、信息隐蔽等。针对软件生存周期各个不同的阶段,它可以分为结构化分析(SA)、结构化设计(SD)

  • 数据流图(DFD):

  必须先说一下什么是数据流呢(DFD)。它的本质就是一组数据,而数据流的流向则表现了数据的传递与加工,表达了数据的逻辑流向与逻辑变换。

  下面就是一张数据流图:

 

其中:

→:数据流。数据流是数据在系统内传播的路径,因此由一组成分固定的数据组成。如订票单由旅客姓名、年龄、单位、身份证号、日期、目的地等数据项组成。由于数据流是流动中的数据,所以必须有流向,除了与数据存储之间的数据流不用命名外,数据流应该用名词或名词短语命名。

□:数据源或宿(“宿”表示数据的终点)。代表系统之外的实体,可以是人、物或其他软件系统。

○:对数据的加工(处理)。加工是对数据进行处理的单元,它接收一定的数据输入,对其进行处理,并产生输出。

〓:数据存储。表示信息的静态存储,可以代表文件、文件的一部分、数据库的元素等。

  • 结构化分析(SA): 

  先说结构化分析方法,它是一种着眼于数据流,自顶向下,逐层分解,建立系统的处理流程,以数据流图和数据字典为主要工具,建立系统的逻辑模型。

  在做结构化分析的时候,我们需要根据实际情况做出它的数据流图,去除掉非本质因素建立逻辑模型,最后不断完善直到确认符合用户的需求。

  我们的网站系统中就用到了结构化的方法,云用结构化分析,我们的网站就是从前端获取数据后到后端处理完成后再返回前端,这就是一种很明确的数据流,因此针对于这样的功能需求,我们确定使用SSH的框架结构,这样在不同的数据处理阶段,我们都可以有针对性的针对这一阶段的功能需求进行书写,逻辑更加清晰。

  • 结构化设计(SD):

  前一阶段建立好了DFD,这一阶段需要细化数据流图,确定数据流图的类型。之后把数据流图映射到软件的模块结构,分解出高层模块,中下层模块。最后对模块结构进行优化,得到更为合理的软件结构,并且设计模块的接口。

  在SSH的框架中,可以通过Spring来分发请求,这样我们只需要书写ControllerService层来处理数据即可,至于获取数据,我们流出了获取数据的接口,在使用的Mybatis框架中,只要mapping配置文件与接口相对应,就可以完成数据的获取,十分方便,设计过程中框架与接口的结合可以大大减少开发者的工作量。

面向对象方法:

  面向对象方法相信大家就熟悉多了,它是使用现实世界的概念把系统分为不同的对象,通过对象的继承,调用等方式,以一种相对和现实世界解决问题的方法接近的方式解决问题。

  针对于面向对象方法的建模技术,其中最主要的就是类图(UML),这个大二面向对象课程的时候也画过,下面就是节选自我们项目的一个类图:

 

  

  这其中包含了类的调用关系。可见Controller类调用了Service类,而Service类又会调用Dao类,Dao勒种又使用了下面三个实体类,这就是其中一个流程的类的调用关系。

  • 面向对象开发流程:

  首先需要进行面向对象的分析(OOA),这一阶段我们需要确定该模型需要抽象出哪些类,这可以从现实中的划分入手,就以之前写过的电梯系统为例,电梯就是一个单独的类,而其调度功能,运行功能,打印功能又可以分别视为不同的类来划分。

  之后我们需要确定这些类之间的关系,定义类中的属性以及提供的方法,给出约束。比如电梯系统中,电梯是最终被调度的类,他可以有自己的运动方法,所在楼层属性,开关门属性等,但是这些属性均会有其他的功能类来进行修改,其运动方法也会由调度类来进行调度,从而完成对电梯的调度。

  之后就可以进行设计工作(OOD),我们需要根据前面设计的类给出该系统与用户交互的接口,类与类之间交互的接口。在电梯的系统中,这就体现在我们的输入与输出上,可以做一个GUI的界面来规范用户的输入。

  最后需要设计这些类之间的协调关系,并且设计全局资源,最终使用对象完成相应的功能。对于一个多线程的电梯,不同的线程之间是不能有直接的调度关系的,因此,我们就需要来设置一些全局属性来规范多线程电梯的调度,让不同的线程可以访问修改这些全局变量,从而完成线程之间的协调工作。

两者比较:

  两个开发方式都各有所长,个人而言,我更倾向于面向对象的开发方式,而且这种开发方式我也使用较多。那么我就先说一下面向对象的开发方式的优势。

  • 更接近现实中的问题模型。就以一个飞机大战的典型面向对象的小程序为例,我们可以把飞机,子弹,控制机分为三个不同的对象,通过对这三个对象直接的逻辑判断来完成游戏的设计。相较之下,如果我们试图用结构化方法来从数据流图的角度来分析这个程序,会感觉根本无从入手。这就体现出面向对象设计的优势,我们更容易从现实入手设计模型。
  • 代码的冗余度更低。面向对象开发中,我们可以把不同的功能给不同的对象来实现,这样一类的对象就可以在程序中重用同一个功能。相较之下,如果使用结构化的设计,如果我们修改一个功能,那么可能就要针对这个流程中每个与这个功能相关的部分进行修改,这样代码工作量就要比面向对象的设计多很多。
  • 设计灵活度高。在面向对象开发中,我们可以自由设置不同的对象,给对象自由的设置属性,因此面向对象的建模具有更高的灵活性。这样带来的优势就是我们可以更加灵活地解决问题,选取更加简单的方式。举个例子,设计一个游戏有不同的敌人,我们可以用不同的对象表示不同的敌人,也可以把他们视为同样的敌人对象,两者所带给我们的建模效果是不同的。当然,我们一般会使用敌人类作为继承类或者接口,这样就统一了具有相同属性的对象的特征。这是面向对象编程的一大优势。

  当然结构化设计也有其优势所在,而且我认为面向对象的设计方法在结构化设计中也有很多应用。

  • 容易设计可以复用的框架。比如我们现在使用的SSH框架,我认为这就是一个结构化设计的应用,从前端获取数据给Spring进行分发,然后内部进行处理,最后通过hibernate进行数据库的数据操作。然而其实Spring针对javaBean的管理其实也是一种面向对象的管理方式,因此说结构化设计中应用了面向对象的设计也是没问题的。由于流程的确定性,我们就很容易设计出一套框架来完成结构化的设计。而对于面向对象的设计,由于对象的不确定性,就很少有可以直接使用的框架。因此,这时结构化设计的优势。
  • 设计相对规范严谨。在做结构化设计前,我们需要先设计出他的数据流图,通过这一过程,我们可以更加严谨的确定我们的系统的功能需求,避免在开发过程中才发现一些之前没有考虑到的东西。就拿这个网站而言,通过绘制流程图,我们可以确定网站的功能需求,结构化的分层设计就可以使我们在每层添加相应的功能即可。若是面向对象编程,或许还需要考虑对象之间的协作问题等。这也是结构化方法的优势之一。
  • 更适合于做系统的开发。就比如我们现在做的书评影评网站,其实就是一种结构化的设计,而且使用了SSH的框架。对于系统的开发一般具有流程的确定性,因此我们可以找到很多可用的优质框架,这就大大减少了开发者的工作量,而且我们也可以做到不同的流程中相互独立,这样如果要修改某一功能,也就只需要针对于这一功能所在的流程进行修改即可,这也还比较方便。

 

  我认为面向对象的开发方法与结构化的设计师相辅相成的,在软件工程中,我们更经常使用结构化的设计,但是结构化方法其实也会运用面向对象的设计方法,因此做到两者优势互补,可以大大加强开发者的工作效率。

参考文献:

基于框架技术的软件结构化设计的研究与应用---中山大学,徐志浩

百度百科-结构化设计

http://baike.baidu.com/link?url=TLhxj5zU4E9h9IwmTfXcQYkxoEo9esMRQUi-sZd9fC5Y8wF2TvtKNU71Ro3Fmld9Z06QZqGtwN9ocRt_iFMpHN1KGeO0ILm8v6o67TfJAwhhWtXrZhHW9Be-e1TqCodZHAFpm1GFDKATQBkmTrQeqa

新浪博客http://blog.sina.com.cn/s/blog_62b8fc3301013rm7.html

 

以上是关于结构化方法vs面向对象方法的主要内容,如果未能解决你的问题,请参考以下文章

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

Golang学习+深入-面向“对象“编程

java 面向对象:类结构 属性

面向过程(结构化)分析方法与面向对象分析方法的区别

结构化方法和面向对象方法之比较

面向过程(或者叫结构化)分析方法与面向对象分析方法到底区别在哪里?