`
lovnet
  • 浏览: 6717924 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

面向对象程序设计与面向过程程序设计解析

 
阅读更多

昨天晚上在知乎看到这个问题,一时还真说不太清。之前一直用JAVA和Android做开发,最近在维护一个老的项目,是用VB开发的,代码超过十个年头了,接触了一段时间。对面向过程和面向对象都有所涉及,在这里这个小结(有些是在网上收集的)

自己的理解:
面向过程是一种以事件为中心的编程思想,以功能(行为)为导向,按模块化的设计,就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,实现的时候一个一个依次调用就可以了
面向对象是一种以事物为中心的编程思想,以数据(属性)为导向,将具有相同一个或者多个属性的物体抽象为“类”,将他们包装起来;而有了这些数据(属性)之后,我们再考虑他们的行为(对这些属性进行怎样的操作),是把构成问题的事物分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。面向对象的技术,是一种以对象为基础,以事件或消息来驱动对象执行处理的程序设计技术。它具有封装性,继承性以及多态性。

知乎网友rlei;

面向对象编程强调“封装”,“继承“和“多态”。数据和与数据相关的操作被包装成对象(严格的说是“类”),每一种对象是相对完整和独立的。对象可以有派生的类型,派生的类型可以覆盖(或重载)原本已有的操作。所有的这些,是为了达成更好的内聚性,即一种对象做好一件(或者一类相关的)事情,对象内部的细节外面世界不关心也看不到;以及降低耦合性,即不同种类的对象之间相互的依赖尽可能降低。而所有的这些,都有助于达成一个崇高的目标,就是可复用性。别人写出来的东西,你可以简简单单拿过来用,还可以加以发展,这不是一个很美好的世界吗?

精讲

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

面向过程

面向过程的程序设计是一种自上而下的设计方法,设计者用一个main函数概括出整个应用程序需要做的事,而main函数由对一系列子函数的调用组成。对于main中的每一个子函数,都又可以再被精炼成更小的函数。重复这个过程,就可以完成一个过程式的设计。其特征是以函数为中心,用函数来作为划分程序的基本单位,数据在过程式设计中往往处于从属的位置。
  
  面向过程式设计的优点是易于理解和掌握,这种逐步细化问题的设计方法和大多数人的思维方式比较接近。
  
  然而,过程式设计对于比较复杂的问题,或是在开发中需求变化比较多的时候,往往显得力不从心。这是因为过程式的设计是自上而下的,这要求设计者在一开始就要对需要解决的问题有一定的了解。在问题比较复杂的时候,要做到这一点会比较困难,而当开发中需求变化的时候,以前对问题的理解也许会变得不再适用。事实上,开发一个系统的过程往往也是一个对系统不断了解和学习的过程,而过程式的设计方法忽略了这一点。
  
  在面向过程式设计的语言中,一般都既有定义数据的元素,如C语言中的结构,也有定义操作的元素,如C语言中的函数。这样做的结果是数据和操作被分离开,容易导致对一种数据的操作分布在整个程序的各个角落,而一个操作也可能会用到很多种数据,在这种情况下,对数据和操作的任何一部分进行修改都会变得很困难。
  
  在面向过程式设计中,main()函数处于一个非常重要的地位。设计者正是在main()函数中,对整个系统进行一个概括的描述,再以此为起点,逐步细化出整个应用程序。然而,这样做的一个后果,是容易将一些较外延和易变化的逻辑(比如用户交互)同程序的核心逻辑混淆在一起。假设我们编写一个图形界面的计算器程序和一个命令行界面的计算器程序,可以想象这两个版本的main()函数会有很大的差异,由此衍生出来的程序很有可能也会迥然不同,而这两个版本的程序本应该有很大部分可以共用才对。
  
  面向过程式设计还有一个问题就是其程序架构的依赖关系问题。一个典型的过程式程序往往如Figure 1所示:
  

 
  Figure 1
  
  图中的箭头代表了函数间的调用关系,也是函数间的依赖关系。如图所示,main()函数依赖于其子函数,这些子函数又依赖于更小的子函数,而在程序中,越小的函数处理的往往是细节实现,这些具体的实现,又常常变化。这样的结果,就是程序的核心逻辑依赖于外延的细节,程序中本来应该是比较稳定的核心逻辑,也因为依赖于易变化的部分,而变得不稳定起来,一个细节上的小小改动,也有可能在依赖关系上引发一系列变动。可以说这种依赖关系也是过程式设计不能很好处理变化的原因之一,而一个合理的依赖关系,应该是倒过来,由细节实现依赖于核心逻辑才对。
  
  面向对象设计
  
  面向对象是一种自下而上的程序设计方法。不像过程式设计那样一开始就要用main概括出整个程序,面向对象设计往往从问题的一部分着手,一点一点地构建出整个程序。面向对象设计以数据为中心,类作为表现数据的工具,是划分程序的基本单位。而函数在面向对象设计中成为了类的接口。
  
  面向对象设计自下而上的特性,允许开发者从问题的局部开始,在开发过程中逐步加深对系统的理解。这些新的理解以及开发中遇到的需求变化,都会再作用到系统开发本身,形成一种螺旋式的开发方式。(在这种开发方式中,对于已有的代码,常需要运用Refactoring技术来做代码重构以体现系统的变化。)
  
  和函数相比,数据应该是程序中更稳定的部分,比如,一个网上购物程序,无论怎么变化,大概都会处理货物、客户这些数据对象。不过在这里,只有从抽象的角度来看,数据才是稳定的,如果考虑这些数据对象的具体实现,它们甚至比函数还要不稳定,因为在一个数据对象中增减字段在程序开发中是常事。因此,在以数据为中心构建程序的同时,我们需要一种手段来抽象地描述数据,这种手段就是使用函数。在面向对象设计中,类封装了数据,而类的成员函数作为其对外的接口,抽象地描述了类。用类将数据和操作这些数据的函数放在一起,这可以说就是面向对象设计方法的本质。
  
  在面向对象设计中类之间的关系有两种:客户(Client)关系和继承(Inheritance)关系。客户关系如Figure 2所示,表示一个类(Client)会使用到另一个类(Server)。一般将这种关系中的Client类称为客户端,Server类称为服务器
    
  Figure 2
  
  继承关系如Figure 3所示,表示一个类(Child)对另一个类(Parent)的继承。一般将这种关系中的Parent类称为父类,Child类称为子类。
    
  Figure 3
  
  面向对象设计的过程就是将各个类按以上的两种关系组合在一起,这两种关系都非常简单,不过组合在一起却能提供强大的设计能力。下面介绍如何利用这两种关系来划分程序的不同模块。
  
  在很多应用中,我们都需要将数据存储到数据库中。一个常见的解决手段是使用分层的方法,将程序分为应用层和存储层,Figure 4中是这种方法一个不太成熟的设计:
    
  Figure 4
  
  Application代表应用层的逻辑,DB代表了数据库访问的逻辑,在这个设计中,Application直接调用了DB的服务来将数据存储到数据库中。这样做的缺点是Application对DB有了依赖关系,一旦DB有了任何变化,Application都有可能会受其影响需要改动。当然,如果只是两个类的话,这种依赖关系根本算不上什么问题,然而,我们有理由相信,应用层和存储层都会由不只一个类组成,并都有一定的复杂度,这时它们之间的这种依赖关系就会让人头痛了。当程序的模块越来越多,如果不限制它们之间的联系,那模块间的依赖、程序的复杂度和开发维护的难度都会成指数上升。
  
  所幸的是引入面向对象中的继承关系,我们可以解决这一问题,如图Figure 5所示:
    
  Figure 5
  
  Persistence是一个接口,其包含了Application存储所需用到的服务。DB实现了这个接口,Application则调用Persistence中的服务来存储数据,两者都只依赖于Persistence。这样,Application到DB的依赖关系被Persistence这个接口切断了。因为接口中只包含了服务,也就是成员函数的声明,而不包括任何数据和函数的实现,所以Persistence接口的内容会很简单。在Persistence不变的情况下,Application和DB这两个模块都可以自由地进行修改而不影响到对方。就这样,通过在中间插入接口的方法,程序的模块被划分开,依赖关系也变得容易管理的多。
  
  如果从另一个角度来看Figure 4中的设计,应用层是程序的核心部分,而存储层则可以看成是实现的细节,这个设计犯了和过程式设计同样的错误,即核心逻辑依赖于具体的实现细节,这样,当细节变化时,核心逻辑也会受到影响:假如,当我们需要将数据改存到文件或目录服务中时,按照Figure 4中的设计Application模块就难免受到影响。在Figure 5的设计中则没有这一问题:这里我们可以把Application和Persistence看成是程序的核心逻辑,而Persistence接口的实现(DB)可以看成是程序的细节实现,其依赖关系是细节依赖于核心,当细节变化时核心不会受其影响,这才是一个稳定的依赖关系。遵从这一设计,我们可以在不影响程序核心的情况下,为程序添加或更改存储类型,如Figure 6所示:
    
  Figure 6
  
  这里值得注意的是Persistence和Application被划分到了一起,这是因为Persistence中的服务都是根据Application中的需求制定出来的,Persistence和Application的关系比起它和其子类的关系更加紧密。将接口和其调用者放入一个模块是一个常见的做法,当然,也可以将接口单独划分为一个模块,这一般是在有多个不同的调用模块依赖于该接口,或不同模块间需要更清晰的分离时才这样做。

分享到:
评论

相关推荐

    黄维通版 Visaul C++面向对象与可视化程序设计课程实例

    这是黄维通老师编写的《Visual C++面向对象与可视化程序设计》(第二版)课本上的各例题的程序源代码,其中部分例题,本人结合自己学习的体会还进行了少量修改并给出了修改后的程序代码。 供大家参考,希望大家在...

    C++程序设计详解ppt

    C++是近年来国内外广泛使用的现代计算机语言,它既支持面向过程的程序设计,也支持基于对象和面向对象的程序设计。国内许多高校已陆续开设了C++程序设计课程。但是,由于C++涉及概念很多,语法比较复杂,内容...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    8.1 面向对象程序设计方法概述 8.1.1 什么是面向对象的程序设计 8.1.2 面向对象程序设计的特点 8.1.3 类和对象的作用 8.1.4 面向对象的软件开发 8.2 类的声明和对象的定义 8.2.1 类和对象的关系 8.2.2 声明类类型 ...

    Python面向对象编程基础解析(一)

    1.什么是面向对象 面向对象(oop)是一种抽象的方法来理解这个世界,世间万物都可以抽象成一个对象,一切事物都是由...面向对象的程序设计,核心是对象,对象就是特征(变量)与技能(函数)的结合体。  优点:解决

    设计学生学籍管理系统

    PowerBuilder是面向对象的工具,它变革了面向对象技术的使用,并把它应用到用户界面对象中。用户界面的元素都是对象,它们有属性、事件和方法,通过使用这些对象就会大大地缩短应用程序的开发时间。同时,Power...

    C++入门到精通

    阔的从最基本的C++ 程序设计到面向对象程序设计以及基于模板的程序设计面面俱到 而且讲解细致入微值得仔细品味 2 许多实际的范例程序纯粹的技术讲解总是非常枯燥的但是阅读本书并不感觉枯燥 因为作者在介绍每一...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    8.1 面向对象程序设计方法概述 8.1.1 什么是面向对象的程序设计 8.1.2 面向对象程序设计的特点 8.1.3 类和对象的作用 8.1.4 面向对象的软件开发 8.2 类的声明和对象的定义 8.2.1 类和对象的关系 8.2.2 声明类类型 ...

    从面向对象到SOA.rar

    24.2.3 数据结构与算法的面向对象设计 ...... 11 24.3 软件体系结构设计方案 ... 18 24.3.1 确定软件处理流程 .... 19 24.3.2 软件可扩展性 ............ 20 24.3.3 设计用户界面 ............ 21 24.4 规划...

    《Java语言程序设计》课程教学设计方案.doc

    "3 "1 " " " " "第 1 章 Java语言概述 " " " " " " "第 2 章 "3 "1 " " " " "Java开发环境基本知识 " " " " " " "第 3 章 Java语言基础 "3 "2 " " " " "第 4 章 面向对象的程序设计"3 "3 " " " " "第 5 章 异常处理 ...

    Java实验6多线程.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)实验报告,基础篇有JAVA环境搭建、Java语言基础、方法和数组、面向对象基础、Java常用类、继承与接口、成员访问控制与异常、JavaFX程序设计、Java...

    Android程序设计基础

     阅读本书唯一的前提条件,是具备对Java编程或类似面向对象语言(比如说C#)的基本理解,不需要拥有为移动设备开发软件的经验。实际上,如果你确实有这方面的经验,反倒应该忘记它们。Android是如此与众不同,因此...

    Python项目开发实战_银行账户资金交易_编程案例解析实例详解课程教程.pdf

    面向对象程序设计方法是尽可能模拟人类的思维方式,使得软件的开发方法与过程尽可能接近人类认识世界、解决现实问题的方法和过程,也即使得描述问题的问题空间与问题的解决方案空间在结构上尽可能一致,把客观世界中...

    extern c 用法解析

    C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和...但是,C++毕竟是一种面向对象的程序设计语言 ,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同。

    Java高级程序设计实战教程第三章-Java反射机制.pptx

    Java高级程序设计 第3章 Java反射机制 3.1 应用场景 3.2 相关知识3.3 实施过程 3.4 拓展知识3.5 拓展训练 3.6 课后小结3.7 课后习题 3.8 上机实训 Java高级程序设计实战教程第三章-Java反射机制全文共15页,当前为第...

    C++工程师106道面试题总结.pdf

    C++是一种被广泛使用的计算机程序设计语言。它是一种通用程序设计语言,支持多重编程模式,例如过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计和设计模式等

    《软件工程——理论与实践》书本课后答案全

    、选择题 1 软件的主要特性是(A B C)。 A) 无形B) 高成本 C) 包括程序和文档 D) 可独立构成计算机系统 2 软件工程三要素是(C D...5 下列属于面向对象开发方法的是(A B C D)。 A) Booch B) UML C) Coad D) OMT

    邓俊辉数据结构C++语言版第3版 + 习题解析第3版 + 随书代码 高清完整文字版

    《数据结构(C++语言版 第3版)/清华大学计算机系列教材》,主教材按照面向对象程序设计的思想,根据作者多年的教学积累,系统地介绍各类数据结构的功能、表示和实现,对比各类数据结构适用的应用环境;结合实际问题...

    C++_Primer_3E 电子书 高清晰珍藏版

    境中展示出来C++语言的规则比如重载函数调用的解析过程以及在面向对象程序设计下 支持的类型转换本书都有广泛的论述这似乎超出了一本初级读本的范畴我们相信为 了加强读者对于C++语言的理解覆盖这些内容是必要的对于...

Global site tag (gtag.js) - Google Analytics