从思想上理解面向过程与面向对象

写在开头的话:本篇文章不阐述具体实现原理,旨在用简明易懂的语言阐述这两种编程思想,以帮助理解。
PS:本文参考了其他文章

什么是编程思想?
一句话,就是我们用计算机来解决实际问题时所采用的思维方式。具体来说,就好比我们做一道数学题时采用的不同方法。一道题,你这样做可以求出答案,你那样做也可以求出答案。这不同的求解方法从某种程度上来说就是代表了不同的思维方式。

什么是面向过程?
首先需要知道的是,面向过程这一编程思想是早期的程序语言设计思想。这种思想强调的是事物的行为细节,它将整个程序描述成一个行为,所有的行为细节都按照固定方式一步一步的执行,执行程序就是执行某一行为的过程。简单来说就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。比如说,我们在解一道数学题时,为了求出正确答案,那么我们第一步应该这样做,第二步应该这样做,第三步应该这样做………………最后得出答案。
来看一个例子,假如说我们要做一张桌子,那么如果使用面向过程的思想的话,就应该这样想:
桌子,要用木头做,所以我要种树,树种好了,我要砍木头,没铁,开个铁矿先,有矿石了,造个炼铁房,炼好铁,做成锯子,锯木,做铁锤,做钉子。工具准备好了,但是我不会装桌子,去学学木工,OK。。桌子做好了 。
再看一个例子,在春秋战国中,假如我是一方诸侯,我为了图霸天下,那么我第一步首先需要稳定朝局,第二步我需要安抚民心,第三步我需要出台各种政策让国家富起来,第四步我需要训练一支强悍的军队,第五步我需要找几个会带兵打仗的大将,最后经过一番血战,我统一了整个国家。
因此,这种思想强调的是过程或者说步骤。
借用数据结构,这种思想更像是一种链表
步骤1—》步骤2—》步骤3—》步骤4—-》步骤5—》……………………………………—》得出结果。

什么是面向对象?
面向对象是把构成问题的事物分解成各个对象,它不强调解决问题的过程或者说步骤,而更强调对象。需要注意的是,这里说的对象是具有功能的对象
同样看做桌子那个例子,假如我以面向对象的思想来考虑这个问题的话,那么就应该是这样的。
我要做桌子,要木头,简单,从建材市场买,没铁钉铁锤,简单,五金商店买,不会做?请个木工,OK。桌子完成。
所谓面向对象,书上说的都是关于对象的概念,这东西很抽象,难以理解。很简单的一个思路,如上例,我要木头,从建材市场这个对象拿,调用建材市场这个对象中出售木头这个方法,返回我一个木头,至于建材市场的木头哪来的,我不知道,也不用知道,为啥这个社会有各行各业?就是因为要精细分工嘛。之所以说面向对象更接近于人的正常思维,妙处就在这,我们把能拿到我们想要的东西的出处抽取成一个对象,我们直接访问它,拿到我们要的东西,它又从它该拿到东西的对象处拿东西,看似互不相干,却又有很多关系,这是面向对象。每一个对象,一个方法,只做它自己该做的事。其他的,交给其他的方法,其他的对象。
同样看上文所述的第二个例子。
为了图霸天下,那么我只需要这么几个东西。牛B人士甲(政治很牛B,善于稳定朝局),牛B人士乙(维稳很牛B,善于安抚民心),牛B人士丙(治国很牛B,善于出台各种惠民政策),牛B人士丁(练兵很牛B,善于带出一帮精兵强将),牛B人士戊(打仗很牛B,善于各种环境下的战斗)。假如我找到了这几个牛B人物,并让他们都为我所用,那么打天下不就很简单了吗?
我只管找齐这几个牛B人士,他们下面具体再找什么人,做啥事,我不管,也不用管。
因此,面向对象的思想强调的是具有功能的对象。
借助数据结构,这种思想更像是一种
从思想上理解面向过程与面向对象**

总结
在谈到面向对象这种思维方式来说,我们经常会听到或者看到一句话就是:它更贴近于人的思维方式。其实我认为这句话还欠缺考虑。因为它忽略了个体之间的差异性。从上文的阐述可以看到,面向对象的思维方式是有好处的,但体现这个好处的前提是在你要理解这个思维方式的基础之上。可以看到,面向对象更注重顶层设计。而面向过程,更注重局部的实现。
假说在编码时,如果要采用面向对象这种思维方式,那么我们务必在动手之前,要先把整个程序的层次划分出来,即软件的前期规划或者说设计呀,架构之类的要先计划好。在具体实现某个方法时,在采用面向过程的思想,按步骤实现。

总的来说,要了解面向对象这一思想很容易,但要深入理解它就不容易了,要把它应用到编码里面对新手来说就更困难了。在我最初接触这些东西之时,就经常是借面向对象之名行面向过程之实。
之所以说是编程思想是因为它确实是一种思想,是跳出代码外的从上帝视角来审视代码的思维方式。JAVA之父不就说过,他自己更愿意被人称之为哲学家吗?
至于在语言中的具体实现,将在之后的文章进行阐述说明。