学编程的人应该都听说过两种思想,面向过程,面向对象,在我看来,编程就是让计算机来模拟现实,既然是模拟,那么就要越贴近现实越好,而这两种思想的发展在我看来代表这计算机模拟现实的一个进步,面向对象的设计思维相比面向过程来说更加接近人的真实思维模式,人类的真实思维也是类似于面向对象,当然了,我说的是人的现实的动作与行为,而不是感情什么的,也许当人们找到一种比较贴近感情的编程思维,计算机模拟感情就容易多了。既然要谈面向过程和面向对象,那就必须谈一下何为面向过程,何为面向对象。
----对面向对象和面向过程的一些新理解
那么何为面向过程呢?在我看来面向过程说白了就是把一个软件看成是过程的集合,软件是由许许多多过程组合起来的,那么何为过程呢,在我看来过程就是动作的序列,将一系列的动作以固定的顺序执行,而动作就是数据的变动,为什么这么说呢,我们知道世界是由原子组成的,而原子有事由某些粒子组成的,而这些粒子又是由一些分的更细的粒子组成的,(当然这些粒子还有没有更细的我也不知道,就我目前知道的似乎分到了夸克,我不是专研物理的,如果有错误请见谅)不论还能不能分,我们总能把他分成一个基本的量,而根据爱因斯坦的质能方程和霍金的空间能量方程,得出空间和质量都是可以和能量转换的,那么我们姑且把这个世界看以能量表示的,那么通过能量的不同的坐标和量就可以表现出一切,也就是我们眼中的世界,回到数据上来说,我们的动作导致的结果就是能量的变化,如果把能量的量和坐标以数据描述的话(这类似于物理界期待的大统一理论,而我认为这也确实是可行的),那么动作就是数据变化的公式,动作描述了数据如何的变化,如果将动作前的数据看成是函数(数学中的)中的自变量的话,那么动作后的数据就是因变量,数据的状态发生了改变,我们就说发生了一个动作。而如果这个数据是能量的表示话,那么表现在现实世界就会发现动作导致了结果,比如我们姑且先认为吃是个动作,这个动作使得组成食物的粒子(也就是能量)的坐标发生了改变,结果就是食物被我们吃到肚子里去了。而过程就是把一系列动作指定一个执行顺序,比如我们先认为吃饭是个过程,吃饭这个过程是由吃这个动作和判断是否吃饱这个动作组合起来的(抽象意义上)。我们在大脑中把吃和判断是否吃饱这两个过程按照一个顺序指定下来,那就是吃饭这个过程。我们吃饭的时候只要执行吃饭这个过程,我们的大脑就会控制我们执行这个过程,其实我们从思维上只是发出了吃饭这个命令。而再抽象一步,吃是不是也能看成由一个个移动手臂,控制手指运动的动作组成的过程,同样这些动作也可以抽象成肌肉的收缩运动等等,直到回朔至我上面所说的能量的变化,也即是不可再分的过程。是的,我在这里把动作就定义为描述了如何改变数据的不可再分的过程。运动是过程的一种,请记住这个概念。那么我上面说的过程就是动作的序列也可以说过程是一系列更小的过程的序列,这是个迭代的概念。
好了,我再来谈编程,我们编程的时候不需要完全模拟,只需要模拟我们需要的数据和过程就行,比如我们编一个考勤系统,只关心日期,人员姓名,和出勤情况和人每天来没来这个动作就行,没必要关心人员的体重,年龄之类的,不关心这个人今天吃没吃饭,这没意义,还使的软件更复杂,运行更慢。如果真要模拟到粒子级别的数据变化的话,让星云(由中国研发的超级计算机,目前世界排名第二)来了也得运算个无数年。我们用编程语言编程就是模拟现实,不过只模拟我们关心的部分,不关心的一概不管。我们先定义变量来代表现实的数据,然后定义一些函数来代表动作,动作是用来用来改变数据的,就以上面说的考勤形同为例,我们定义三个变量代表一个人的名字、日期、出勤状态,这就是一个人的某一天的出勤的数据,模拟出现实中这个人在某一天来没来。而我们定义许多这样三个一组的变量就可以代表所有人的出勤状态(当然,那么多变量不可能一一声明,通常是通过结构体包装起来然后以链表或数组或其他数据结构组织起来),当然不必把这些都存在内存里,把已经记录好的存放在硬盘里更好。我们再定义一个签到的函数,它就是一个过程,它的作用就是执行定义好的过程序列来改变数据使得记录这个人在这一天来了。当然它的内部可能还会调用其他的函数,比如把记录保存在硬盘下的函数,这就是在一个过程内部包含着其他过程。这就是面向过程的编程思想。通常把任何的过程都分为三部分:开始(初始化),运行(运算),结束(存储结果)。我通常把任何事物模型都划分为这三部分,开始通常就是初始化数据,将一些常量值准备好,并为下一步的运行分配资源(内存,进程),如果有界面的话要显示初始的界面。运行就是根据初始的数据以及运行过程中接受的数据进行运算(就是在模拟现实),如果运算量多的话可能要吧一部分处理完的数据存到硬盘上。当然如果有图形界面还要更新显示内容。结束就是把所有需要存储的结果存回硬盘,同时释放开始时申请的资源(有的操作系统会自动释放)最后结束程序。可能还要返回给操作系统一个值以表示程序是不是正常结束的。
把一切的事物过程看成过程和数据的集合,通过过程来改变数据,从而反映现实的状态。我们通过数据的变动模拟出了现实的世界(当然只是我们所关心的部分)。软件的目的也就完成了。