小议传统方法学与面向对象的区别
姓名 :戴育兵
学号 :G1030510
年级 :大二
班级 : (2)班
摘要
传统的软件工程方法学曾经给软件产业带来巨大进步,部分地缓解了软件危机,使用这种方法学开发的许多中、小规模软件项目都获得了成功。但是,人们也注意到当把这种方法学应用于大型软件产品的开发时,似乎很少取得成功。
在20世纪60年代后期出现的面向对象编程语言Simdla_67中首次引入了类和对象的概念,自20世纪80年代中期起,人们开始注重面向对象分析和设计的研究,逐步形成了面向对象方
法学。到了20世纪90年代,面向对象方法学已经成为人们在开发软件时首选的范型。面向对象技术已成为当前最好的软件开发技术。
软件工程传统方法学
1. 传统方法学概述
随着计算机应用领域的不断拓广,各种各样的问题也不断涌现,当问题严重到开发人 员无法控制的时候便产生了软件危机。软件危机的出现,促使了软件工程学的形成和发展。 随之整合整套技术的软件工程方法学广泛应用,主流之一就是传统方法学。传统方法学在 软件开发过程中占据相当大的比重,因为其悠久的历史而为很多软件工程师青睐。如果说 自然语言和编程语言之间有一道难以跨越的鸿沟,传统方法学就是跨越这道鸿沟的桥梁。
传统方法学又称生命周期方法学或结构化范型。一个软件从开始计划起,到废弃不用 止,称为软件的生命周期。在传统的软件工程方法中,软件的生存周期分为需求分析、总 体设计、详细设计、编程和测试几个阶段。
传统方法学使用的是结构化分析技术来完成需求分析阶段的工作。软件工程学中的需 求分
析具有两方面的意义。在认识事物方面,它具有一整套分析、认识问题域的方法、原 则和策略。这些方法、原则和策略使开发人员对问题域的理解比不遵循软件工程方法更为 全面、深刻和有效。在描述事物方面,它具有一套表示体系和文档规范。但是,传统的软 件工程方法学中的需求分析在上述两方面都存在不足.它在全局范围内以功能、数据或数 据流为中心来进行分析。这些方法的分析结果不能直接地映射问题域,而是经过了不同程 度的转化和重新组合。因此,传统的分析方法容易隐蔽一些对问题域的理解偏差,与后续 开发阶段的衔接也比较困难。
在总体设计阶段,以需求分析的结果作为出发点构造出一个具体的系统设计方案,主 要是决定系统的模块结构,以及模块的划分,模块间的数据传送及调用关系。详细设计是 在总体设计的基础上考虑每个模块的内部结构及算法,最终将产生每个模块的程序流程图。 但是传统的软件工程方法中设计文档很难与分析文档对应,原因是二者的表示体系不一致, 所谓从分析到设计的转换,实际上并不存在可靠的转换规则,而是带有人为的随意性,从 而很容易因理解上的错误而留下隐患。
编程阶段是利用一种编程语言产生一个能够被机器理解和执行的系统,测试是发现和 排除
程序中的错误,最终产生一个正确的系统。但是由于分析方法的缺陷很容易产生对问 题的错误理解,而分析与设计的差距很容易造成设计人员对分析结果的错误转换,以致在 编程时程序员往往需要对分析员和设计人员已经认识过的事物重新进行认识,并产生不同 的理解。因此为了使两个阶段之间能够更好的衔接,测试就变得尤为重要。
软件维护阶段的工作,一是对使用中发生的错误进行修改,二是因需求发生了变化而 进行修改。前一种情况需要从程序逆向追溯到发生错误的开发阶段。由于程序不能映射问 题以及各个阶段的文档不能对应,每一步追溯都存在许多理解障碍。第二种情况是一个从
需求到程序的顺向过程,它也存在初次开发时的那些困难,并且又增加了理解每个阶段原 有文档的困难.
2. 传统方法学的优点
程序在调试、可读性和可维护性等方面都有很大的改进。
传统软件工程方法面向的是过程,它按照数据变换的过程寻找问题的结点,对问题进 行分解。由于不同人对过程的理解不同,故面向过程的功能分割出的模块会因人而异。对 于问
题世界的抽象结论,结构化方法可以用数据流图,系统结构图,数据字典,状态转移 图,实体关系图来进行系统逻辑模型的描述,生产一个最终能满足需求且达到工程目标的 软件产品所需要的步骤。
传统软件工程方法学强调以模块为中心,采用模块化,自顶向下,逐步求精设计过程, 系统是实现模块功能的函数和过程的集合,结构清晰,可读性好,是提高软件开发质量的 一种有效手段。结构化设计从系统的功能入手,按照工程标准,严格规范地将系统分解为 若干功能模块,因为系统是实现模块功能的函数和过程的集合。然而,由于用户的需要和 软硬件技术的不断发展变化,作为系统基本组成部分的功能模块很容易受到影响,局部修 改甚至会引起系统的根本性变化。开发过程前期入手快而后期频繁改动的现象比较常见。
3. 传统工程方法学的缺点
传统的软件工程方法学也存在很多的缺点,主要表现在生产效率非常底,从而 导致不能满足用户的需要,复用程度低,软件很难维护等。
结构化开发方法,注重的是系统功能,自顶向下,从大到小的功能分解,从DFD->MSD,
往往系统需求变化最大就是功能,一段较长的时间内,商业的流程可能已经发生了很大的变化,这样基于功能和过程的方法显然难以维护的,代码重用率。
代码重用性不高:以过程为中心设计新系统,除了一些标准函数,大部分代码都必须重新编写。由于软、硬件技术的不断发展和用户需求的变化,按照功能划分设计的系统模块容易发生变化,使得开发出来的模块的可维护性欠佳。
开发周期长,系统难以适应环境的变化,开发过程发杂繁琐。
适用于相对稳定。,业务处理过程规范的,需求明确且在一定时间内不会发生大变化的复杂系统的开发。
软件重用性差
重用性是指同一事物不经修改或稍加修改就可多次重复使用的性质。软件重用性是软件工程追求的目标之一。
软件可维护性差
软件工程强调软件的可维护性,强调文档资料的重要性,规定最终的软件产品应该由完整、一致的配置成分组成。在软件开发过程中,始终强调软件的可读性、可 修改性和可测试性是软件的重要的质量指标。实践证明,用传统方法开发出来的软件,维护时其费用和成本仍然很高,其原因是可修改性差,维护困难,导致可维护 性差。
开发出的软件不能满足用户需要
用传统的结构化方法开发大型软件系统涉及各种不同领域的知识,在开发需求模糊或需求动态变化的系统时,所开发出的软件系统往往不能真正满足用户的需要。
用结构化方法开发的软件,其稳定性、可修改性和可重用性都比较差,这是因为结构化方法的本质是功能分解,从代表目标系统整体功能的单个处理着手,自顶向 下不断把复杂的处理分解为子处理,这样一层一层的分解下去,直到仅剩下若干个容易实现的子处理功能为止,然后用相应的工具来描述各个最低层的处理。因此, 结构化方法是围绕实现处理功能的“过程”来构造系统的。然而,用户需求的变化大部分是针对功能的,因此,这种变化对于基于过程的设计来说是灾难性的。用这 种方法设计出来的系统结构常常是不稳定的,
用户需求的变化往往造成系统结构的较大变化,从而需要花费很大代价才能实现这种变化。
面向对象方法学
1.象的基本概念
(1)对象
对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。
(2)对象的状态和行为。
对象具有状态,一个对象用数据值来描述它的状态。
对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为。
对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中
(3)类。
具有相同或相似性质的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象。
类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。
类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。
(4)类的结构。
在客观世界中有若干类,这些类之间有一定的结构关系。通常有两种主要的结构关系,即一般--具体结构关系,整体--部分结构关系。
①一般——具体结构称为分类结构,也可以说是“或”关系,或者是“is a”关系。
②整体——部分结构称为组装结构,它们之间的关系是一种“与”关系,或者是“has a”关系。
(5)消息和方法。
对象之间进行通信的结构叫做消息。在对象的操作中,当一个消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。发送一条消息至少要包括说明接 受消息的对象名、发送给该对象的消息名(即对象名、方法名)。一般还要对参数加以说明,参数可以是认识该消息的对象所知道的变量名,或者是所有对象都知道 的全局变量名。
类中操作的实现过程叫做方法,一个方法有方法名、参数、方法体。
(1)对象唯一性。
每个对象都有自身唯一的标识,通过这种标识,可找到相应的对象。在对象的整个生命期中,它的标识都不改变,不同的对象不能有相同的标识。
(2)抽象性。
分类性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。
(3)继承性。
继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。
继承性是面向对象程序设计语言不同于其它语言的最重要的特点,是其他语言所没有的。
在类层次中,子类只继承一个父类的数据结构和方法,则称为单重继承。
在类层次中,子类继承了多个父类的数据结构和方法,则称为多重继承。
在软件开发中,类的继承性使所建立的软件具有开放性、可扩充性,这是信息组织与分类的行之有效的方法,它简化了对象、类的创建工作量,增加了代码的可重性。
采用继承性,提供了类的规范的等级结构。通过类的继承关系,使公共的特性能够共享,提高了软件的重用性。
(4)多态性(多形性)
多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。
多态性允许每个对象以适合自身的方式去响应共同的消息。
多态性增强了软件的灵活性和重用性。
面向对象方法学的优点
1. 与人类习惯的思维方法一致
传统的程序设计技术是面向过程的设计方法,这种方法以算法为核心,把数据和过程作为相互独立的部分,数据代表问题空间中的客体,程序代码则用于处理这些数据。
把数据和代码作为分离的实体,反映了计算机的观点,因为在计算机内部数据和程序是分开存放的。但是,这样做的时候总存在使用错误的数据调用正确的程序模块,或使用正
确的数据调用错误的程序模块的危险。使数据和操作保持一致,是程序员的一个沉重负担,在多人分工合作开发一个大型软件系统的过程中,如果负责设计数据结构的人中途改变了某个数据的结构而又没有及时通知所有人员,则会发生许多不该发生的错误。
传统的程序设计技术忽略了数据和操作之间的内在联系,用这种方法所设计出来的软件系统其解空间与问题空间并不一致,令人感到难于理解。实际上,用计算机解决的问题都是现实世界中的问题,这些问题无非由一些相互间存在一定联系的事物所组成。每个具体的事物都具有行为和属性两方面的特征。因此,把描述事物静态属性的数据结构和表示事物动态行为的操作放在一起构成一个整体,才能完整、自然地表示客观世界中的实体。
面向对象的软件技术以对象(object)为核心,用这种技术开发出的软件系统由对象组成。对象是对现实世界实体的正确抽象,它是由描述内部状态表示静态属性的数据,以及可以对这些数据施加的操作(表示对象的动态行为),封装在一起所构成的统一体。对象之间通过传递消息互相联系,以模拟现实世界中不同事物彼此之间的联系。
面向对象的设计方法与传统的面向过程的方法有本质不同,这种方法的基本原理是,使用现实世界的概念抽象地思考问题从而自然地解决问题。它强调模拟现实世界中的概念而
强调算法,它鼓励开发者在软件开发的绝大部分过程中都用应用领域的概念去思考。在面向对象的设计方法中,计算机的观点是不重要的,现实世界的模型才是最重要的。面向对象的软件开发过程从始至终都围绕着建立问题领域的对象模型来进行:对问题领域进行自然的分解,确定需要使用的对象和类,建立适当的类等级,在对象之间传递消息实现必要的联系,从而按照人们习惯的思维方式建立起问题领域的模型,模拟客观世界。