搜索
bottom↓
回复: 47

面向对象与面向过程的区别?

[复制链接]

出0入0汤圆

发表于 2011-1-2 13:17:07 | 显示全部楼层 |阅读模式
也不知道这个问题该发在那个栏目里了 就发在51栏目里吧  我想很多菜鸟都和我一样 搞不懂面向对象与面向过程的区别 希望老鸟们多多指教;

在百度里搜索里许多帖子,都讲面向对象与面向过程的区别,但是几乎都讲不明白。我想可能这就是搞硬件出身的和搞软件出身的不能融合到一起造成的吧;

我单片机执行是一步一步的执行的。我先去干这个,然后再去干那个,然后就是等待,这个就是面向过程,但是我很难理解面向对象;(本人没有PC机编程经验,就懂得些单片机)

我想好的实例更能说明一切吧。不要举太多例子,就像刚开始学中断,用烧水洗衣服做饭但是我还是花了好久好久才理解明白中断是干什么的,其实如果用最简单的程序举例,或许几行代码就能说清楚了;

这个问题困扰我好久了。希望老鸟们赐教,谢谢~

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-1-2 13:38:28 | 显示全部楼层
你没写过上十万行的程序是不能轻易理解面向对象的意义的…没有OO就没有今天的IT产业…OO是一种思维方法,一种世界观,而不是一类编程语言,用C照样能实现面向对象的设计,只是CPP能从语法层面使得程序更简洁更规范…当你每看到一条狗就开始对它分析如何建立类来描述的时候,你就入门了…推荐一本书,《OOD启思录》…最根本的目的还是代码复用…还有不要认为过程和对象势同水火,所有行为的描述依然是面向过程的,只是通过类的封装来最有效的组织起来,更加容易复用而不需要了解内部实现…再通俗一点就是,面向对象方法为不同的程序员提供了统一的interface,方便了合作与维护,最最通俗的,类就是高级的结构体

出0入0汤圆

 楼主| 发表于 2011-1-2 13:43:48 | 显示全部楼层
回复【1楼】eggcar  八号机
-----------------------------------------------------------------------

楼上的话很有深度,而且也很有意义,谢谢~

还在前半个小时我就一直认为 对象和过程是完全水火的~~

我觉得面向过程的第一步就是 人以类聚物以群居~~然后下一步就不知道了~~呵呵

出0入0汤圆

发表于 2011-1-2 13:52:46 | 显示全部楼层
面向过程就是对过程的描述编程如 做A然后B。。。

而面向对象就是把整个过程要处理的开做对象,编写的是对象与对象的作用。如一个字符串可以看作对象,对他的合并改写等都是对他的操作而已,

出0入0汤圆

 楼主| 发表于 2011-1-2 13:59:27 | 显示全部楼层
回复【3楼】ssaweee  
-----------------------------------------------------------------------

前半句看懂了,而且也理解了。后半句没看懂,也没理解了~~谢谢

出0入0汤圆

发表于 2011-1-2 14:04:57 | 显示全部楼层
回复【4楼】dew2901  测控阿壮
-----------------------------------------------------------------------

形象点说,人是个对象,走路,抬手,写字就是方法,属性有身高体重...
而电脑中一个字符串,一个按钮,一个算法都可以看做一个对象

出0入0汤圆

发表于 2011-1-2 14:11:26 | 显示全部楼层
譬如说你要开公司,创业初期整个公司就两三个人,所有的事都是你这个老板安排做的,后来发展越来越大了,你一个人不可能管理这么大的公司的每一个细节了,于是就成立了各个部门,制定每个部门的指责以及结构,部门下面还可以再设部门,之后需要完成什么任务只需要对各个部门下达命令,或者协调各个部门之间的交流关系,不需要你一步一步告诉他们怎么做,你需要关注更高层面的问题

出0入0汤圆

 楼主| 发表于 2011-1-2 14:16:18 | 显示全部楼层
