面向过程编程(opp)和面向对象编程(oop)的关系

PHP飞鸟的博客 PHP飞鸟的博客     2022-09-01     422

关键词:

面向过程编程(OPP) 和面向对象编程(OOP)的关系

 原文链接:http://blog.csdn.net/phphot/article/details/3985480


    关于面向过程的编程(OPP)和面向对象的编程(OOP),给出这它们的定义的人很多,您可以从任何资料中找到很专业的解释,但以我的经验来看,讲的相对枯燥一点,不是很直观。除非您已经有了相当的积累,否则说起来还是比较费劲。

我是个老程序员出身,虽然现在的日常工作更多倾向了管理,但至今依然保持编码的习惯,这句话什么意思呢?我跟大家沟通应该没有问题。无论你是在重复 我走过的路,或者已经走在了我的前面,大家都会有那么一段相同的经历,都会在思想层面上有一种理解和默契,所以我还是会尽量按照大多数人的常规思维写下 去。

面向过程的编程(OPP)产生在前,面向对象的编程(OOP)产生在后,所以面向对象的编程(OOP)一定会继承前者的一些优点,并摒弃前者存在的 一些缺点,这是符合人类进步的自然规律。两者在各自的发展和演变过程中,一定会相互借鉴,相互融合,吸收对方的优点,从而出现某些方面的趋同性。但是,即 使两者有更多的相似点,也不会改变它们本质上的不同,因为它们的出发点不同,完全是两种截然不同的思维方式。关于两者的关系,我的观点是这样的:面向对象 编程(OOP)在局部上一定是面向过程(OP)的,面向过程的编程(OPP)在整体上应该借鉴面向对象(OO)的思想。这一段说的的确很空洞,而且也一定 会有引来争议,不过,我劝您还是在阅读了后面的内容之后,再来评判我观点的正确与否。

象C++、C#、Java等都是面向对象的语言,c,PHP(暂且这么说,因为php4以后就支持OO)都是面向过程的语言,那么是不是我用C++ 写的程序一定就是面向对象,用c写的程序一定就是面向过程呢?这种观点显然是没有真正吃透两者的区别。语言永远是一种工具,前辈们每创造出来的一种语言, 都是你用来实现想法的利器。我觉得好多人用C#,Java写出来的代码,要是仔细看看,那实际就是用面向对象(OO)的语言写的面向过程(OP)的程序。

所以,即使给关羽一根木棍,给你一杆青龙偃月刀,他照样可以打得你满头是包。你就是扛着个偃月刀,也成不了关羽,因为你缺乏关羽最本质的东西---绝世武功。同样的道理,如果你没有领会OO思想,怎么可能写得出真正的OO程序呢?

那是不是面向过程就不好,也没有存在的必要了?我从来没有这样说过。事实上,面向过程的编程(OPP)已经存在了几十年了,现在依然有很多人在使 用。它的优点就是逻辑不复杂的情况下很容易理解,而且运行效率远高于面向对象(OO)编写的程序。所以,系统级的应用或准实时系统中,依然采用面向过程的 编程(OPP)。当然,很多编程高手以及大师级的人物,他们由于对于系统整体的掌控能力很强,也喜欢使用面向过程的编程(OPP),比如像 Apache,QMail,PostFix,ICE等等这些比较经典的系统都是OPP的产物。象php这些脚本语言,主要用于web开发,对于一些业务逻 辑相对简单的系统,也常使用面向过程的编程(OPP),这也是php无法跨入到企业级应用开发的原因之一,不过php5目前已经能够很好的支持OO了。

 

2.4 详解面向过程的编程(OPP)

  在面向对象出现之前,我们采用的开发方法都是面向过程的编程(OPP)。面向过程的编程中最常用的一个分析方法是“功能分解”。我们会把用户需求先分解成 模块,然后把模块分解成大的功能,再把大的功能分解成小的功能,整个需求就是按照这样的方式,最终分解成一个一个的函数。这种解决问题的方式称为“自顶向 下”,原则是“先整体后局部”,“先大后小”,也有人喜欢使用“自下向上”的分析方式,先解决局部难点,逐步扩大开来,最后组合出来整个程序。其实,这两 种方式殊路同归,最终都能解决问题,但一般情况下采用“自顶向下”的方式还是较为常见,因为这种方式最容易看清问题的本质。

我举个例子来说明面向过程的编程方式:

用户需求:老板让我写个通用计算器。

最终用户就是老板,我作为程序员,任务就是写一个计算器程序。OK,很简单,以下就是用C语言完成的计算器:

假定程序的文件名为:main.c。

int main(int argc, char *argv[]){

    //变量初始化
    int nNum1,nNum2;
    char cOpr;
    int nResult;
    nNum1 = nNum2 = 0;
    cOpr = 0;
    nResult = 0;

    //输入数据
    printf("Please input the first number:/r/n");
    scanf("%d",&nNum1);
    printf("Please input the operator:/r/n");
    scanf("%s",&cOpr);
    printf("Please input the second number:/r/n");
    scanf("%d",&nNum2); 

    //计算结果  
    if( cOpr == ‘+‘ ){
    nResult = nNum1 + nNum2;
    }else if( cOpr == ‘-‘ ){
    nResult = nNum1 - nNum2;
    }else{
    printf("Unknown operator!");
    return -1;
    }

    //输出结果
    printf("The result is %d!",nResult);
    return 0;
}

 

