引言算法
所谓软件开发方法,就是为了知足在有限的项目投资、开发时间内,尽量地设计、实现出符合用户要求且高质量的软件而提出的开发策略,根据这些策略将整个软件开发过程变得更加科学化、系统化。固然,在软件开发领域存在各类各样的系统分析和设计方法,但其中结构化方法与面向对象方法是软件开发程序设计中的两个核心思想。数据库
结构化方法起源于20世纪60年代对于GOTO语句的争论和认识,通过几十年的研究及应用,最为成熟且影响最大,而面向对象方法近10年来发展较快,被普遍应用于计算机软件的各个领域。编程
结构化方法的核心思想是自顶向下(逐步求精)和模块化设计(结构化编码),从原问题出发不断拆分、不断简化,最终将问题划分红相对独立的多个小问题,以后再以模块化的形式进行编程;而面向对象方法则以对象为中心,将问题中涉及到的各项事务抽象分解为多个对象,问题便存在于对象之间的交互、关联中,藉由对象的行为进行表现。数据结构
结构化方法架构
概述框架
结构化方法(SD方法)是一种成熟、传统的软件开发方法。它的组成部分有结构化分析(SA)、结构化设计(SD)和结构化程序设计(SP),分别对应软件生命周期的分析、设计和编码阶段。基本思想为把一个复杂问题的求解过程分阶段进行,并且这种分解是自顶向下,逐层分解,使得每一个阶段处理的问题都控制在人们容易理解和处理的范围内。模块化
这里借用一张经典的图来表示自顶向下分解的过程:函数
图1 自顶向下分解示例图工具
结构化分析性能
结构化分析的基本思想是“分解”和“抽象”,并最终用数据流图、 数据字典、 断定表、断定树等图形来对分解、抽象的结果加以表达。下面介绍其中最为的三种——数据流图、数据字典和结构图。
数据流图(DFD)
数据流图(Data Flow Diagram,简称DFD)是一种常见的描述系统中数据流程的图形工具,以图形方式来表达系统的逻辑功能、数据在系统内部的逻辑流向和逻辑变换过程。
数据流程图中有如下几种主要元素:
→:数据流。数据流是数据在系统内传播的路径,所以由一组成分固定的数据组成。如订票单由旅客姓名、年龄、单位、身份证号、日期、目的地等数据项组成。因为数据流是流动中的数据,因此必须有流向,除了与数据存储之间的数据流不用命名外,数据流应该用名词或名词短语命名。
□:数据源(终点)。表明系统以外的实体,能够是人、物或其余软件系统。
○:对数据的加工(处理)。加工是对数据进行处理的单元,它接收必定的数据输入,对其进行处理,并产生输出。
〓:数据存储。表示信息的静态存储,能够表明文件、文件的一部分、数据库的元素等。
同时出于结构化、模块化的要求,数据流图也应该以分层的形式来绘制。其绘制方法为:一、肯定系统的输入输出;二、由外向里画系统的顶层数据流图;三、自顶向下逐层分解,绘出分层数据流图。
下图是一张典型的数据流图的示例:
图2 数据流图示例
数据字典(DD)
数据字典(Data Dictionary,简称DD)是指对数据的数据项、数据结构、数据流、数据存储、处理逻辑、外部实体等进行定义和描述,其目的是对数据流程图中的各个元素作出详细的说明。
上述分层数据流图只是表达了系统的“分解”,为了完整地描述这个系统,还需借助数据词典对图中的每一个数据和加工给出解释。
图3 数据字典示例图
经过这几种表述工具,咱们能够将分析步骤概括以下:
①分析当前的状况,作出反映当前物理模型的数据流图(DFD);
②推导出等价的逻辑模型的数据流图(DFD);
③设计新的逻辑系统,生成 数据字典和基元描述;
④创建人机接口,提出可供选择的目标系统物理模型的DFD;
⑤肯定各类方案的成本和风险等级,据此对各类方案进行分析;
⑥选择一种方案;
⑦创建完整的需求规约。
结构化设计
结构化分析完成了软件开发周期中的(需求)分析部分,知道了在软件开发阶段应该作些什么。接着就应该是结构化设计(SD)来对整个软件项目进行设计,描述整个系统的设计思路和框架,了解如何进行软件的开发。
结构化设计的重要目的就是将软件项目模块化,于是咱们有必要先介绍一下模块结构图。
结构图(SC)
结构图是一个将系统拆解为最小可管理程序单位的图。在结构化设计中,结构图能够将程序模块整理为树状结构,每个模块以一个其中有模块名称的方框表示,树状结构能够清楚表示各模块之间的关系。
结构化分析中经常使用结构图表示程序的顶层架构。结构图有助于程序设计者用个个击破的方式处理软件问题,也就是将一直将问题拆解为更小的问题,直到最后问题小到能够被人类理解为止。此程序称为由上到下设计或是功能分解。结构图的做用相似建筑房屋中使用的蓝图。在设计阶段,结构图是客户和不一样软件工程师沟通的方式。在代码实现的阶段,由结构图能够得知系统的完整架构。
图4 结构图示例
结构化设计的基本思想就是根据结构化分析方法获得的数据流图(DFD)创建结构图(SC),从而达到尽量用程序结构反映须要解决问题的结构的目的。固然,此时获得的结构图还只是初步的结构图,还须要根据结构化设计的基本原则和有关启发规则,对结构图进行进一步的优化。
结构化程序设计
结构化程序设计(structured programming,简称SP)由结构化设计获得的结构图划分功能模块,自顶向下分解任务,并将其分配相应的开发人员,开发过程当中通常要求仅利用顺序、选择、循环三种基本结构。经过这样的方式,开发人员不须要考虑软件项目的整体,而仅仅须要分析本身开发的部分,这样有利于对单元模块进行详细的测试,也能很好地保证软件的开发质量。
面向对象方法
面向对象的出发点是尽量模拟人类的思惟方式,将软件开发过程变得更加接近人类认识世界、解决问题的过程。为了达到这一点,面向对象方法经过引入对象、类、封装、继承、多态等概念来支撑其开发方法,打破了传统的代码、数据分离作法,而是将一种数据结构和操做该数据结构的方法捆在一块儿, 封装在一个程序内,实现了数据封装和信息隐藏,经过“ 操做”做为接口实现信息传递。对外部来讲,只知道“ 它是作什么的”,而不知道“ 它是如何作的”,使得数据封装、 信息隐藏、 抽象代码共享等软件工程思想获得充分体现。
面向对象方法(Object-Oriented)包括面向对象分析(OOA)、面向对象设计(OOD)和面向对象程序设计(OOP)三个部分。
面向对象分析(OOA)
面向对象分析时面向对象方法的第一个环节,这一环节的任务是将问题和对项目的理解,抽象成规范的对象和消息传递,从而创建起整个面向对象软件开发的基础。通常这一部分对于新手来讲是较难的,由于要适应相应思惟的转变。上个学期OO课程的开头部分,你们应该可以感觉到,很难正确地对问题中的对象进行准确划分,可是在适应这类思惟方式以后,在处理其余问题时很能很容易对问题进行抽象。
总的来讲,OOA创建在封装、抽象、多态这三个概念之上。
封装
面向对象方法中,经过封装机制将数据和相应的操做捆绑到了一块儿,以造成一个完整的、具备属性(数据)和行为(操做)的数据类型。这就实现了从数据和操做两个方面来描述某个事物,更加符合人们描述某个事物的思惟习惯,所以也更加容易理解和实现。
继承
继承可让某个类型得到另外一个类型的属性(成员变量)和行为(成员函数)的简单方法。继承就如同现实世界中的进化同样,继承获得的子类型,既能够拥有父类型的属性和行为,又能够新增长子类型所特有的属性和行为。这样大大提升了开发的效率,这是传统面向过程开发所难以实现的。
多态
多态是继承的直接结果。可是虽然继承了父类型的属性和行为,不一样的对象间有着差别,有不一样的操做,因此面向对象方法经过给出接口调用不一样类的“同一行为”实现了对象的多态。
有了上述的三者,OOA则经过五个层次(主题层、对象层、结构层、属性层和服务层)上的抽象,完成对问题的完整分析,最终获得问题的抽象结构。
面向对象设计(OOD)
OOA 和 OOD 采用一致的概念、 原则和表示方法,两者之间不存在鸿沟,不像上面所述的结构化方法,从OOA到OOD不须要从分析文档到设计文档的转换。它们之间没有明显的边界,甚至可能有必定程度的交集。
其中二者的区别主要是:OOA 与系统的问题域更加相关,OOD 与系统的实现更加密切;OOD 是对 OOA 所得出的对象模型的直接细化和抽象,获得可直接实现的类图。
经过OOA的初步分析咱们获得了:问题 = 对象 + 类 + 继承 + 消息传递,而OOD则进一步过渡,对OOA分析的结果做进一步的规范化整理,以便可以被OOP直接接受。
面向对象程序设计(OOP)
OOP是近几年来最为流行的开发方式之一,而且在实际应用中展示了巨大的威力。
OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。经过接口的设计,实现了总体运算,每一个对象都可以接收信息、处理数据和向其它对象发送信息。OOP 主要有如下主要的概念:
组件:数据和功能一块儿在运行着的计算机程序中造成的单元,组件在 OOP 计算机程序中是模块和结构化的基础。
抽象:程序有能力忽略正在处理中信息的某些方面,即对信息主要方面关注的能力。
封装:确保组件不会以不可预期的方式改变其它组件的内部状态;只有在那些提供了内部状态改变方法的组件中,才能够访问其内部状态。每类组件都提供了一个与其它组件联系的接口,并规定了其它组件进行调用的方法。
多态:组件的引用和类集会涉及到其它许多不一样类型的组件,并且引用组件所产生的结果得依据实际调用的类型。
继承:容许在现存的组件基础上建立子类组件,这统一并加强了多态性和封装性。典型地来讲就是用类来对组件进行分组,并且还能够定义新类为现存的类的扩展,这样就能够将类组织成树形或网状结构,这体现了动做的通用性。
以上的四个概念侧重于系统实现的角度,和OOA段的概念阐述并不彻底一致。
面向对象方法和结构化方法的比较
首先,面向对象方法较之与传统的结构化方法有其独到之处:
1) 可重用性。可重用性是面向对象软件开发的一个核心思路。经过类的继承关系,使公共的特性可以共享,简化了对象、类的建立工做量,增长了代码的可重性。另外,重用通过测试的代码还可使产生额外错误的可能性达到最小。
2) 可扩展性。可扩展性是对现代应用软件提出的又一个重要要求。类的继承性使类能反映现实世界的层次结构,多态性反映了现实世界的复杂多样。类的继承性和多态性使软件编码具备良好的可重用性和可扩展性。无需修改源代码就可使软件功能容易扩充和修改。
3) 数据保护。数据和操做数据的算法再也不分离,它们被封装在一块儿,对象内部的行为实现细节被隐藏。封装防止了程序相互依赖性而带来的变更影响。
4) 可管理性。面向对象的开发方法采用类做为构建系统的部件,以对象做为系统的基本组成单元,使整个项目的组织更加合理、方便,由于概括事物、 划分类进行管理符合人们在认识和管理客观世界的习惯思惟方式。
然而面向对象方法和结构化方法相比也存在一些弊端:
1) 上手慢。新手在接触到面向对象方法时,每每很难准确的将问题分解为多个类之间的联系。并且即便通过一段时间的训练,对于一些比较复杂的问题也很难作到经过类和类之间的信息传递来准确描述。
2) 认识差别。对于一个相同的问题,很难有一个肯定性的划分,因此就会出现不一样的设计人员对于类、类之间的联系的理解不一致,而这种不一致很难经过统一的方式表达出来,这就可能会致使后期面向对象程序设计OOP过程当中出现分歧。
3) 编程便捷性。在编写程序方面,结构化方法有着比较强的优点,它思路清晰,条理严谨,步骤整洁,便于阅读理解。这一点也正是不少企业开发项目时首先经过面向对象方法进行分析设计,以后经过模块化、结构化的方式进行软件开发的缘由。
总结
程序设计方法的发展经历了四代,而通过几十年的更迭,结构化方法和面向对象方法成为当代软件工程的程序设计方法中最本质的两种思想方法,足以体现优越性。
结构化方法体现了抽象思惟和复杂问题求解的基本原则,面向对象则深入反映了客观世界由对象组成这一本质特色。各类程序设计方法的一个重要区别在于问题分解的出发点不一样(因子),思惟模式不一样。计算机中数据结构和过程是密切相关的,结构化方法将数据结构和过程分开考虑,面向对象的方法组合数据和过程于对象之中。理论上,对象式方法将产生更好的模块内聚和耦合特性,使得软件更易于重用与维护,但在实践中程序设计方法须要工具和环境的支撑,须要考虑软件生命周期的各个环节,在选择程序设计方法时,须要综合考虑这些因素,适当选用其中一种或者是综合使用。
最后借用一句俏皮话来描述二者之间的差异:结构化方法是编年体;面向对象方法是纪传体。
参考资料:
[1] Wikipedia,结构化方法、面向对象方法
[2] Baidu Baike,结构化方法、面向对象方法
[3] 符于江. 程序设计中结构化方法和面向对象方法的比较[A]. 海南: 电脑知识与技术,2008
[4] 汪寒昊. 软件开发方法_结构化方法与面向对象方法比较[A]. 四川: 科技信息,2011