回复             【5楼】 ssaweee                 【6楼】eggcar  八号机
-----------------------------------------------------------------------

能贴出一点最简单的代码吗~~或者我去哪里可以看到这个麻雀虽小,五脏俱全的代码那~~ 思想我有些理解了~~

出0入0汤圆

发表于 2011-1-2 14:21:24 | 显示全部楼层
关注!!!

出0入0汤圆

 楼主| 发表于 2011-1-2 14:25:27 | 显示全部楼层
回复【8楼】ljc0124  
-----------------------------------------------------------------------

嘿嘿,其实好多人都在思考这个问题,一直没找到这个答案,可能这个真的需要一个过程,我就觉得应该在ourdev能找到答案~

出0入0汤圆

发表于 2011-1-2 14:26:36 | 显示全部楼层
回复【7楼】dew2901  测控阿壮
-----------------------------------------------------------------------

java

public class ren{
int lenth,x,y;
String name;

void method sleep(){
System.out.print("sleep");
}
void method walk(int x,int ,y){
System.out.print("walk to "+x + "." + y);
}
void method jump(int hight){
System.out.print("jump"+hight);
}

String method getName(){
return name;
}


void method main(){//和c一样,主方法

ren r=new ren();
r.walk();
r.sleep();
System.out.print(r.getName());

}

}

出0入134汤圆

发表于 2011-1-2 14:33:20 | 显示全部楼层
最简单的,C#中,定义一个int对象i,它就具有了ToString()方法,而你不需要知道该方法是怎样实现的,并且每个INT对象都有该方法。  
这就是封装吧     新手的理解

出0入4汤圆

发表于 2011-1-2 14:33:24 | 显示全部楼层
懂了6楼的回答。。。

出0入0汤圆

发表于 2011-1-2 14:35:21 | 显示全部楼层
回复【9楼】dew2901 测控阿壮
回复【8楼】ljc0124   
-----------------------------------------------------------------------
嘿嘿,其实好多人都在思考这个问题,一直没找到这个答案,可能这个真的需要一个过程,我就觉得应该在ourdev能找到答案~
-----------------------------------------------------------------------

楼主,你弄个装个VB写个确定按钮就知道什么是面向对象了。

举例都是修个房子:

面向对向是这样的:我要个房子,需要柱子,墙,门,窗。把这些东西想要的颜色,谁和谁连接在一起写出来,具体怎么连编译器会处理。最后,你得了个房子。

面向过程是这样的:我要个房子,那么需要砂子,水泥和一起,浇第一根柱子、第二根柱子。。。四个柱子浇好后,我再浇房顶,房顶好了,我得买些木头,自己做成门窗,最后,我想要什么颜色,再买油漆涂料刷上。最后,你得了个想要的房子。


不知道我这个比喻是否恰当。总之,你弄个VB的书看看,写个小程序就知道了。

出330入0汤圆

发表于 2011-1-2 14:53:40 | 显示全部楼层
任何事物发展到一定程度、到一定的规模就要建立秩序来维系了,这就是系统。
    应用者面向对象、协调对象,对象按既定过程运行。如此一来,就能实现“外行指导内行”了——就像公司发展到一定的规模,老板、CEO完全可以不了解生产过程如何实现,只用安排对象、下达命令即可完成任务、维持整个公司的系统运转。

出0入0汤圆

发表于 2011-1-2 15:17:44 | 显示全部楼层
伪代码更容易理解…
类 狗{
血统;毛色;体长;体重;性别;年龄;
咬();
叫();
摇尾巴();
看门();
睡觉();
}
类 书{
标题;副标题;作者;出版社;出版时间;封面;目录;所属人;……
翻页();
做笔记();
折角();
被偷();
……
}
狗1号=狗.构造函数(萨摩耶,白色,一米,五十斤,母,三岁);
书1号=书.构造函数(……);
以上由两个类狗和书实例化了两个对象狗1号和书1号。
狗1号.睡觉();
书1号.翻页();
这样让两个对象做出了动作。
假如不需要这个对象了,或者说狗死了书卖了,则
狗1号.析构函数();
书1号.析构函数();

