大家为了讨论“什么是OO思想”,又把什么UML、RUP、某某框架之类的东西摆出来,这些对解释“什么是OO思想”真的很不重要,尤其对初学者来说。
大家编程序是为了让编出来的程序帮我们做事情、解决问题的。简单地说,在目前的计算机体系下,所有程序最终的形式都是一大堆机器指令对数据的操作,操作的结果就是我们想让计算机帮我们做的事情。所以我们写程序从根上来说就是写一条一条的机器指令教计算机怎么一步一步地操作,最终实现我们要做的事情。这也是计算机刚开始出现时人们就采用的编程序的方法,目前大家称这种方法为“面向过程”的编程方法。
“面向过程”的编程方法基本的编程方式如下:
一切以“我”为中心考虑问题:要做某件事情,第一步要做A、A做完后要做B事情、如果B不成功那么我做C,否则我做D......等等。在这个过程中,把重复出现的一些步骤(完成了更高层概念的事情)包装在一起当作一个整体使用,称之为“函数”(这是一个层层包装递归的东西,直至最底层的机器指令);把逻辑上相关的一下数据(代表了更高层概念的事物)包装在一起当作一个整体使用,称之为“结构”(这也是一个层层包装递归的东西,直至最底层的存储器)。
这种编程方法其实是人们很自然的做事的方法,大家考虑做事的时候一般都是这么考虑的。
而“面向对象”的编程方法(即OO思想)打破了以“我”为中心考虑问题的习惯:要做某件事情,首先考虑应该由“谁”来做,或者说做这件事情是“谁”的责任(“谁”来负责这件事情),接着考虑“谁”应该和“谁”协作来完成更高层概念的事情。指定由“谁”来做这件事情的时候不必考虑他是如何做的(即如何实现的),只知道他负责这件事情能得到需要的结果就行了。而这个“谁”就称之为“对象”,所谓的“对象”就是负有责任的东西。而“对象”在实现自己负责的事情时也可以做同样的考虑(应该由“谁”来做;“谁”应该和“谁”协作来完成),这个过程也是一个层层递归的过程,直到最后总是由逃脱不了责任的对象简单地亲自操作一下:)。
“面向对象”编出来的程序与“面向过程”编出来的程序在代码的组织上一个明显的特点是决没有一个主控对象来统一指挥,而是一些相互协作的平等对象组成的一个协作网络;决没有一个主控对象到处搜集信息来完成某件事情,而是把事情交给知道这些信息的对象来完成。
(至于为什么会提出“面向对象”编程和“面向对象”编程的好处,在这里我就不说了)
但是光有“面向对象”的思想并不能保证写出来的程序一定好的,而是要遵循“面向对象”的一些编程原则才有可能写出好程序,比如:封装原则、隐藏原则......等等,介绍这些编程原则的书籍很多。总的来说:每种对象负责的责任越单一越好,不要让一类对象负太多的责任尤其是不相关的责任;对象在完成自己负责的事情的时候,最好不要让外面知道或者说这方面信息外面知道的越少越好。尤其要注意的是:一定要把握多态性这个概念。
GoF的设计模式更是提炼了优秀的“面向对象”编程原则和思想,
例如:
封装变化点;面向接口编程;等等,把“面向对象”的思想提到了一个新的高度,真是绝了!