从某年某月,当我开始接触到计算机语言的时候,人家就开始孜孜不倦的告诉我2个概念:面向对象&&面向过程,但是他们具体有什么区别呢?没有人能说清楚,所以当我从新手到菜鸟这段过程中,一直在思考一些问题,下面来将我思索的一些写下来。
首先,先看2段代码吧:
/*c language*/
/*stack     */
typedef 
struct __tag_Stacklay
{
    
int top;
    
char element[101];
}
Stacklay;

void InitStack(Stacklay* p)
{
    p
->top = 0;
}


char StackPop(Stacklay* p)
{
    
char c;
    c 
= p->element[(p->top)--];
  
  return c;
}


void StackPush(Stacklay *p, char c)
{
    p
->top = p->top + 1;
    p
->element[p->top] = c;
}


#include 
<stdio.h>
int main(void)
{
    Stacklay s;
    InitStack(
&s);
    StackPush(
&s, 'a');
    StackPush(
&s, '!');
    StackPush(
&s, '#');
    printf(
"%c %c %c\n", StackPop(&s),
       StackPop(
&s),StackPop(&s));
    
return 0;
}

这段代码就是我们经典的c的代码,实现了一个简单的栈。。。我们看到,每次都需要我们的客户代码去指定对象作什么,动作是我们设定好的,而对象是我们制定的,他们不知道它们做了什么,一切由我们的过程控制~
然后下面看同样功能的一个类,c++实现。
/* c++ language*/
/*stack        */
struct stack
{
    
int top;
    
char elements[101];
    
char pop();
    
void push(char c);
    stack()
         
{
             top 
= 0;
          }

}
;

char stack::pop()
{
    
char c;
    c 
= element[top--];
    
return c;
}


void stack::push(char c)
{
    element[
++top] = c;
}


#include 
<iostream>
using namespace std;

int main()
{
    stack s;
    s.push(
'a');
    s.push(
'!');
    s.push(
'#');
    cout
<<s.pop()<<" "
        
<<s.pop()<<" "
        
<<s.pop()<<endl;
    
return 0;
}

我们看到2段代码实现的功能是一样的,但是区别是什么呢,c里面,stack不知道自己将会被干什么,c++里面,我们的stack自己知道自己会干什么,我们的上层仅仅是通过调用,告诉它应该干什么;
而另外一个思维上的显著的区别是:比如下面这个问题:一个班级的同学都被你调遣到一个地方去听某节课,这样我需要写一个程序来让他们都知道要去哪上课,并且行动,明显,按照结构化程序设计,我们会按照这样的过程:
1,获得要听课的人的名单
2,对于每个人,你都会这么做:
    a:找到他要听的下一节课。
    b:找到该课的上课地点。
    c:找到你的教室到下一个教室之间的路。
    d:转告给学生。
显然,这样的设计在现实生活中不是太可能的,因为如果这个人数很多的话,您这位老师会疯掉,并且一整天都会花在这件事上。。。但是这个就是一个典型的结构化程序设计的思路,会去找到路,然后专门控制每一个学生怎么做怎么做。很傻?也许,我们可以换一种思路。。。
我们知道,通常,在学校,老师或者校方都会在显著位置张贴一张通知。然后集中通知学生,或者学生之间互相会转告。
当然,这种思路也可以用在程序里面,设想,一张简单的通知,就可以保证所有的对象都按照既定的消息去做事(当然,这种保证只会出现在程序里面),这样实现了一种责任的转移,从过程控制方->被通知方。这样也方便我们实现一个被控制方的身份的转移,假如这个时候,我需要通知我们可爱的学生,但是学生里面有本科和研究生之分,然后研究生和本科生需要取不同的地方,这个时候,按照第一种方法就会在调用方增加大量的判断信息,而第二种保证我们代码的一致性。。。。
相比之下,第一种跟第二种有神马区别呢,主要是在于责任的处理方,控制方可以把面对不同的对象所产生的操作化简,好像那么多相似的对象都一样。。还有就是对象收到消息之后,对象自己负责怎么做,控制程序之需要知道他最后的结果就是到达教室了。
这样就产生了几个层次,控制程序控制层次,对象细节的层次。
比如老师告诉学生去做什么,而不是做什么,做什么根据每一个对象具体的去定义。这样在于控制层次就会产生一个多态的概念。
可以说老师告诉学生一个概念,学生去实现这个概念。很明显,这个思维跟现实生活中的思维很像~~~
对象是什么呢?
他的定义如下:
     1:对象包含数据元素;
     2:对象能操作方法(函数);
     3:对象访问这些数据元素和方法的方式;
这样,我们的代码可以这样设计:
    1:初始化,开始控制单元;
    2:实例化,让学生们都集合;
    3:通知,告诉这些学生一些信息:比如去某教室上课;
    4:通知到达:每个学生都被通知到;
    5:实施:每个学生都:
            a:找到教室。
            b:决定怎么去
            c:去
    6:完成;
针对于我们学生自己那块,有很大的弹性。因为学生类型多种多样。这样面向对象一个重要特性浮出水面:多态。针对不同的对象,有不同的响应,它优雅的让调用方觉得你们是一样的,调用方只要保证你们都属于一种最基本的保证就可以按照既定的流程进行,而这个保证就是面向对象的一个抽象,比如此处所需要保证的就是学生。
其实说了这么多,简单的说,抛开一些特性,面向对象跟过程化的设计其实是很暧昧的关系。除了封装这一层特性,多态和继承都是可以用c模拟。。。。所以设计仅仅思想体现的方式。