抛开细节不讲,我想大多数人差不多都会这么实现吧,很清晰,很简单,充分体现了“简单就是美”的原则,面向过程的编程就是这样有条理的按照顺序来逐步实现用户需求。

凡是做过程序的人都知道,用户需求从来都不会是稳定的,最多只能够做到“相对稳定”。用户可能会随时提出加个功能,减个功能的要求,也可能会要求改 动一下流程,程序员最烦的就是频繁地变动需求,尤其是程序已经写了大半了,但这种情况是永远无法避免的,也不能完全归罪到客户或者需求分析师。

以我们上面的代码为例,用户可能会提出类似的要求:
首先,你程序中实现了“加法”和“减法”,我还想让它也能计算“乘法”、“除法”。
其次,你现在的人机界面太简单了,我还想要个Windows计算器的界面或者Mac计算器的界面。

用户需求开始多了,我得琢磨琢磨该如何去写这段代码了。我今天加了“乘”“除”的运算,明天保不齐又得让我加个“平方”、“立方”的运算,这要是把 所有的运算都穷尽了,怎么也得写个千八百行代码吧。还有,用户要求界面能够更换,还得写一大堆界面生成的代码,又得来个千八百行。以后,这么多代码堆在一 起,怎么去维护,找个变量得半天,看懂了代码得半天,万一不小心改错了,还得调半天。另外,界面设计我也不擅长,得找个更专业的人来做,做完了之后再加进 来吧。这个过程也就是“软件危机”产生的过程。伴随着软件广泛地应用于各个领域,软件开发的规模变得越来越大,复杂度越来越高,而其用户的需求越来越不稳 定。

根据用户提出的两个需求,面向过程的编程该如何去应对呢?我想大家都很清楚怎么去改。Very easy,把“计算”和“界面”分开做成两个独立的函数,封装到不同的文件中。
假定程序的文件名为:main.c。

#include "interface.h"
#include "calculate.h"
int main(int argc, char *argv[]){

    //变量初始化
    int nNum1,nNum2;
    char cOpr;
    int nResult;
    nNum1 = nNum2 = 0;
    cOpr = 0;
    nResult = 0;

    //输入数据
    if( getParameters(&nNum1,&nNum2,&cOpr) == -1 )
    return -1;

    //计算结果  
    if( calcMachine(nNum1,nNum2,cOpr,&nResult) == -1 )
    return -1;

    //输出结果
    printf("The result is %d!",nResult);

    return 0;
}

interface.h:
int getParameters(int *nNum1,int * nNum2,char *cOpr);

interface.c:
int getParameters(int *nNum1,int * nNum2,char *cOpr){
    printf("Please input the first number:/r/n");
    scanf("%d",nNum1);
    printf("Please input the operator:/r/n");
    scanf("%s",cOpr);
    printf("Please input the second number:/r/n");
    scanf("%d",nNum2);

    return 0;
}

calculate.h:
int calcMachine(int nNum1,int nNum2,char cOpr, int *nResult);

calculate.c:
int calcMachine(int nNum1,int nNum2,char cOpr,int *nResult){
    if( cOpr == ‘+‘ ){
        *nResult = nNum1 + nNum2;
    }else if( cOpr == ‘-‘ ){
        *nResult = nNum1 - nNum2;
    }else{
        printf("Unknown operator!");
        return -1;
    };
    return 0;
}

“计算”和“界面”分开之后,添加新功能或者修改bug就方便多了,遇到与“计算”相关的需求就去修改calculate模块,遇到与“界面”相关的需求就去修改interface模块,因此,整个系统模块之间的“耦合度”就被放松了,可维护性有了一定程度的改善。

面向过程的编程(OPP)就是将用户需求进行“功能分解”。把用户需求先分解成模块(.h,.c),再把模块(.h,.c)分解成大的功能(function),然后把大的功能(function)分解成小的功能(function),如此类推。

功能分解是一项很有技术含量的工作,它不仅需要分解者具有丰富的实战经验,而且需要科学的理论作为指导。如何分解,分解原则是什么,模块粒度多大合适?这些都是架构师的要考虑的问题,也是我们后面要着重讲的内容。

面向过程的编程(OPP)优点是程序顺序执行,流程清晰明了。它的缺点是主控程序承担了太多的任务,各个模块都需要主控程序进行控制和调度,主控和模块之间的承担的任务不均衡。
有的人把面向过程定义为:算法 + 数据结构,我觉得也很准确。面向过程的编程中算法是核心,数据处于从属地位,数据随算法而流动。所以采用面向过程的方式进行编程,一般在动手之前,都要编写一份流程图或是数据流图。

 

面向对象编程(oop)和面向过程编程

面向对象与面向过程  1、二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为。面向对象,将功能封装进对象,强调具备功能的对象。  2、面向对象更加强调运用人类在日志的思维逻辑中... 查看详情