出0入0汤圆

发表于 2011-1-2 16:04:03 | 显示全部楼层
蹲着听课

出0入0汤圆

 楼主| 发表于 2011-1-2 16:29:32 | 显示全部楼层
【10楼】 ssaweee    回复【13楼】fsclub  绿林好汉 【14楼】 zcllom 星罗棋布 【15楼】 eggcar 八号机
-----------------------------------------------------------------------------------------------------------

我貌似懂了? 有图有真相

面向过程 ,先有房子这个整体框架,后往里添加东西。??
面向对象,先买材料,再盖房子??




-----------------------------------------------------------------------------------------------------------

我突然想 如果用C语言编一个按钮该如何实现了~是不是多此一举了。

------------------------------------------------------------------------------------------------------------

出0入0汤圆

发表于 2011-1-2 16:46:53 | 显示全部楼层
回复【17楼】dew2901 测控阿壮

我突然想 如果用C语言编一个按钮该如何实现了~是不是多此一举了。
-----------------------------------------------------------------------

可以做个编译器,那玩意是干这活的。

出0入0汤圆

 楼主| 发表于 2011-1-2 16:49:57 | 显示全部楼层
回复【18楼】fsclub  绿林好汉
-----------------------------------------------------------------------

我的理解对了,胡子叔?只是想以后如果有人再不明白这个问题的时候,然后用C语言编一个按钮,和用VB 或者VC编一个按钮对比说明,而且VB或许真的是最好的举例的方法。

谢谢~

出0入0汤圆

发表于 2011-1-2 19:53:15 | 显示全部楼层
笔记~

出0入0汤圆

发表于 2011-1-2 20:23:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-2 20:27:33 | 显示全部楼层
回复【18楼】fsclub  绿林好汉
-----------------------------------------------------------------------

c语言可以用gtk库来写按钮,同样是用结构体来部分模拟对象的

对比的话可以和c++语言在QT下写相对比

对象化的好处是吧方法和变量都捆绑在一起了,而之前全是分开的


还有种编程叫函数式编程,好处是可以减少很多漏洞,代表性的语言是haskel,ml等,linux下的mldonkey电驴就是ml语言写的,微软的f语言也是来自函数式编程。

出0入0汤圆

发表于 2011-1-2 20:59:50 | 显示全部楼层
面向对象很有技巧性,或者说是经验性吧,对类的划分不同严重影响了效果,处理不好比面向过程的还混乱…

出0入0汤圆

发表于 2011-1-2 21:34:41 | 显示全部楼层
现在所有的程序都是面向过程的!有的程序里面使用了所谓的"对象的实例",但是程序的执行还是有过程的,或者说是有逻辑的.小的程序,代码少,就不需要"对象的实例";程序大,功能非常复杂的时候,就需要使用面向对象的方法来解决,因为那样便于管理我们庞大的程序.但是程序一旦变得庞大的时候,我们的处理器的速度也要能够跟上系统实时性的需要,否则一切都是空的.

出0入0汤圆

发表于 2011-1-2 21:37:37 | 显示全部楼层
我理解的是两种概念:例如人喝水
1、面向过程是处理喝的细节,因此整个程序可以看做是动作
2、面向对象是先抽象人和水的特点,然后再用喝建立两者关系,因此整个程序可以看做是关系,有利于代码重用和分析理解

出0入0汤圆

 楼主| 发表于 2011-1-2 21:43:06 | 显示全部楼层
回复【24楼】aoe123  
-----------------------------------------------------------------------

小和大永远是和相对的概念,其实我一直没有办法比较什么叫做小程序和大程序;


就好像有人说如果这个单片机里德小程序直接用

Delay()
{
    for(i = 0; i < 110; i++)
        for(j = 0; j < 20; j++);
}

