关于面向对象的一点牢骚
究竟什么是面向对象?这个问题很困扰着我。上次面试专门被问了这个问题,最后说了实际分钟又问又答的,最后自己都不知道自己在说什么了。最近又重新思考这个问题,企图做 一点总结。
有过这样一句话:“面向对象就是,以类的方式组织代码,以对象的方式封装数据”。以为现在的水平来说,这句话我还体会不出太多的意味。但是,就我目前的理解而言,我觉得这句话是正确的。但是这句话还不足以告诉我究竟什么是“面向对象”。这个概念,好像很宏大。似乎应该是在很宏观的层面上才能理解,可惜偏偏又只是一个小小的程序员,并没有机会看到高层建筑。
一直断断续续看了不少博客,都说到面向过程和面向对象。有解释什么是面向过程的,也有解释什么是面向对象的。 大多数的概念如下:
面向过程就是,给你一个任务,你的思考过程是第一步做什么,第二部做什么,第三步做什么……这就是下面向过程。问题的解决主要按照步骤来。
面向过程就是,同样的一个任务,你的思考过程是,你需要一个什么样的东西来完成这件事,你还需要一个什么样的东西来完成那件事。这件事完成了,那件事也完成了,那这个任务就算是解决了。
从上面的表述中可看出,不管是面向过程还是面向对象,都是一种思维方式,是一种如果解决问题的思考方式。那在这种思维方式中,”对象“指的究竟是啥?是女朋友吗?
《thinking in JAVA》中有一句话,我觉得应该是比较可以帮助我来理解什么是“面向对象”这四个字的意思了。这句话是:“面向对象方式通过向程序员提供表示问题空间中的元素的工具而更进了一步”。这句话说明了面向对象是一种工具,是一种思考问题的方式。结合看过的多篇博客的理解就是说,面向对象是一种思维工具。这种工具可以帮助程序员描述出问题里的元素。到这里,进一步可以得出一个结论了:对象是指问题中的元素。这一点在赵学智的博客中(赵学智@行胜于言《什么是对象,为什么要面向对象,怎么才能面向对象?》),他也认为对象是指客体,是指客观存在的对象实体和主观抽象的概念。其实如果把对象粗暴一点理解,把对象叫做“东西,物件”或许,理解起来就会方便一点点。面向对象编程就是面向东西的编程(别犟,不是东西南北的东西),面向事物的编程。按照《thinking in java》的意思,编写软件的过程其实就是对显示世界的抽象的过程。所以对象就是针对具体问题进行抽象而得出的一个东西,这个东西是具体的,是有作用的。
《thinking in java》 的另一句话,又加深和扩展了对“对象”的理解。原话是:”我们将问题空间的元素及其在解空间的表示,称为对象“。这句话再一次直接地说明了,对象是指问题中的元素。也扩展性地说明了,对象还可以指”解空间的表示“,这里的”解空间的表示“说的就是,解决问题的那个方案。从这里来看的话,其实面向对象,似乎是一个比较宏观的一个概念。我们这些低级的码农,可能更多的思维方式是面向过程的一个方式。我们好像很少需要考虑这个问题怎么解决,因为基本都 有需求说明书和详细设计文档,数据表结构早就被定义好了。我们只是照着写两个文档写代码就好了,问题如何解决,好像产品经理或者写这两个文档的人,已经帮我们思考好了。这真的是站得不够高思考的范围跟角度就不够,眼界也容易受限制啊。我真的很难想象”写一个方法,去验证字符串是否为空“这种需求应该怎么用面向对象的思维去思考,一般就是把字符串参数传进来,然后判断长度,判断” “,判断是不是null。就完了,究竟这么细节的问题到底适不适合使用”面向对象“这种思维工具。真的还是说不清的,至少暂时是说不清的。
以上是咬文嚼字,拆出”对象“这两个字进行理解,置于还有的博客说到的什么软件危机,什么编程思想由面向过程向面向对象的转变的这一段历史,我只能说看了那么多之后,有些印象,但是真的还不能很好地再次进行阐述。
路漫漫其修远兮啊!!!!关于“面向对象就是,以类的方式组织代码,以对象的方式封装数据”这句话还是有地方可以解读的。面向对象的很重要的一点我觉得就是要搞清楚什么是类什么是对象。这个问题下次再努力总结一下,希望能有些收获。