面向对象我们谈论的最多的是什么?我估计应该是经常挂在嘴边的封装、继承、多态了。但是,这些方法说白了都是针对业已分析规划好的类的一种具体的实现方式,可以把封装、继承、多态归结到工具的范畴。
通过上面的图,我们很容易的可以使用封装、继承、多态等方法实现各个功能模块。现在有一个问题,这张图是怎么来的?为什么要划分成这几个类,而不是另外的几个类?有什么依据?我们可以使用诸如单一职责,迪米特法则,针对接口编程等各种理由来解释,但是这依旧没有解决类为什么要这么划分的问题。这个问题目前暂时还回答不了,后面会逐渐提到。
现在有个非常重要的问题,那就是如何获取现实世界到计算世界的映射了。要把现实世界的哪些东西映射进来,如何映射?这就是所谓的抽象了。抽象首先又层次的问题,哪些东西需要在抽象的时候考虑?哪些东西不要考虑?比如对淘宝网站做一个高层次的抽象,就是一句话的描述,一个物品交易网站。如果你把抽象层次降低就可以看到订单处理系统、物流跟踪系统、客服系统等等。这就像是从远处眺望、近处观察、放大镜、显微镜...等等一系列的过程了。
抽象也有角度的问题,从不同的角度出发你认识到的东西是不一样的,我自己感觉其实我们抽象完成的类是真实世界物体在计算机世界中的投影,被抽象的东西是真实存在的,无论是有形的物还是无形的过程,我们其实关心的只是与我们系统有关系的那部分样貌。
通过对现实世界的业务建模、概念建模、系统建模、设计建模,层层递进抽象,摒弃系统不关心的方面,最后在计算机世界中搭建起一个“微缩的小世界”。
现在我们还有一个问题,如何证明我们的抽象是好的?因为有时候自己问自己为什么要这么做,不那么做,都回答不上来,只能模棱两可的告诉自己这也许就是经验吧!