其实我们这些小鸟根本不知道这个大或者小;


我今天看了我们以前用过的一个程序也是前辈写的 也是用for循环做的延时,前两天在论坛看到说做项目不能这样写,现在都不敢写了。不知道怎么写了~

出0入0汤圆

发表于 2011-1-2 22:24:14 | 显示全部楼层
我也来举个例子,玩过红警,C&C吧,里面的人狗车辆都可以有自己的动作,如果不用OOD,my god

出0入0汤圆

发表于 2011-1-2 22:35:12 | 显示全部楼层
面向对象的方法将程序员分成了两类:一类是编写类的程序员,一些应用程序员。
就好像刚才口上举得VB的例子,微软的程序员已经为你提供了很多类,你只要建立对象修改属性,加入自己的方法就行。
楼上高手说的对,主要的是一种概念,在以前的时期是解决软件危机的很好方法。
作为应用程序员,尽可量的理解OO思想,但是我认为没有很强求。很多程序员都是穿C++的鞋子走C的路子,这也是无可厚非,因为解决问题才是我们的主要目的,毕竟精力有限。

出0入0汤圆

发表于 2011-1-2 22:36:15 | 显示全部楼层
毛虫,C&C是嘛??

出0入0汤圆

发表于 2011-1-2 22:42:52 | 显示全部楼层
回复【29楼】fsclub 绿林好汉
毛虫,c&amp;c是嘛??
-----------------------------------------------------------------------

命令与征服 command and conquer

出0入0汤圆

发表于 2011-1-2 22:54:00 | 显示全部楼层
从这本书
<<面向对象的理论与C++实践>>里摘录一些内容


面向对象在计算机中的含义跟类息息相关
类是面向对象系统中最重要的概念,面向对象程序设计中所有的操作都归结为对
类的操作。。

类与对象的关系:
通常我们把具有同样性质和功能的东西所构成的集合称为类,在C++中可以把具
有相同内部存储结构和相同一组操作的对像看成属于同一类,在指定一个类后,
往往把属于这个类的对像称为类的实例,实际上对象和实例表达的是同一个意思
如何来定义一个具体的对像,也就是使类实例化成为我们所需要的具体事物,实
际上对像的创建过程就是类实例化的过程

创建一个具体对像有两种方法:
(1)在定义类的同时创建对像  我们在给出类定义描述时创建对像如下所示

class date{
             int month,day,year;
     
           public:
             void set(int,int);
             void print();
             int getyear();
             int getmonth();
             int getday();   
          }tt;    //这里同时创建对像tt

在定义类date类的同时创建了data类的对像tt,这时创建的是一个全局对象


(2)在使用时定义对象
上面的在定义类同时创建对像他的生存周期在整个程序过程中一直存在,只有在整个程序结束时才会自动消亡,为了消除这种弊端,可以在需要使用些类对象时,再在使用它的函数中定义对像,格式与一般变量定义相同如
data tt;                                                               
此时定义了tt是data类的一个对像


下面是使用类的例子:

class point{
            int x,y;
          public:
           void setpoint(int vx,int vy) {x=vx;y=vy;}
           };


void f1()
  { point p1;              //创建point类的对像p1
    p1.setpoint(10,10);    //给point类对像p1的私有成员赋值

  }

出0入0汤圆

发表于 2011-1-2 23:51:36 | 显示全部楼层
奶牛挤奶
面向过程:程序员调用函数 milk(),
面向对象初步:生成奶牛对象cow ,调用方法cow.milk
面向对象进一步:考虑职责划分,生成农场主对象和奶牛对象,将挤奶方法划分给农场主

出0入0汤圆

发表于 2011-1-3 01:16:52 | 显示全部楼层
凑热闹
面向对象如把电机抽象出来建立类
建立正转反转刹车加速减速等等的方法。
使用前还得知道电机的大小、功率、方式、交流直流等等的属性。
至于是如何实现正转反转就得进行面向过程来编写了

