什么是面向对象的本质?

来源:互联网 发布:abb机器人编程实例 编辑:程序博客网 时间:2024/05/14 09:56
    按照古老的说法,程序=数据结构+算法。用我的话来说,就是数据和行为。


    从面向对象的3个特征(封装、继承、多态)来说,并没有脱离这两个基础。


    程序是沟通人和机器的。人的思维则是有限的,一个人在同时只能关注有限的目标,但不幸的是机器的处理数据的容量远远大于人,于是程序员要写的代码复杂的超过自身同时可以想象的量。于是软件设计的原则就是,化繁为简,化难为易,把人的思维集中在简单的领域,然后通过有序的组合实现复杂的逻辑。


    一开始,写程序是函数调用函数,不同的函数互相调用,关系错综复杂,循环调用。函数是程序的原子单位。后来,发现要分权,把一定的数据只允许一定的函数来操作,其余函数不能直接操作这些数据,这样,对象=数据+行为。别的模块要做操作,必须以某个对象为原子单位来操作,对象内部的数据之间的关系自行解决。这样,程序员的负担大大降低了,并且对象是对现实世界的真实模拟,非常容易构建模型。


    继续说继承、接口和多态,其实这几个术语没什么神秘的,无非就是把对象(数据或行为)做抽象。


    狗和马都是动物,狗和马都继承动物。白马是马,白马继承马,但多了一个颜色的属性。继承既包括数据,也包括行为。


    狗和马都能跑,可以抽象出一个“能跑”的接口,只要是动物,都可以试试看能不能跑。接口只包括行为,不包括数据。


    多态,就是我不知道这个动物是什么,在我的代码里是动物.跑,如果这个动物是狗就按照狗的方式跑,如果是马就按照马的方式跑。


    以上都是手段,目的是为了降低程序员大脑的负担,在同时只关注一件事情,把这件事情做好,然后才能把所有事情做好。如果对象之间的关系设计合理,能反映现实世界,那么以后的程序员能非常容的理解并修改程序。如果舍本逐末,为了什么设计模式而设计模式,那么最后只能写出一堆层层叠叠看不出本来面目的代码。


    下面说面向对象的程序设计的难点:


    1.怎么划分对象的粒度大小。我的原则是,一个源代码文件不超过1000行,超过了就要拆分。


    2.怎么处理对象之间的关系。这个很难,需要对某个领域有着深刻的理解,没有既定的套路。我的建议是,学一学数据结构。基础的数据结构如链表、哈希表等是经典的设计,在机器高速处理上做到极致,写程序要以这些为基础,在数据结构层面之上来搞对象。随着我们对某个特定领域的理解进一步深入,才能构建理想的模型。


    3. 对象的生命周期 、数据访问的权限。我在实际编码中发现有下面几种


                        数据权限                                生命周期


    数据对象    直接读写内部数据                    完成一次操作


    普通对象    直接读,通过方法或函数来写    按需使用


    对象池        对象的容器                             =整个模块的寿命


    接口对象     通过方法或函数读写,减轻上层的调用负担,即使要有数据,不能把内部数据的任何直接读写暴露给上层 ,尽量做到没有数据,只有行为。所有的方法最好是原子的,正交的。


    以上这几种是一个循环,一个模块从低往上由这四种构成,不同模块以接口对象来划分边界。


     4.效率和灵活


      效率和灵活是一对矛盾。大部分的程序之所以效率低下,并不是因为用了错误的算法,而是因为对底层的理解不足,在内存倒腾和IO上耗时过多。Spring之所以成功,因为它的对象装配基本上是在初始化期就完成了,换言之,要做什么行为,在一开始读配置的时候就决定了。而很多低效的设计,力图追求不必要的灵活性,期望所有东西在运行的时候动态加载,最后效率低下。动态加载的最好范例是linux操作系统上的动态库,要什么功能,调用一次加载,后面就都能正常运行,而不是每次加载。