结构化方法与面向对象方法
一.结构化方法
1.1结构化方法概述
结构化方法起源于结构化程序设计,具有面向功能、结构清晰、支持逐步求精等特点,使软件易于维护。在运用结构化开发方法时,设计人员首先需要运用抽象(Abstraction)方法在最高层次上描述问题的解决方案,之后,设计人员在进行逐步求精(Refinement),即通过逐步细化结构最终得出问题的解决方案,在此过程中各个结构内部的信息对外部是不可见的,即信息隐藏。
1.2结构化方法的起源
20世纪60年代后期,程序员发现软件的开发周期和软件的质量并不明显的存在正比的关系,那时候我们的程序员们便开始摸索一种较为成熟且可靠的软件开发方法,其中:结构化便成为当时的"佼佼者"。
如同一件雕塑,当米开朗基罗将大卫展现于世人眼前时,人们会惊叹他的精致与生命力,但是:米开朗基罗在创作之初就已经在心中构造好大卫的全貌,这样,才能保证框架的方向性与正确性。结构化方法正是如此,在设计过程中强调: 自顶向下,逐步求精,模块化设计等原则。当我们的程序员了解要完成的软件的全貌后,便可以刷夜大干一场了,但是在实现的过程中,因为总体的框架已经构建好,所以程序员们关注的细节全局的构建移向较为低一层的设计,简单来说,就是将问题逐层解剖,逐步向下细节化。
1.3结构化方法的特点
结构化方法基于功能分解设计系统结构, 它从内部功能上模拟客观世界。所采用的主要工具是数据流图DFD。通过不断将DFD中复杂的处理分解成子数据流图来简化问题。
优点:结构化方法能够增加软件规格说明的可读性和软件系统的可靠性。数据流图容易理解, 有利于开发人员与客户的交流。
缺点:软件系统结构对功能的变化十分敏感, 功能的变化往往意味着重新设计。设计出的软件难以重用, 延缓了开发的进程。
二.面向对象方法
2.1 面向对象方法概述
面向对象(Object+oriented,简称OO)方法是以面向对象思想为指导进行系统开发的一类方法的总称。这类方法以对象为中心,以类和继承为构造机制来抽象现实世界,并构建相应的软件系统。
2.2面向对象方法的特点
面向对象方法构建的软件系统中,软件中任何一个元素都是对象,复杂的软件对象由相对简单的软件对象组成,各个对象之间仅能通过传递消息互相联系。用对象分解取代了传统的功能分解。将对象划分为对象类,每个对象类都定义一组数据和一组方法。按照子类和父类的关系,将若干对象类组成一个具有层次结构的系统。
封装性:把数据和实现操作的代码集中起来放在对象内部,不能从外部直接访问或修改。 继承性:指子类能够直接获得父类已有的性质和特性,而不必重新定义。
多态性:允许将父对象设置成和它的一个或多个子对象相等的技术,允许每个对象以适合自己的方式去响应共同的消息。即发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为。
2.3面向对象方法的过程
2.3.1 面向对象分析(OOA):
OOA方法是把实体—关系图中的概念与面向程序设计语言中的主要概念结合在一起而形成的一种分析方法。在该方法中采用了实体、关系和属性等信息模型分析中的概念,同时采用了封闭、类结构和继承性等面向对象程序设计语言中的概念。它的5个基本步骤为①确定问题域②区分类和对象③区分整体对象以及组成部分④定义属性和服务⑤确定附加的系统约束
2.3.2 面向对象设计(OOD):
设计阶段则主要是确定实现用户需求的方法,即怎样做才能满足用户需求,并构造出系统的实现蓝图。OOD首先从OOA的结果开始,并将其从问题域映射到实现域;为满足实现的需要,还要增加一些类 、结构及属性和服务,并对原有类及属性进行调整。此外,还要完成应用控制、人机交互界面的设计等。OOA与OOD采用一致的表示法,使得从OOA到OOD不存在转换,只有局部的修改或调整,并增加了与实现有关的独立部分,因此,OOA与OOD之间不存在传统方法中分析与设计之间的鸿沟,成为面向对象方法的主要优势。
2.3.3 面向对象编程(OOP):
这是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。
三.两类方法比较
3.1 概念比较
3.1.1 模块与对象
结构化方法中的模块是一个数据处理单位,它能接受一定的输入,并产生相应的输出,是一个纯功能化的实体。而面向对象方法中的对象,它同样可以接受输入并产生输出,但它作为一个数据与操作的整体,也可以存储数据。因此,对象是对数据和功能的抽象和统一,其概念包括了模块的概念。利用对象,可以实现的程序效果比利用模块要丰富很多,因此,对象的设计比模块更高明一分。
3.1.2 过程调用和消息传递
在结构化方法中,过程是一个独立实体,显式地为其使用者所见;过程调用所涉及到的过程及函数都属于一个程序实体。在面向对象程序设计中,方法是隶属于对象的,是对象的功能体现,是不能独立存在的实体;不同对象间的消息传递是不同程序实体之间的交互协作。可以这样说,面向对象设计中的程序实体是松耦合,而结构化的实体是紧耦合。在结构化设计中,同一实参的调用,其结构是相同的。但在面向对象中的消息传递不同,同一消息的传递可能产生不同的结果,这正是面向对象方法多态性的体现。
3.1.3 静态连接与动态连接
在面向对象方法中,消息的激活机制把不同对象动态地联系在了一起,使整个机体运转了起来。而结构化方法中的各模块只能按照最初编写好的代码按序执行功能。
3.2基本原则的比较
3.2.1结构化方法遵循基本原则有:
(1)抽象原则:是一切系统科学方法都必须遵循的基本原则,它注重把握系统的本质内容,而忽略与系统当前目标无关的内容,它是一种基本的认知过程和思维方式。
(2)分解原则:是结构化方法中最基本的原则,它是一种先总体后局部的思想原则,在构造信息系统模型时,它采用自顶向下、分层解决的方法。
(3)模块化原则:结构化方法最基本的分解原则的具体应用,它主要出现在结构化设计阶段中,其目标是将系统分解成具有特定功能的若干模块,从而完成系统指定的各项功能。
3.2.2面向对象方法遵循基本原则有:
(1)抽象: 抽象是指从事物中舍弃个别的、非本质的特征,而抽取共同的本质特征的做法。使用抽象的好处:一是便于访问,外部对象只需知道有限的几个操作(接口)即可访问其中的对象;二是便于维护,如果程序内部发生变化而其接口没有发生变化,则只需对其内部进行修改。
(2)分类:分类的作用就是按照某种原则划分出事物的类别,以便有助于认识复杂世界。在面向对象中分类就是把具有相同属性和方法的对象化为一类,用类作为这些对象的抽象描述。分类实际上是把抽象原则运用于对象描述时的一种表现形式。
(3)封装:在面向对象中封装就是用对象把属性和和操纵这些属性的操作包装起来,形成一个独立的实体单元,体现了事物的相对独立性。封装的另一个含义则是信息隐蔽,即外界不能直接存取对象的内部属性以及隐藏起来的内部操作,外界也不用知道对象操作的内部实现细节。
(4)多态性 :多态性是指在具有继承关系的类层次结构中可以定义同名的操作或者属性,但是这些属性和操作具有不同的含义,即具有不同的数据类型或表现出不同的行为。
3.3 程序设计思想比较
3.3.1 结构化方法
结构化方法的程序设计偏重于过程,在其基本指导思想中,一个完整的程序是由算法和数据结构两部分组成的,开发人员的工作就是实现这两部分的内容,并用合适的方式使其二者建立连接,实现期望的程序功能。
在具体设计流程上,结构化方法遵循了自底向上的设计思想,即先设计底层模块,确定模块内部算法,设计模块内部程序,并进行单元测试。模块完成之后,再进行模块之间的组装,进行模块的集成测试。随后进行确认测试和系统测试,完成设计和调试任务。
3.3.2 面向对象方法
对于面向对象方法的程序设计,其唯一组成是对象,对象之间的关系构成了程序的基本框架。由于对象是一个数据、功能统一的实体,故开发人员需要实现对象内部的数据结构与算法,不过显然实现难度比一个完整的程序要小很多。之后的关注点就是协调好对象之间的信息传递,使其能协同工作,发挥预期效果。
与结构化方法相反的是,面向对象方法采用自顶向下的设计思想,先设计父类,再设计子类,并继承父类的属性与方法,而对象则是在最后程序运行过程中动态生成。
四.总结
在进行软件开发之前,合理地选择开发的模式尤为重要。结构化方法和面向对象方法各有优劣,并非完全对立,需要根据实际的情况加以选择。通过结构化方法构建小型项目结构简单,逻辑清晰,但是当软件的体量增大时可能会变得难以维护;面向对象方法有利于处理复杂的系统关系,但是需要留心是否存在过度封装或者设计错误等问题。软件开发没有银弹,只有就事论事,因地制宜,才能获得最好的开发效果。