不同的抽象级别造就不同的思维方式 假如你买了一台烤箱,这个烤箱至少有这样几个方法:加热,定时,开炉门,关炉门,温度调节,烤箱此时可以看成一个对象,这个对象是从烤箱类那里生成的,烤箱类可以看成是烤箱的设计图纸。 你买了一只鸡,准备用烤箱烤了吃,那你至少得遵循这样的操作流程: 1.把炉门打开 2.把鸡放入(假设鸡已经洗干净了) 3.关上炉门 4.设定时间(假设40分钟) 5.设定温度(240度) 6,按下加热开关,开始烤鸡 这是一个顺序的过程,你不可能又开炉门又关炉门,也不能同时把鸡放入和按开关,总有先执行哪一步的问题,这是一个过程,我们称这种思想是面向过程的 前面我们关注的是烤箱本身,后面我们关注的是怎样用这些东西来做一件事,这本来就是一个问题的两个方面,面向对象和面向过程,缺了哪一方面都不行。 我们既可以从更高抽象的级别思考问题,也可以正好与之相反 比如:烤箱的图纸可能是很多人通力协作才画出来的,也许最一开始的时候,纸上只有一个方块,但工程师A说,我们要有定时功能,工程师B说我们要有温控系统,于是烤箱类的子类就从工程师A和B这里继承了两个方法,如果A和B的想法仅仅是概括而没有具体实现,那么我们说烤箱类继承的是两个接口(接口里没有方法的具体实现),无论如何,我们讨论的 都是图纸的问题,都属于类的问题 相反,低抽象度好像拆盒子,看看里面有什么东西,当我们按下烤箱开关的那一刻,电流从插座流进烤箱电路,包括一些电阻和电容之类的原件,流向石英发热器,石英发热器产生的热量使得空气开始对流,温度开始上升...平时我们大可不必关心这些东西,发热器能放出多少焦耳的热量和烤一只鸡有什么直接联系呢,只有在规定的时间内烤好就OK。再举个例子来说,读写内存的过程也不像往储蓄罐里扔硬币那么简单,后面复杂的机制足够写一本厚厚的大书,然而对于一个普通的程序员说,这些都不需要去考虑。有人把提高抽象度而隐蔽细节的方式,称之为封装、 没有任何一种编程语言可以完全的称之为“面向过程”和“面向过程”的,如果有也仅仅可以说是推销语言的宣传口号,一个变量,一个结构体,都可以说成是对象,只不过是,到此为止还是能够继续往更高层次思考的区别,这 需要有特殊的机制,比如一个叫做“抽象类”或者“接口”的概念。总结起来,就是说,语言和语言之间的区别,说到底,都是思考问题方式上的区别,在最核心里,就像那个烤箱,无论烤箱本身还是开箱中的电路,都是在为同一件事服务的,那就是加热。 Java和C#并不是没有指针了,而是不希望程序员用指针的思维方式思考问题,因为那样很容易犯错误又浪费时间,它们希望程序员更关注程序功能的实现,多过对内存操作的认识,就是这样。
|