面向对象(oop)基本概念(代码片段)

面向对象编程--ObjectOrientedProgramming简称OOP目标了解面向对象基本概念0.1面向对象基本概念面向过程和面向对象,是两种不同的编程方式对比面向过程的特点,可以更好第了解什么是面向对象1.1过程和函数过程是早期的一个编程概... 查看详情

java步入oop面向对象

面向对象编程OOPObject OrientedProgramming面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看... 查看详情

面向对象编程(上)(代码片段)

第四章面向对象编程(上)4.1面向对象(OOP)和面向过程(POP)4.2Java语言的基本元素:类和对象4.3对象的创建和使用4.1面向对象(OOP)和面向过程(POP)面向对象和面向过程二者都是一种思想,面向对象是相对于面向过程而... 查看详情

2021年最新python讲义:面向对象(oop)基本概念(代码片段)

面向对象(OOP)基本概念面向对象编程——ObjectOrientedProgramming简写OOP目标了解面向对象基本概念01.面向对象基本概念我们之前学习的编程方式就是面向过程的面相过程和面相对象,是两种不同的编程方式对比面向过程的特点... 查看详情

python面向对象:面向对象(oop)基本概念类和对象基础语法封装案例私有属性和私有方法(代码片段)

一、面向对象(OOP)基本概念面向对象编程——ObjectOrientedProgramming简写OOP目标了解面向对象基本概念01.面向对象基本概念我们之前学习的编程方式就是面向过程的面相过程和面相对象,是两种不同的编程方式对比面向过程的特... 查看详情

第四章面向对象编程(上)(代码片段)

第四章面向对象编程(上)4.1面向对象(OOP)和面向过程(POP)4.2Java语言的基本元素:类和对象4.3对象的创建和使用4.1面向对象(OOP)和面向过程(POP)面向对象和面向过程二者都是一种思想,面向对象是相对于面向过程而... 查看详情

面向对象oop

[面向对象编程OOP] 1语言的分类面向机器:汇编语言面向过程:c语言面向对象:c++JavaPHP等 2面向过程与面向对象面向过程:专注于如何去解决一个问题的过程,编程特点是一个函数去实现过程操作,没有类与对象的概念面... 查看详情

面向对象编程oop(代码片段)

这节讲一下,什么是面向对象(ObjectOrientedProgramming)。说面向对象之前,我们不得不提的是面向过程(ProcessOrientedProgramming),C语言就是面向过程的语言,这两者的区别在哪呢?我们可以设想一个情景——厨房做菜:以面向过程的... 查看详情

面向对象编程objectorientedprogramming(oop)

...序的基本单元,一个对象包含了数据和操作数据的函数。面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块... 查看详情

atitit面向对象编程(oop)面向组件编程(cop)面向方面编程(aop)和面向服务编程(sop)的区别和联系

Atitit面向对象编程(OOP)、面向组件编程(COP)、面向方面编程(AOP)和面向服务编程(SOP)的区别和联系1. 面向组件编程(COP)所以,组件比起对象来的进步就在于通用的规范的引入。通用规范往往能够为组件添加新的能... 查看详情

面向对象简介(代码片段)

一、学习目标1.面向对象的技术语法2.面向对象的编程思想二、面向对象的概念OOP(Object-Programming,面向对象的编程)技术为编程人员敞开了一扇大门,使其编程的代码更简洁、更易于维护,并且具有更强的可重用性。三、OOP达到了... 查看详情

面向对象

一、面向过程面向过程(ProcedureOriented),是一种以过程为中心的编程思想,注重业务的“过程”,过程中你是参与者。1.以事件为中心的编程思想;2.分析出解决问题所需要的步骤;3.用函数(最小单位)把这些步骤一步一步事... 查看详情

[6]面向对象编程

[6]面向对象编程面向对象编程——ObjectOrientedProgramming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。面向过程的程序设计把计算机程序视为一系列的命令集合,即一组... 查看详情

面向对象

概述面向过程:根据业务逻辑从上到下写垒代码函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可面向对象:对函数进行分类和封装,让开发“更快更好更强...”    在之前已经接触过了面向过程... 查看详情

面向对象编程(oop)

面向对象编程(OOP)Java是一个支持并发、基于类和面向对象的计算机编程语言。下面列出了面向对象软件开发的优点:代码开发模块化,更易维护和修改。代码复用。增强代码的可靠性和灵活性。增加代码的可理解性。面向对... 查看详情

python入门-6面向对象编程:01面向对象和面向过程区别-对象的进化

面向对象:  面向对象(ObjectorientedProgramming,OOP)编程的思想主要是针对大型软件设计而来的。面向对象编程使程序的扩展性更强、可读性更好,使的编程可以像搭积木一样简单。  面向对象编程将数据和操作数据相关的... 查看详情

8--oop

oop-Python面向对象Python的面向对象面向对象编程基础共有私有继承组合,Mixin魔法函数魔法函数概述构造类魔法函数运算类魔法函数1.面向对象概述(ObjectOriented,00)OOP思想几个名词OO:面向对象OOA:面向对象的分析OOD:面向对象的... 查看详情