出0入0汤圆

 楼主| 发表于 2011-1-3 09:08:36 | 显示全部楼层
回复【34楼】hemjidn  
-----------------------------------------------------------------------

恩,你的话我明白了~~~


------------------------------------------------

在网上看到一句话:“有些人打着面向对象的幌子,干着过程编程的勾当。”觉得很精彩,前几楼也有人说穿着C++的鞋子,用C编程~~有共同属性~

出0入0汤圆

发表于 2011-1-3 09:54:43 | 显示全部楼层
面向对象的思想,在你写代码过程中会自然领悟的,最好接个大点的项目,用自己的想法实现之,用C做就行,等你发现C在实现你的项目时的不足时,你就会自然而然的向面向对象上靠了,比如你定义了很多全局变量,没有机制来保护这些全局变量,而且每个全局变量也只是被几个函数访问,基本不可能每个函数都会访问到该变量,那么这个全局变量在外面裸露着放着既不方便找,尤其在代码量大的情况下,看着也不顺眼,要是能和操作它的函数放在一块就好了…

出0入0汤圆

发表于 2011-1-3 09:59:54 | 显示全部楼层
这要看你做什么项目,如果在单片机上做很简单的项目,一个C文件就可以搞定,可能用不着面向对象,要记住:面向对象不等于C++,面向对象可以用任何语言实现,C++也只是面向对象的一种实现,面向对象也不仅仅是类。

出0入0汤圆

发表于 2011-1-3 10:05:31 | 显示全部楼层
既然现在一步一步的弄就能把你的项目实现了就不要考虑面不面向对象了,能实现了确保稳定就行,放手去做更多的项目,在实践中去感悟,面向对象也是在先辈们无数行的编程实践中形成的,先辈们走的弯路你也要体验一下才能真正体会逝者当时的囧境和突破后的豁然开朗,也别怕这个名词,我们大多数情况是被高深玄乎的名词吓倒了,岂不知它就存在于我们的身边。

出0入0汤圆

 楼主| 发表于 2011-1-3 22:22:49 | 显示全部楼层
回复【38楼】xuxi2009
-----------------------------------------------------------------------

谢谢楼上

-----------------------------------------------------------------------
我今天又查了SDK和MFC的区别

原来SDK是用C语言编程

MFC是用C++编程

怪不得有人管VC叫VCC++那,呵呵。孙鑫的教程看了第一章觉得不错~

出0入0汤圆

发表于 2011-1-3 22:29:27 | 显示全部楼层
哦~~~~又顶上来了
不是什么都要玩那概念,结果才是最重要的~~~面向对象编程只是为了更方便实现面向对象分析的结果

出0入0汤圆

发表于 2011-1-4 09:53:00 | 显示全部楼层
这是一种思想,一种概念。。。楼上可能很多人都明白,但是不好表述出来,楼主还是耐心扎进去,有一天会恍然大悟的。。。

出0入0汤圆

发表于 2011-2-21 19:42:11 | 显示全部楼层
所谓的面向过程和面向对象只是思想上概念,与编程语言没有必然的关系。个人理解:
好朋友很久没有见面,突然见面,说好去吃饭。两个选择:
1.两个人做饭,边做边聊。优点:比较安全,也比较放心。缺点:比较麻烦。
2.去饭店,点菜后等待上菜。不用考虑饭菜怎么做出来。优点:省事,缺点:不太安全。
如果还是不能理解,建议先不要抠这个概念了,在逐渐的编程过程中就会有体验了。
华清远见的一个老师写过一篇文章,专门讲解了用C实现面向对象操作的例子,BD一下吧

出0入0汤圆

