结构化方法与面向对象方法的比较
前言:本篇博客主要为了记录结构化方法和面向对象方法的基本内容和他们之间的比较。同时,在完成了软件工程的三篇文档之后,我对面向对象方法也有了一定了解,因此本文中的一些例子将结合我们文档中的真实案例来进行举例和分析。
目录
1. 结构化方法
2. 面向对象方法
3. 结构化方法与面向对象方法的比较
4. 参考文献
1. 结构化方法
结构化方法出现于20世纪70年代,是一种早期的传统的软件开发方法,它是由结构化分析(SA)、结构化设计(SD)和结构化程序设计(SP)三部分有机组成的。它的基本思想是,基于功能的分解与抽象,形成系统的模块结构,从而针对每个模块进行结构化设计及结构化编程来完成系统的开发,把一个复杂的系统分解成容易求解的各个模块,从而把复杂的问题简单化。
1.1.结构化分析
结构化分析是面向数据流的系统分析方法,进行结构化分析的主要工具有数据流图、数据词典、判定表、判定树、实体关系图等,其中数据流图和实体关系图应用最为广泛,前者是一种分层的建立系统逻辑模型的方法,后者是数据库设计的基础。其中,数据流图有四个基本要素:数据流、实体、数据加工和数据存储。数据流图是一种分层的思想,逐渐地体现系统的逻辑功能。总体思想是:首先确定系统和系统涉及到的外部实体之间的数据流,画出第0层数据流图(也叫顶层图);其次,在第0层图的基础上,对系统的主要功能进行分析,抽象出功能1、2、3…,作为系统的加工,因此第0层的系统加工模块就细化为第1层的1、2、3…加工模块,确定实体和加工之间的数据流,画出第1层数据流图;再次,在第1层图的基础上,对其所有加工进行进一步的分析说明,把1、2、3…加工细化为1.1、1.2、1.3…2.1、2.2、2.3…依此类推,细化到加工不能再细化为止。数据流图越详细,系统的功能就越明确。数据流图的分层结构如图1所示。
图1 数据流图的分层结构
1.2.结构化设计
在结构化分析的基础上,映射分析模型到设计模型,得到系统的模块结构、数据库结构等,其中数据库结构主要从分析阶段的ER模型得到,数据库设计至少要满足第3范式的要求。而系统的模块结构是在数据流图的基础上,进行相应的变换分析和事务分析得到,就是从结构化分析阶段的数据流图映射到系统的模块结构图,在映射过程中此例子只涉及变换分析,没有涉及到事务分析,设计出来的模块要满足高内聚低耦合的要求,即模块要满足独立性要求。
2. 面向对象方法
面向对象程序设计(Object-oriented programming)是种具有对象概念的程序编程范型,同时也是一种程序开发的方法。它可能包含数据、属性、代码与方法。对象则指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关联的数据。在面向对象程序编程里,计算机程序会被设计成彼此相关的对象。
2.1.面向对象方法的特点
2.1.1. 抽象
支持面向对象编程语言通常利用继承其他类达到代码重用和可扩展性的特性。而类有两个主要的概念。
类(Class):定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。
对象:是类的实例。
其中类定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。
2.1.2. 继承
按照子类与父类的关系,把众多的对象类进一步组织成一个层次系统,这样处于下一层的对象可以自动继承位于上一层的对象的属性和方法。继承提供了一种明确表述共性的方法,使得程序员对共同的属性以及方法只说明一次,并且在具体的情况下可以扩展细化这些属性及方法。
2.1.3. 封装
把数据和实现操作的代码集中起来放在对象内部,一个对象好像是一个不透明的黑盒子,表示对象状态的数据(对象的属性)和实现各个操作的代码(对象的方法),都被封装在黑盒子里面,从外面是看不见的,它与外界的联系是通过方法来实现的,方法就是对象的对外接口。同时,外面的对象也不需要关心它的方法都进行了哪些处理,只要知道调用方法需要什么参数,以及方法能够返回什么样的结果就可以了,具体操作和处理细节只有对象自己知道。
2.1.4. 多态
意思是有许多形态。在面向对象方法中,是指在一棵继承树中的类中可以有多个同名但不同方法体以及不同形参的方法,即一个对外接口,多个内在实现形式。
2.2.面向对象方法的组成
和结构化方法类似,面向对象方法也包含三部分:面向对象分析(OOA)、面向对象设计(OOD)和面向对象程序设计(OOP)。对象、类、封装性、继承性、多态性的引入使用,令面向对象方法具有一定的优势,能为生产可重用的软件构件和解决软件的复杂性问题提供一条有效的途径。现在比较流行的面向对象方法是基于统一建模语言UML,通过建立系统的各种模型来分析设计系统。同时,UML支持系统构建,能够进行正向工程和反向工程,即能够将各种UML模型自动映射为源程序代码,也可以从源程序代码映射为各种模型,这体现了一定的灵活性。在面向对象方法中,分析与设计不再有明显的界限,可以把面向对象分析作为面向对象设计的一部分,面向对象方法中系统功能的实现是通过对象的交互来进行的。
2.2.1. 面向对象分析
OOA阶段是通过行为分析法认定对象及它们之间的关系。具体过程如下:
(1)使用用例图从用户角度描述系统功能并指出各功能的操作者。用例是指用户使用系统时所执行的一个与行为相关的事务序列,这个序列是在与系统的会话中完成的。用例之间存在三种关系:角色与用例之间的连接,用例之间的使用和扩展关系,通过角色执行用例,可以识别出不同的用例。比如下图就是我们软件的总用例图。
图2 系统总用例图
(2)根据需求建立系统的静态模型来构造系统的结构。静态模型主要包括类图(Class Diagram) 。下图为我们系统的总类图。
图3 系统类图
(3)根据系统执行时的时序状态或交互关系来描述系统的行为,从而构造其动态模型,包括状态图(Status Diagram)、活动图(Activity Diagram)等。状态图描述对象的所有可能状态以及事件发生时状态的转移条件;活动图描述为满足用例要求所进行的活动以及活动间的约束关系,用于识别并行活动。具体的状态图和活动图的示例如下。
图4 用户状态图
图5 用户活动图
2.2.2. 面向对象设计
OOA和OOD采用一致的概念、原则和表示方法,二者之间不存在鸿沟,不需要从分析文档到设计文档的转换,二者之间也不强调严格的阶段划分。面向对象设计比较经典的是SOLID原则。
表1 SOLID原则
3. 结构化方法与面向对象方法的比较
结构化方法和面向对象方法作为两种经典的软件开发方法,各有优缺点。结构化方法是基于功能的分解和抽象,其建立的模型比较直观、简单、可读性好,有利于客户和开发人员的交流,能够把一个复杂的系统用多个满足独立性要求的小模块来实现,能够有效地提高软件开发质量。然而,由于用户的需求往往容易变更,而且硬件、软件技术等也会不断变化,作为系统基本组成部分的功能模块会很容易受到影响,对于系统进行局部的修改往往会引起系统发生根本性的变化。进一步来说,就是需求稍微有所变更,就要从头开始结构化分析、设计到结构化程序设计,不利于软件的维护,开发周期一般也比较长。面向对象方法主要是基于对象的交互,以数据为中心来描述系统,数据相对于功能而言,具有更强的稳定性,而且可以在模型的基础上直接映射出源代码,容易进行系统维护和系统构件重用,提高软件开发效率,能够比较容易地适应变更。但是这种方法不一定适合所有项目的开发,比如这种方法就不太适合大型信息管理系统的开发,因为在这种系统的开发过程中,若缺乏整体系统模块的设计划分,容易造成系统各模块结构不合理等问题,而且建立的模型相对比较复杂,较难理解。
4. 参考文献
[1].结构化分析 维基百科 https://zh.wikipedia.org/wiki/%E7%BB%93%E6%9E%84%E5%8C%96%E5%88%86%E6%9E%90
[2].结构化方法 百度百科 http://baike.baidu.com/view/551681.htm
[3].SOLID原则 维基百科 https://zh.wikipedia.org/wiki/SOLID_(%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E8%AE%BE%E8%AE%A1)
[4].面向对象程序设计 维基百科 https://zh.wikipedia.org/wiki/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1
[5].张莉, 裘国永. 结构化方法与面向对象方法的比较分析[J]. 陕西师范大学学报 (自然科学版), 2001, 29(2): 29-32.
[6].喻梅. 结构化程序设计方法与面向对象程序设计方法之比较[J]. 科技信息, 2009 (14): 89-90.
[7].汪寒昊, 谢加胜, 邢跃. 软件开发方法——结构化方法与面向对象方法比较[J]. 科技信息, 2011, 13: 052.