面向对象与面向过程的优缺点

面向过程 

  优势:性能比面向对象高,由于类调用时须要实例化,开销比较大,比较消耗资源;好比单片机、嵌入式开发、Linux/Unix等通常采用面向过程开发,性能是最重要的因素。 

  缺点:没有面向对象易维护、易复用、易扩展 

  面向对象 

  优势:易维护、易复用、易扩展,因为面向对象有封装、继承、多态性的特性,能够设计出低耦合的系统,使系统更加灵活、更加易于维护 

  缺点:性能比面向过程低 

  面向对象程序设计的一些显著的特性包括: 

  .程序设计的重点在于数据而不是过程; 

  .程序被划分为所谓的对象; 

  .数据结构为表现对象的特性而设计; 

  .函数做为对某个对象数据的操做,与数据结构紧密的结合在一块儿; 

  .数据被隐藏起来,不能为外部函数访问; 

  .对象之间能够经过函数沟通; 

  .新的数据和函数能够在须要的时候垂手可得的添加进来; 

  .在程序设计过程当中遵循由下至上(bottom-up)的设计方法。 

  面向对象程序设计在程序设计模式中是一个新的概念,对于不一样的人可能意味着不一样的内容。咱们对面向对象程序设计的定义是"面向对象程序设计是一种方法,这种方法为数据和函数提供共同的独立内存空间,这些数据和函数能够做为模板以便在须要时建立相似模块的拷贝。这样的程序设计方法称为面向对象程序设计。" 

  从以上定义能够看到,一个对象被认为是计算机内存中的一个独立区间,在这个区间中保存着数据和可以访问数据的一组操做。由于内存区间是相互独立的,因此对象能够不经修改就应用于多个不一样的程序中。 

  什么是面向对象程序设计? 

  面向对象程序设计(OOP)技术汲取告终构化程序设计中好的思想,并将这些思想与一些新的、强大的理念相结合,从而给你的程序设计工做提供了一种全新的方法。一般,在面向对象的程序设计风格中,你会将一个问题分解为一些相互关联的子集,每一个子集内部都包含了相关的数据和函数。同时,你会以某种方式将这些子集分为不一样等级,而一个对象就是已定义的某个类型的变量。当你定义了一个对象,你就隐含的建立了一个新的数据类型。 

  对象 

  在一个面向对象的系统中,对象是运行期的基本实体。它能够用来表示一我的或者说一个银行账户,一张数据表格,或者其它什么须要被程序处理的东西。它也能够用来表示用户定义的数据,例如一个向量,时间或者列表。在面向对象程序设计中,问题的分析通常以对象及对象间的天然联系为依据。如前所述,对象在内存中占有必定空间,而且具备一个与之关联的地址,就像Pascal中的record和 C中的结构同样。 

  当一个程序运行时,对象之间经过互发消息来相互做用。例如,程序中包含一个"customer"对象和一个 "account"对象,而customer对象可能会向account对象发送一个消息,查询其银行账目。每一个对象都包含数据以及操做这些数据的代码。即便不了解彼此的数据和代码的细节,对象之间依然能够相互做用,所要了解的只是对象可以接受的消息的类型,以及对象返回的响应的类型,虽然不一样的人会以不一样的方法实现它们。 

  类 

  咱们刚才提到,对象包含数据以及操做这些数据的代码。一个对象所包含的全部数据和代码能够经过类来构成一个用户定义的数据类型。事实上,对象就是类类型(class type)的变量。一旦定义了一个类,咱们就能够建立这个类的多个对象,每一个对象与一组数据相关,而这组数据的类型在类中定义。所以,一个类就是具备相同类型的对象的抽象。例如,芒果、苹果和桔子都是fruit类的对象。类是用户定义的数据类型,但在一个程序设计语言中,它和内建的数据类型行为相同。好比建立一个类对象的语法和建立一个整数对象的语法如出一辙。 

  数据抽象和封装 

  把数据和函数包装在一个单独的单元(称为类)的行为称为封装。数据封装是类的最典型特色。数据不能被外界访问,只能被封装在同一个类中的函数访问。这些函数提供了对象数据和程序之间的接口。避免数据被程序直接访问的概念被称为"数据隐藏"。 

  抽象指仅表现核心的特性而不描述背景细节的行为。类使用了抽象的概念,而且被定义为一系列抽象的属性如尺寸、重量和价格,以及操做这些属性的函数。类封装了将要被建立的对象的全部核心属性。由于类使用了数据抽象的概念,因此它们被称为抽象数据类型(ADT)。 

  封装 

  封装机制将数据和代码捆绑到一块儿,避免了外界的干扰和不肯定性。它一样容许建立对象。简单的说,一个对象就是一个封装了数据和操做这些数据的代码的逻辑实体。 

  在一个对象内部,某些代码和(或)某些数据能够是私有的,不能被外界访问。经过这种方式,对象对内部数据提供了不一样级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。 

  继承 

  继承是可让某个类型的对象得到另外一个类型的对象的属性的方法。它支持按级分类的概念。例如,知更鸟属于飞鸟类,也属于鸟类。这种分类的原则是,每个子类都具备父类的公共特性。 

  在 OOP中,继承的概念很好的支持了代码的重用性(reusability),也就是说,咱们能够向一个已经存在的类中添加新的特性,而没必要改变这个类。这能够经过从这个已存在的类派生一个新类来实现。这个新的类将具备原来那个类的特性,以及新的特性。而继承机制的魅力和强大就在于它容许程序员利用已经存在的类(接近须要,而不是彻底符合须要的类),而且能够以某种方式修改这个类,而不会影响其它的东西。 

  注意,每一个子类只定义那些这个类所特有的特性。而若是没有按级分类,每类都必须显式的定义它全部的特性。 

  多态 

  多态是OOP的另外一个重要概念。多态的意思是事物具备不一样形式的能力。举个例子,对于不一样的实例,某个操做可能会有不一样的行为。这个行为依赖于所要操做数据的类型。好比说加法操做,若是操做的数据是数,它对两个数求和。若是操做的数据是字符串,则它将链接两个字符串。 

  多态机制使具备不一样内部结构的对象能够共享相同的外部接口。这意味着,虽然针对不一样对象的具体操做不一样,但经过一个公共的类,它们(那些操做)能够经过相同的方式予以调用。多态在实现继承的过程当中被普遍应用。 

  面向对象程序设计语言支持多态,术语称之为"one interface multiple method(一个接口,多个实现)"。简单来讲,多态机制容许经过相同的接口引起一组相关但不相同的动做,经过这种方式,能够减小代码的复杂度。在某个特定的状况下应该做出怎样的动做,这由编译器决定,而不须要程序员手工干预。 

  在多函数程序中,许多重要的数据被声明为全局变量,这样它们才能够被全部的函数访问。每一个函数又能够具备它本身的局部变量。全局变量很容易被某个函数不经意之间改变。而在一个大程序中,很难分辨每一个函数都使用了哪些变量。若是咱们须要修改某个外部数据的结构,咱们就要修改全部访问这个数据的函数。这很容易致使bug的产生。 

  在结构化程序设计中,另外一个严重的缺陷是不能很好的模拟真实世界的问题。这是由于函数都是面向过程的,而不是真正的对应于问题中的各个元素。 

  面向过程的程序设计的一些特色以下 

  .强调作(算法); 

  .大程序被分隔为许多小程序,这些小程序称为函数; 

  .大多数函数共享全局数据; 

  .数据开放的由一个函数流向另外一个函数。函数把数据从一种形式转换为另外一种形式。 

  采用由上至下的程序设计方法。 

  动态绑定 

  绑定指的是将一个过程调用与相应代码连接起来的行为。动态绑定的意思是,与给定的过程调用相关联的代码只有在运行期才可知。它与多态和继承的联系极为紧密。一个多态引用的函数调用决定于这个引用的动态类型。 

  消息传递 

  一个面向对象的程序由许多对象组成,这些对象之间须要相互沟通。所以,在面向对象程序设计语言中,程序设计的主要步骤以下: 

  一、建立类,这些类定义了对象及其行为; 

  二、由类定义建立对象; 

  三、创建对象之间的通信。 

  对象之间经过收发信息相互沟通,这一点相似于人与人之间的信息传递。信息传递的概念使得真实世界的直接模拟更易于和创建系统交流。 

  对于某个特定对象来讲,消息就是请求执行某个过程,所以,消息的接收对象会调用一个函数(过程),以产生预期的结果。传递的消息的内容包括接收消息的对象的名字,须要调用的函数的名字,以及必要的信息。 

  对象就有一个生命周期。它们能够被建立和销毁。只要对象正处于其生存期,就能够与其进行通信。 

  OOP的优势 

  OOP具备许多优势,不管是对于程序设计者或者用户来讲都是如此。面向对象为软件产品扩展和质量保证中的许多问题提供了解决办法。这项技术可以大大提升程序员的生产力,并可提升软件的质量以及下降其维护费用。其主要的优势陈列于下: 

  一、经过继承,咱们能够大幅减小多余的代码,并扩展示有代码的用途; 

  二、咱们能够在标准的模块上(这里所谓的"标准"指程序员之间彼此达成的协议)构建咱们的程序,而没必要一切从头开始。这能够减小软件开发时间并提升生产效率; 

  三、数据隐藏的概念帮助程序员们保护程序免受外部代码的侵袭; 

  四、容许一个对象的多个实例同时存在,并且彼此之间不会相互干扰; 

  五、容许将问题空间中的对象直接映射到程序中; 

  六、基于对象的工程能够很容易的分割为独立的部分; 

  七、以数据为中心的设计方法容许咱们抓住可实现模型的更多细节; 

  八、面向对象的系统很容易从小到大逐步升级; 

  九、对象间通信所使用的消息传递技术与外部系统接口部分的描述更简单; 

  十、更便于控制软件复杂度。 

  当须要将以上所说的全部特性有机的结合于一个面向对象系统中,它们之间的相对重要性就取决于工程的类型和程序员的喜爱。为了得到上述的某些优点,必须考虑不少事情。例如,对象库必须能够被重用。技术还在不停的发展,现有的产品也会很快的更新换代。若是重用没有可以实现,那么就须要进行严格的控制和管理。 

  易于使用的开发软件每每难以编写。面向对象程序设计工具备望解决这个问题。 

  面向对象程序设计语言 

  面向对象技术并非某个特定语言的特权。如同结构化程序设计同样,OOP概念能够在不少语言好比C和Pascal中实现。可是,当程序愈来愈大时,程序设计工做会变得拙劣而混乱。而一个支持OOP概念的程序设计语言则可让一切变得简单。 

  一个语言必须支持几个主要的OOP概念才能称其是面向对象的。根据所支持的OOP特性,语言能够分为如下两类: 

  一、基于对象的程序设计语言; 

  二、面向对象的程序设计语言。 

  基于对象的程序设计语言仅支持封装和对象辨识。 

  一个面向对象的程序设计语言所要支持的重要特性以下: 

  .数据封装 

  .数据隐藏和访问机制 

  .对象的自动初始化和清除 

  .操做符重载 

  支持对象风格程序设计的语言称为基于对象的程序设计语言。它们不支持继承和动态绑定。 

  Ada就是一个典型的基于对象的程序设计语言。 

  面向对象的程序设计不只仅包含基于对象程序设计的特性,还支持继承和动态绑定。 

  OOP的应用 

  OOP最有前途的应用领域以下: 

  一、实时系统; 

  二、仿真和建模; 

  三、面相对象数据库; 

  四、超文本、超媒体和扩展文本; 

  五、AI和专家系统; 

  六、神经网络和并行程序设计; 

  七、决策支持和办公自动化系统; 

  八、CIM/CAM/CAD系统。 

  Via 

  业务逻辑比较简单的适合用面向过程,例如统计当前在线用户数,一条SQL语句就能够搞定的没有多大必要用面向对象,也没有必要用什么设计模式,那样就是简单问题复杂化了。 

  业务逻辑比较复杂的适合用面向对象,这样当需求有变化时,维护起来会比较方便。 

  面向对象的局部是面向过程的,好比某个类里面某个方法里面实际就是面向过程的,而面向过程会借用面向对象的一些优势来进行优化。 程序员

相关文章
相关标签/搜索