结构化方法和面向对象方法的比较
翁松秀
北京航空航天大学
摘要:编程之精髓在于编程思想,而不同的编程方法有不同的编程思想。结构化程序设计方法一直以来都是编程人员基本的编程方法,而近年来流行的面向对象方法也备受人们青睐。文章通过介绍编程世界的这两种主要编程方法,结构化方法和面向对象方法的分析、设计和应用。并在最后对两种方法进行比较分析,比较结构化方法和面向对象方法编程思想的异同和两种方法的应用。
关键词:结构化方法;面向对象方法;编程思想;再抽象;再模块化;
0 前言
结构化方法和面向对象方法是当前软件开发最常用的方法。基于“瀑布模型”的软件开发方法中,以软件架构为核心,采用结构化设计和分析方法将软件开发的生命周期划分为制定计划、需求分析、软件设计、程序编写、软件测试和运行维护六个基本阶段。而在通过迭代式和增量式进行开发的敏捷软件开发方法中,主要采用面向对象的设计和分析方法。结构化方法与面向对象方法的使用,与具体的开发环境和开发方法有关,如传统软件工程中更适合用结构化方法,而敏捷软件开发方法中面向对象开发方法更受青睐。
1 结构化方法
结构化编程思想由艾慈格·迪杰斯特拉在1976年在《GOTO陈述有害论》中提出,1975年赖瑞·康斯坦丁和爱德华·尤登提出结构化设计,1978年汤姆·迪马克和爱德华·尤登等在1975年提出结构化分析,后来逐渐被完善,形成现在软件开发方法中主要采用的结构化方法。结构化方法从功能上对系统进行划分,将系统按功能划分成各个模块,将子模块编写成子程序,通过子程序之间的结构和层次之间的耦合来解决复杂的问题。结构化方法按软件周期可划分为结构化分析、结构化设计和结构化实现,这里主要讨论SA和SD。
1.1 结构化分析(Structured Analysis)
结构化分析是通过数据来对需求进行分析,功能模块之间通过数据进行联系,采用的建模技术有:数据流图DFD(Data Flow Diagram)、ERD(Entity Relation Diagram)和数据字典DD(Data Dictionary)等。数据在结构化分析方法中举足轻重,就相当于血管之于人体,系统的各个模块通过数据的传递进行沟通和联系,导致了功能模块的强耦合性,模块之间的耦合性降低了结构化程序的可重用性和可维护性。主要分析步骤如下:
① 分析当前的情况,做出反映当前物理模型的DFD;
② 推导出等价的逻辑模型的DFD;
③ 设计新的逻辑系统,生成数据字典和基元描述;
④ 建立人机接口,提出可供选择的目标系统物理模型的DFD;
1.2 结构化设计(Structured Design)
结构化设计阶段将分析阶段得到的目标系统物理模型的DFD表示的具体信息转化成程序结构的设计描述,过渡成软件结构。在这个过程中采用的建模技术有:系统结构图SSD(System Struct Diagram)。这个过程分两步完成,第一步是从分析得到的结果出发,构造一个设计方案,决定系统功能模块的结构。第二步进行详细设计,确定每个功能模块的内部控制结构和算法,最终产生每个功能模块的程序流程图。具体步骤如下:
① 评审和细化数据流图;
② 确定数据流图的类型;
③ 把数据流图映射到软件模块结构;
④ 基于数据流图逐层分解高层模块,设计中下层模块;
⑤ 对模块的控制结构和算法进行优化;
⑥ 描述模块接口;
1.3 结构化方法的应用
结构化方法对需求变化的适应能力比较弱,功能的改变甚至会牵一发而动全身,但由于结构化分析和设计对系统进行完整的架构和具体功能的分析以及实现的各个阶段严谨的测试,所以结构化程序可靠性高。基于结构化分析、设计和实现中的这些主要优点和缺点,结构化比较适合于像操作系统、实时处理系统等这样以功能为主的系统。比如绝大多数操作系统都是以结构化语言C语言写的。
2 面向对象方法
面向对象OO(Object Oriented)方法把面向对象的思想应用于软件开发,将系统中的数据和相关操作进行分类和封装,抽象成一种新的数据结构——类,并在系统的实现过程中实例化,实例化的对象与客观实体有直接对应关系,通过对象的属性和行为,以及对象之间的关系来解决实际问题。面向对象方法吸收了结构化的基本思想和优点,在数据抽象的基础上添加对操作的抽象,使面向对象程序具有高重用性。面向对象方法其实就是结构化的再抽象和再模块化。
2.1 面向对象分析(Object Oriented Analysis)
面向对象分析阶段通过分析,确定问题空间和解空间中所有对象及其属性,进而确定每个对象的操作,即对事务的处理能力,然后通过对象之间的行为来确定对象之间的关系。具体步骤如下:
① 确定问题域和解空间;
② 区分类和对象;
③ 区分整体对象以及组成部分,确定类的关系以及内部结构;
④ 定义类的数据(属性)和操作(处理事务的行为);
⑤ 确定附加的系统约束
2.2 面向对象设计(Object Oriented Design)
面向对象设计阶段主要对分析阶段的结果进行进一步的规范化整理,以便后面的具体实现。OOA阶段和OOD阶段没有明显的划分界限,两者相互衔接,最能体现出这种关系的是近年来出现的新的软件生命周期模型——喷泉模型。如图(1)
面向对象设计阶段的主要步骤如下:
① 改进和完善分析阶段对系统的分析结果;
② 设计交互过程和用户接口;
③ 设计任务管理、子系统以及任务之间的协调方式;
④ 设计全局资源,确定任务或者子系统的资源分配;
⑤ 设计对象;
2.3 面向对象方法的应用
面向对象方法从问题的模型开始,模拟人对事物的认识对事物进行分类,进而识别对象,通过整理对象的内部结构和对象之间的关系不断细化问题,它的本质就是敏捷开发方法中的迭代和递增。开发过程通过不断地对功能进行反复的迭代,使系统的功能不断完善。所以面向对象方法适用于SCRUM、XP(极限编程)、CRYSTAL(水晶编程)、PDD(特性驱动开发)等敏捷软件开发。
3 结构化方法和面向对象方法的比较
3.1 编程思想的比较
软件开发的过程就是人们使用各种计算机语言将现实世界的问题翻译到计算机世界,可描述为图(2):
图(2)
结构化方法的编程思想是自上而下,逐步求精,按系统的功能进行模块化设计,将一个复杂和完整的系统按功能分解成小的模块,模块内由顺序、分支和循环等基本控制结构组成,各模块的功能由子程序进行实现。如图(3)
图(3)
而面向对象方法通过模拟人类日常的逻辑思维中经常采用的思想方法和原则,将系统中的事物进行抽象、分类、继承和封装。通过抽象出来的类之间的行为关系来确定整个系统的联系,并在系统中实例化需要的对象,在系统的设计中尽可能地运用人类的思维方式。与结构化相比面向对象更符合人们对事物和解决问题的过程和思维方法。如图(4)
图(4)
3.2 应用的比较分析
结构化开发方法开发前期对系统的功能需求和非功能需求进行完整的架构,使软件具有高可靠性。开发过程自上而下,按照严谨的软件开发生命周期:计划、分析、设计、编码、测试和维护逐个阶段进行开发,各个阶段相互衔接,每一个阶段都要通过严格的审查,测试通过才能进入下一个阶段,保证了软件的高质量。所以比较适合于像操作系统、实时处理系统等这样以功能为主的系统。而由于面向对象方法迭代和递增的本质,所以面向对象方法更适合于在敏捷软件开发中使用。如SCRUM、XP(极限编程)、CRYSTAL(水晶编程)、PDD(特性驱动开发)等。
参考文献:
[1]雷西玲,谢天保,何文娟. 面向对象方法与结构化方法的比较. 2001
[2]邵维忠,杨芙清. 面向对象的系统分析. 1998
[3]蔡希尧. 面向对象技术. 2001
[4]翁松秀. 敏捷软件开发与传统软件工程概述比较. 2016
[5]张莉,裘国永. 结构化方法与面向对象方法的比较分析. 陕西师范大学学报. 2001