面向过程编程和面向对象编程各有什么优缺点?
作者:匿名文章来源:未知点击量:11677更新时间:2005-10-14
作者:拉姆钱德拉·加尔格
软件危机(软件危机)
软件技术总是处于不断的发展变化中,新的工具和技术层出不穷。这就要求软件行业和软件工程师不断寻求软件设计和开发的新途径。由于软件系统的日益复杂和软件行业内部竞争的日益激烈,这一要求变得更加迫切。为了克服由这一要求引起的软件危机,必须解决以下问题:
1,在系统设计中,如何表示问题的真实实体?
2.如何设计具有开放接口的系统?
3.如何保证模块的复用性和扩展性?
4.如何开发能够容忍未来可能发生的变化的模块?
5.如何提高软件生产率,降低软件开销?
6.如何管理时间表?
7.如何提高软件质量?
8.软件开发过程如何产业化?
当软件产品没有完成,没有被使用,或者发布时带有各种错误,问题就出现了。此外,用户需求的变化也成为一个重要的问题。许多关于软件实现的报告表明,在软件产品发布和使用之前,需要对其质量进行仔细的评估。一般来说,条件评估中应考虑的质量因素包括:
1,正确性(正确性)
2、可维护性(maintenance)
3、可重用性(reuse ability)
4.开放性和可解释性。
5.轻便
6、安全(保安)
7、诚信(Integrity)
8、用户友好性(User friendship)
软件进化(软件进化)
人工智能领域的著名作家欧内斯特·泰洛将软件技术的发展比作树木的生长。像树一样,软件的进化有明显的阶段,这些阶段被称为层。在过去的四十年里,这几层逐渐建立起来,每一层都是从前一层发展起来的。图1显示了这个过程。但是当谈到层的寿命时,关于树的比喻就失效了。在一个软件系统中,每一层都在不断地发挥作用,而在一棵树中,只有顶层是有用的。
面向对象编程是一种新的编程方法。自从计算机发明以来,为了适应日益复杂的程序,编程的方法发生了巨大的变化。汇编语言发明以后,程序员终于可以用符号来表示那些机器指令了,这样就可以编写更长更复杂的程序了。当程序的规模不断增长时,高级语言被引入,为程序员提供了更多的工具来处理日益增加的复杂性。第一种普遍使用的语言是FORTRAN。然而,尽管FORTRAN迈出了重要的第一步,但用它编写的代码却很难清晰易懂。
结构化编程的思想诞生于1960。C和Pascal等语言强烈提倡这种编程方式。结构化编程语言使得编写更复杂的程序变得容易。但是,一旦项目达到一定规模,即使使用结构化编程方法,情况也会变得不可控。
在编程方法的发展中,每一次重大突破都使程序员能够应对更大的复杂性。在这条道路上的每一步,新方法都使用并发展了以前方法中的最佳思想。今天,许多项目的规模有了进一步的发展。为了解决这个问题,面向对象的编程方法应运而生。
在详细介绍面向对象编程之前,我们先简单了解一下面向过程编程的方法。在面向过程的程序设计方法中,问题被看作是一系列要完成的任务,如阅读、计算和打印。许多功能用于完成这些任务。问题的焦点在函数上。图2显示了一个典型的面向过程的程序结构。层次分解技术用于确定解决特定问题需要完成的一系列任务。
面向过程编程的基本任务是编写计算机执行的指令序列,并以函数的方式组织这些指令。通常我们使用流程图来组织这些动作,并描述从一个动作到另一个动作的控制流。
我们在专心开发函数的时候,很少关注多个函数所使用的数据。这些数据怎么了?使用这些数据的函数对它们有什么影响?
在一个多功能程序中,许多重要的数据都放在全局数据区,以便所有的函数都可以访问它们。每个函数都可以有自己的本地数据。图3显示了面向过程的程序中功能和数据之间的关系。
面向对象编程模式
发明面向对象编程方法的主要出发点是为了弥补面向过程编程方法中的一些缺点。OOP将数据视为程序开发的基本元素,不允许数据在系统中自由流动。它将数据与操作数据的函数紧密地联系在一起,并保护数据免受外部函数的意外更改。OOP允许我们将问题分解成一系列实体——这些实体被称为对象,然后围绕这些实体构建数据和功能。面向对象编程中数据和功能的组织结构如图4所示。
一个对象的数据不能访问其他对象的函数,而一个对象的函数可以访问其他对象的函数。
面向对象编程的一些显著特征包括:
编程的重点是数据而不是过程;
程序分为所谓的对象;
数据结构被设计成表达对象的特征;
函数作为对对象数据的操作,与数据结构紧密结合;
数据是隐藏的,不能被外部函数访问;
对象可以通过函数进行通信;
需要时可以方便地添加新的数据和功能;
在编程过程中遵循自底向上的设计方法。
面向对象编程是编程模式中的新概念,对不同的人可能有不同的含义。因此,在我们继续下面的内容之前,最好先给出一个面向对象编程的定义。我们对面向对象编程的定义是“面向对象编程是一种为数据和函数提供独立内存空间的方法,必要时可以作为模板创建类似模块的副本。”。这样的编程方法被称为面向对象编程。"
从上面的定义可以看出,一个对象被看作是计算机内存中一个独立的区间,在这个区间中存储着数据和一组可以访问数据的操作。因为内存间隔是相互独立的,所以对象无需修改就可以在许多不同的程序中使用。
什么是面向对象编程?
面向对象编程(OOP)技术从结构化编程中吸收好的思想,并将这些思想与一些新的、强大的思想相结合,从而为你的编程工作提供了一种全新的方法。通常,在面向对象的编程风格中,你会将一个问题分解成一些相互关联的子集,每个子集包含相关的数据和函数。同时,你会以某种方式把这些子集分成不同的层次,一个对象就是某个类型的定义变量。当您定义一个对象时,您隐式地创建了一个新的数据类型。
面向对象编程的基本概念
作为一个术语,“面向对象”在不同的人之间有不同的解释。因此,有必要了解一些在面向对象编程中广泛使用的概念。在本节中,我们将讨论以下内容:
1,对象
2.班级
3.数据抽象
4.遗产
5.动态绑定
6.数据封装
7.多态性
8.信息传递
目标
在面向对象的系统中,对象是运行时的基本实体。它可以用来表示一个人或一个银行账户、一个数据表或任何需要程序处理的东西。它还可以用来表示用户定义的数据,如向量、时间或列表。在面向对象编程中,对问题的分析一般是基于对象以及对象之间的自然关系。如前所述,一个对象在内存中占据一定的空间,并有一个与之相关联的地址,就像Pascal和c中record中的结构一样。
当程序运行时,对象通过相互发送消息来进行交互。例如,程序包含一个“客户”对象和一个“帐户”对象,客户对象可以向帐户对象发送消息以查询其银行帐户。每个对象都包含数据和操作数据的代码。即使不知道对方数据和代码的细节,对象之间仍然可以进行交互。你只需要知道对象可以接受的消息类型和对象返回的响应类型,尽管不同的人会用不同的方式实现它们。
种类
正如我们前面提到的,对象包含数据和操作数据的代码。一个对象包含的所有数据和代码都可以通过类形成一个用户自定义的数据类型。事实上,对象是一个类类型的变量。一旦定义了一个类,我们就可以创建这个类的多个对象,每个对象都与一组数据相关,而这组数据的类型是在类中定义的。因此,类是具有相同类型的对象的抽象。例如,芒果、苹果和橘子都是水果类的对象。类是用户定义的数据类型,但在编程语言中,它的行为与内置数据类型相同。例如,创建类对象的语法与创建整数对象的语法完全相同。如果水果被定义为一个类,则语句
水果芒果;
创建了一个水果类的对象mango。
数据抽象和封装
将数据和功能包装在一个单元(称为类)中的行为称为封装。数据封装是一个类最典型的特征。数据不能被外界访问,只能被封装在同一个类中的函数访问。这些函数提供了对象数据和程序之间的接口。防止数据被程序直接访问的概念被称为“数据隐藏”。
抽象是指只表达核心的特征而不描述背景细节的行为。类使用抽象概念,并被定义为一系列抽象属性,如尺寸、重量和价格,以及操纵这些属性的函数。类封装了要创建的对象的所有核心属性。因为类使用数据抽象的概念,所以它们被称为抽象数据类型(ADT)。
包装
封装机制将数据和代码绑定在一起,避免了外部干扰和不确定性。它还允许创建对象。简单地说,对象是封装数据和对数据进行操作的代码的逻辑实体。
在一个对象中,一些代码和/或一些数据可以是私有的,不能被外界访问。通过这种方式,对象为内部数据提供了不同级别的保护,以防止程序中不相关的部分意外更改或误用对象的私有部分。
继承
继承是一种允许一种类型的对象获得另一种类型的对象的属性的方法。它支持层次分类的概念。比如知更鸟,既属于鸟,也属于鸟。如图5所示,这种分类的原则是每个子类都具有父类的共同特征。
在OOP中,继承的概念很好地支持了代码的可重用性,也就是说,我们可以在不改变类的情况下向现有的类添加新的特性。这可以通过从这个现有的类派生一个新的类来实现。这个新的类将具有原始类的特征,以及新的特征。继承机制的魅力和强大之处在于,它允许程序员利用现有的类(接近需求的类,而不是完全满足需求的类),并且可以在不影响其他东西的情况下,以某种方式修改这个类。
请注意,每个子类只定义了该类独有的特性。如果没有层次分类,每个类必须明确定义其所有特征。
多态的
多态性是OOP的另一个重要概念。多态意味着事物有不同形式的能力。例如,对于不同的实例,操作可能会有不同的行为。这种行为取决于要操作的数据类型。比如加法运算,如果运算的数据是一个数,它将两个数相加。如果操作的数据是一个字符串,它将连接两个字符串。
图6展示了一个函数处理不同数量和类型的参数。就像一个词在不同的语境中有不同的含义。
多态机制使得不同内部结构的对象可以享受相同的外部接口。这意味着尽管不同对象的具体操作是不同的,但它们(那些操作)可以通过公共类以相同的方式调用。多态性在实现继承的过程中被广泛使用。
面向对象编程语言支持多态,称为“一个接口多个方法”。简单地说,多态允许通过同一个接口触发一组相关但不同的动作,这可以降低代码的复杂性。在特定的情况下应该采取什么样的行动是由编译器决定的,而不需要程序员的人工干预。
在多功能程序中,许多重要数据被声明为全局变量,以便所有函数都可以访问它们。每个函数都可以有自己的局部变量。全局变量很容易被函数无意中改变。在大型程序中,很难区分每个函数中使用了哪些变量。如果我们需要修改一个外部数据的结构,我们需要修改所有访问这个数据的函数。这很容易导致bug。
结构化编程的另一个严重缺陷是它不能很好地模拟现实世界。这是因为函数是面向过程的,而不是实际对应问题中的每个元素。
面向过程编程的一些特征如下:
强调做(算法);
大程序分成很多小程序,叫做函数;
大多数函数* * *享受全局数据;
开放数据从一个功能流向另一个功能。函数将数据从一种形式转换成另一种形式。
采用自顶向下的编程方法。
动态绑定
绑定是指将过程调用与相应的代码链接起来的行为。动态绑定意味着与给定过程调用相关联的代码只有在运行时才是已知的。它与多态性和遗传密切相关。多态引用的函数调用取决于引用的动态类型。
考虑图6中的“draw”方法。通过继承,每个对象都有这个过程。但是它的算法对于不同的对象是不一样的,所以绘制过程必须在每个类中重新定义。在运行时,将调用与当前引用的对象对应的代码。
信息传递
一个面向对象的程序由许多对象组成,这些对象需要相互通信。因此,在面向对象编程语言中,编程的主要步骤如下:
1.创建定义对象及其行为的类;
2.通过类定义创建对象;
3.在对象之间建立通信。
物体之间通过发送和接收信息进行交流,类似于人与人之间的信息传递。信息传递的概念使得直接模拟现实世界,建立系统通信变得更加容易。
对于一个特定的对象来说,消息是执行某个过程的请求,所以消息的接收对象会调用一个函数(过程)来产生预期的结果。传递的消息的内容包括接收消息的对象的名称、要调用的函数的名称以及必要的信息。
一个对象有一个生命周期。它们可以被创造和毁灭。只要对象还在生命周期中,就可以与它进行通信。
面向对象的优势
OOP有很多优点,对程序员和用户都是如此。面向对象为软件产品扩展和质量保证中的许多问题提供了解决方案。这项技术可以大大提高程序员的工作效率,提高软件质量,降低其维护成本。其主要优点如下:
1,通过继承,可以大大减少冗余代码,扩展现有代码的用途;
2.我们可以在一个标准模块(这里所谓的“标准”是指程序员之间达成的协议)上构建我们的程序,而不必从头开始。这样可以减少软件开发时间,提高生产效率;
3.数据隐藏的概念有助于程序员保护程序免受外部代码的攻击;
4.允许一个对象的多个实例同时存在而互不干扰;
5.允许将问题空间中的对象直接映射到程序中;
6.基于对象的工程可以很容易地分成独立的部分;
7.以数据为中心的设计方法可以让我们掌握可实现模型的更多细节;
8.面向对象的系统可以很容易地从小升级到大;
9.对象与外部系统接口通信中使用的消息传递技术的描述更简单;
10,更方便控制软件复杂度。
当上面提到的所有特性都需要在一个面向对象的系统中有机结合时,它们的相对重要性取决于工程的类型和程序员的偏好。为了获得上述一些优点,必须考虑许多事情。例如,对象库必须是可重用的。技术是不断发展的,现有的产品会更新很快。如果没有实现复用,那么就需要严格的控制和管理。
易于使用的开发软件通常很难编写。面向对象的编程工具有望解决这个问题。
面向对象的编程语言
面向对象技术不是特定语言的特权。像结构化编程一样,OOP概念可以用许多语言实现,比如C和Pascal。但是当程序越做越大的时候,程序设计工作就会变得笨拙和混乱。而一门支持OOP理念的编程语言,可以让一切变得简单。
一门语言必须支持几个主要的OOP概念,才能称之为面向对象。根据支持的OOP特性,语言可以分为以下两类:
1,基于对象的编程语言;
2.面向对象编程语言。
基于对象的编程语言只支持封装和对象标识。
面向对象编程语言支持的重要特性如下:
数据封装
数据隐藏和访问机制
对象的自动初始化和移除
运算符重载
支持对象式编程的语言称为基于对象的编程语言。它们不支持继承和动态绑定。
Ada是一种典型的基于对象的编程语言。
面向对象编程不仅包含了基于对象编程的特点,还支持继承和动态绑定。
面向对象的应用
OOP最有前途的应用领域如下:
1,实时系统;
2.模拟和建模;
3.对象数据库;
4.超文本、超媒体和扩展文本;
5.人工智能和专家系统;
6.神经网络和并行编程;
7、决策支持和办公自动化系统;
8.CIM/CAM/CAD系统