软件的开发对于整个软件产业的发展,起着至关重要的作用,在开发过程中,需要有各种开发工具、开发方法和开发过程的支持。不管是开发工具、开发方法还是开发过程,都一直在不断的发展和更新。在软件开发方法发展的过程中,产生了许多众所周知的开发方法,如结构化方法,原型法,面向数据结构的Jackson方法、面向对象方法等。其中,结构化方法和面向对象方法是两种应用十分广泛的软件开发方法,未来的软件开发过程中,可能还会出现一些更好的软件开发方法,如现在的面向服务的软件开发方法,但就目前来说,结构化方法和面向对象方法仍是我们在软件开发过程中应用最广泛的两种开发方法。本文首先对结构化方法和面向对象方法进行详细的介绍,并在此之后将这两种方法进行比较,分析其在不同的问题中的优劣。
1.结构化方法
结构化方法是一种传统的软件开发方法,它是由结构化分析、结构化设计和结构化编码三部分有机组合而成的。它的基本思想是把一个复杂问题的求解过程分阶段进行,而且这种分解是自顶向下,逐层分解,使得每个阶段处理的问题都是一个相对独立且易于分析的模块。C语言就是一个十分典型的结构化高级语言。
1.1结构化分析(SA)
结构化分析方法给出一组帮助系统分析人员产生功能规约的原理与技术,是一种需求分析方法。它一般利用图形表达用户需求,使用的手段主要有数据流图、数据字典、判定表以及判定树等。
1.1.1数据流图
数据流图是一种分层的建立系统逻辑模型的方法,它从数据传递和加工的角度,以图形的方式刻画数据流从输入到输出的变换过程。它可以利用少数几种符号综合的反映出信息在系统中的流动、处理和存储的情况。数据流程图具有抽象性和概括性。
数据流图是以图形的方式来表示,那么每个特定的图形都有它特定的意义,因此数据流图包含特定的元素:
→:数据流。是由一组固定成分的数据组成,但不能改变其数值,箭头的方向表示数据的流向,箭头的始点和终点分别代表数据流的源和目标。除了流向数据存储或从数据存储流出的数据不必命名外,每个数据流必须要有合适的名字,以反映数据流的含义。
□:外部实体。代表系统之外的实体,可以是人、物或其它系统软件,他指出数据所需要的发源地或系统所产生的数据归属地,即数据的源头和数据最终要到达的目的地。
○:对数据进行加工处理。加工是对数据进行处理的单元,它接受一定的数据输入,对其进行处理,并产生输出。
=:数据存储。表示信息的静态存储,可以代表文件、文件的一部分、数据库的元素等。
如图所示即为一在线书店管理系统的顶层数据流图
数据流图的制作步骤为:
由外部实体,确定数据流的源头和终点;
从外部实体的输入流出发,按照系统的逻辑需要,逐步画出一些列逻辑处理过程,直到找到外部实体的输出流,形成数据流的封闭。
再将系统内部数据处理看做整体功能,其内部又有信息的处理、传递和存储。
这样一级一级的剖析,直至所有步骤都很具体为止。
1.1.2数据字典
数据字典,即为数据所建立的描述信息,目的是为了对数据流程图中的各个元素做出详细的说明,它对对数据的数据项、数据结构、数据流、数据存储、处理逻辑、外部实体等进行定义和描述。
1.1.3判定表
判定表是分析和表达多逻辑条件下执行不同操作的情况的工具。它是一个表格,最左侧一栏包含所有判定项和动作名称,右侧上部则是所有条件的组合情况,右侧下部则表示在当前条件下是否执行此动作的表项。
1.1.4判定树
判定树又称决策树,它适合描述问题处理中具有多个判断,而且每个决策与若干条件有关。使用判定树进行描述时,应该从问题的文字描述中分清哪些是判定条件,哪些是判定的决策,根据描述材料中的联结词找出判定条件的从属关系、并列关系、选择关系,根据它们构造判定树。
1.1.5分析步骤
①分析当前的情况,做出反映当前物理模型的DFD;
②推导出等价的逻辑模型的DFD;
③设计新的逻辑系统,生成数据字典和基元描述;
④建立人机接口,提出可供选择的目标系统物理模型的DFD;
⑤确定各种方案的成本和风险等级,据此对各种方案进行分析;
⑥选择一种方案;
⑦建立完整的需求规约。
1.2结构化设计(SD)
结构化设计,即根据SA方法中的数据流图建立一个良好的模块结构图(如SC图);运用模块化的设计原理控制系统的复杂性,即设计出模块相对独立的,模块结构图深度,宽度都适当的,单入口单出口的,单一功能的模块结构的软件结构图或软件层次方框图。此方法提供了描述软件系统的工具,提出了评价模块结构图质量的标准,即模块之间的联系越松散越好,而模块内各成分之间的联系越紧凑越好。最终的任务就是将需求分析得到的数据流图DFD变换为系统结构图(SC)。
进行结构化设计主要遵循以下这么几个原则:
①抽象化
过程抽象化:将任何一个完成的功能都看作一个实体
数据抽象化:可以在不同层次上对数据进行描述
②自顶向下,逐步细化
以自顶向下的方式,对各个层次的过程细节和数据细节逐层细化。
③模块化
将整个系统分为若干个简单的独立的模块
1.2.1概要设计
以需求分析的结果为出发点,构造出一个具体的系统设计方案,决定系统的模块结构(包括决定模块的划分、模块间的数据传递及调用关系)。
1.2.2详细设计
详细设计即过程设计,在总的设计基础上,确定每个模块的内部结构和算法,最终产生每个模块的程序流程图。
1.3.结构化编码(SP)
作为软件制造工程的一个重要阶段,程序编码是程序设计的继续。程序代码的质量与软件系统外部设计和内部设计的质量直接相关,同时,程序设计语言的特性和程序员的编码水平,程序代码的可读性、可维护性、可靠性、可测试性都是直接影响程序质量的因素。
结构化编码采用自顶向下、逐步细化的方法,先全局,后局部,先整体,后细节,先抽象,后具体,逐步求精,编制出来的程序具有清晰的逻辑层次结构,容易阅读、理解、修改和维护,可以提高软件质量,提高软件开发的成功率和生产性。
如图所示即为结构化编码的形式,而这种编码的形式通常以函数的形式来实现
向下可以继续细分
2.面向对象方法
说道面向对象方法,就不得不提到面向对象了,那么什么是面向对象?面向对象是指一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的集合。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。面向对象方法就是基于对象概念,以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统的方法。
2.1面向对象分析(OOA)
面向对象分析阶段是通过行为分析法认定对象及他们之间的关系。面向对象的分析模型通常使用UML的建模方法进行建模。
2.1.1用例图
使用用例图从用户角度描述系统功能并指出各功能的操作者。用例图是指用户使用系统时所执行的一个与行为相关的事物序列,这个序列是在与系统的会话中完成的。
用例图包括用例和角色两个要素,角色与用例之间的连接,用例之间的使用和扩展关系,通过角色执行用例,可以识别出不同的用例。
2.1.2类图
类图描述了系统中的类及其相互之间的关系,其本质反映了系统中对象的类型以及对象之间的各种静态关系。
2.1.3顺序图
顺序图表示对象之间交互的顺序。是将交互关系表示为一个二维图。纵向是时间轴,时间沿竖线向下延伸。横向轴代表了在协作中各独立对象的类元角色。类元角色用生命线表示。当对象存在时,角色用一条虚线表示,当对象的过程处于激活状态时,生命线是一个双道线。
2.1.4活动图
描述满足用例功能需求所要进行的相关活动。是阐明了业务用例实现的工作流程。业务工作流程说明了业务为向所服务的业务主角提供其所需的价值而必须完成的工作。业务用例由一系列活动组成,它们共同为业务主角生成某些工件。工作流程通常包括一个基本工作流程和一个或多个备选工作流程。工作流程的结构使用活动图来进行说明。
2.1.5遵循原则
抽象:指为了某一分析目的而集中精力研究对象的某一性质,它可以忽略其它与此目的无关的部分。抽象是我们科学地研究和处理复杂问题的重要方法。抽象机制被用在数据分析方面,称之为数据抽象。数据抽象是OOA的核心。数据抽象把一组数据对象以及作用其上的操作组成一个程序实体。使得外部只知道它是如何做和如何表示的。
封装:即信息隐蔽。它是指在确定系统的某一部分内容时,应考虑到其它部分的信息及联系都在这一部分的内部进行,外部各部分之间的信息联系应尽可能的少。
继承:是指能直接获得已有的性质和特征而不必重复定义它们。OOA可以一次性地指定对象的公共属性和方法,然后再特化和扩展这些属性及方法为特殊情况,这样可大大地减轻在系统实现过程中的重复劳动。在共有属性的基础之上,继承者也可以定义自己独有的特性。
2.2面向对象设计(OOD)
面向对象设计与面向对象分析采用一致的概念,原则和表示方法,二者之间并没有很大的区别,不需要从分析文档到设计文档的转换,二者之间也不强调严格的阶段划分。能体现二者之间关系的是近几年提出的一种新的软件生命周期模型——喷泉模型(如图所示),其中分析与设计这两个水泡表明OOA与OOD没有严格的边界,他们是连续的、无缝的、允许有一定的相交(一些工作既可以看作是OOA的,也可以看作是OOD的)。
面向对象的设计方法是OO方法中一个中间过渡环节。其主要作用是对OOA分析的结果作进一步的规范化整理,以便能够被OOP直接接受。即确定对象结构、属性、方法等内容,对之前的模型进行优化等。
2.3面向对象编码(OOP)
面向对象程序设计是一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。
3.结构化方法与面向对象的方法
结构化方法与面向对象方法作为两种经典的软件开发方法,各有优缺点。结构化方法是基于功能的分解和抽象,其建立的模型比较只管、简单、可读性好,有利于客户和开发人员交流,能够把一个复杂的系统用多个满足独立性要求的小模块来实现,能有有效的提高软件的开发质量。然而由于用户的需求往往在不断的变化,这些模块很容易受到影响,有可能因为用户的一个小小的改变,整个模块需要重新构建,这大大降低了软件的可维护性和可重用性。
面向对象方法主要是基于对象的交互,以数据为中心来描述系统,数据相对于功能而言,有更强的稳定性,因此可以在模型的基础上直接映射出源码,容易进行系统维护和系统构件重用,大大提高了软件的开发效率,更加容易适应改变。但是并不是所有项目都适合用面向对象方法进行开发,例如在大型信息管理系统中,若缺乏整体系统模块的设计划分,容易造成系统各模块结构不合理等问题,同时建模也会相对复杂,较难理解,正确性难以保证。
在执行效率上来说,结构化方法比面向对象方法产生的代码更直接,更高效。从应用的范围看,结构化方法适用于数据少而操作多的问题。时间证明对于像操作系统这样的以功能为主的系统,结构化方法比较适应它。面向对象方法正好相反,对于数据库,信息管理等以数据为主的而操作较少的系统,用面向对象方法描述要好于结构化方法。