发表于 2011-2-22 11:38:35 | 显示全部楼层
回复【15楼】eggcar 八号机
伪代码更容易理解…
类 狗{
血统;毛色;体长;体重;性别;年龄;
咬();
叫();
摇尾巴();
看门();
睡觉();
}
类 书{
标题;副标题;作者;出版社;出版时间;封面;目录;所属人;……
翻页();
做笔记();
折角();
被偷();
……
}
狗1号=狗.构造函数(萨摩耶,白色,一米,五十斤,母,三岁);
书1号=书.构造函数(……);
以上由两个类狗和书实例化了两个对象狗1号和书1号。
狗1号.睡觉();
书1号.翻页();
这样让两个对象做出了动作。
假如不需要这个对象了,或者说狗死了书卖了,则
狗1号.析构函数();
书1号.析构函数();

-----------------------------------------------------------------------

书怎么搞个被翻烂的函数啊,被偷多可惜!

出0入0汤圆

发表于 2011-2-22 14:59:51 | 显示全部楼层
一楼的“类就是高级的结构体”,通俗易懂~~

出0入0汤圆

发表于 2011-11-18 20:20:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-4-1 14:26:11 | 显示全部楼层
引用:
初识对象的时候我们还不知道什么是对象

Java的一个重要特点就是面向对象(Object Oriented), 面向对象是相对于面向过程(Process Oriented)来说的。
E:\1.JPG


我们用一个从冰箱中取一杯牛奶的例子来说明面向过程和面向对象的区别。

先用面向过程的思路描述这个过程:
E:\2.JPG



再用面向对象的思路描述这个过程:

E:\3.JPG

我们把冰箱作为一个对象的时候,问题变得异常简单,冰箱有一个方法就是取牛奶的方法,你调用这个方法,这个方法的返回值就是一杯牛奶。那么现实生活中有这样智能的冰箱吗?有的,找个人站冰箱旁边就行了,把那个人和冰箱合起来包装成一个对象它就是智能冰箱对象了^_^ 。

面向对象的编程语言把所有事物都看成对象:万事万物皆对象

出0入0汤圆

发表于 2012-4-2 12:13:43 | 显示全部楼层

很簡單,
以這個為例
Delay(int x)
{
    for(i = 0; i < x; i++)
        for(j = 0; j < 20; j++);
}

假如上面代碼在1M晶體時x=10是1ms,
而你需要從外設讀入一些數據,假如是AD結果吧,
你的外設的轉換時間是10ms,1ms,5ms...
如果你是面對過程,則你會在你需要的地方寫下相似的代碼

START AD1
Delay(100)
READ AD1

...

START AD1
Delay(100)
READ AD1

...
START AD2
Delay(10)
READ AD2

...
START AD2
Delay(10)
READ AD2

...
START AD3
Delay(50)
READ AD3



如果你是面對對象,則你會在你需要的地方寫下相似的代碼

READ_AD1

...
READ_AD1

...
READ_AD2

...
READ_AD2

...
READ_AD3


READ_AD1
START AD1
Delay(100)
READ AD1
RETURN AD1


READ_AD2
START AD2
Delay(10)
READ AD2
RETURN AD2


READ_AD3
START AD3
Delay(50)
READ AD3
RETURN AD3

可能你看不明上面代碼有什麼區別,
但你要知道,當你的代碼上了規模後,在你的外設改變了之後,
對於第一代碼,你要找出所有涉及的代碼.
但對於第二代碼,你只要找出相應外設所在的單元,只需改它就解決問題了.

或者這樣說,
對於代碼一,你需要了解整個系統的所有行為,
對於代碼二,你只需要了解整個系統的有那些對象.

更嚴面向過程的代碼是
是連Delay代碼都沒有的
類似

START AD1
for(i = 0; i < 100; i++)
        for(j = 0; j < 20; j++);
READ AD1


...
START AD1
for(i = 0; i < 100; i++)
        for(j = 0; j < 20; j++);
READ AD1

...

START AD2
for(i = 0; i < 10; i++)
        for(j = 0; j < 20; j++);
READ AD2

...

還有,一定要記住,計算機是面向過程的,所以在代碼實現的層次,一定是面向過程的,只有在思考的層面,才有對象/過程之分.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 00:51

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表