谈到面向对象这方面的文章非常多但是明确地给出对象的定义或说明对象的定义的非常少——至少我现在还没有发现其初面向对象是专指在程序设计中采用封装继承抽象等设计方法可是这个定义显然不能再适合现在情况面向对象的思想已经涉及到软件开发的各个方面如面向对象的分析(OOAObject Oriented Analysis)面向对象的设计(OODObject Oriented Design)以及我们经常说的面向对象的编程实现(OOPObject Oriented Programming)许多有关面向对象的文章都只是讲述在面向对象的开发中所需要注意的问题或所采用的比较好的设计方法看这些文章只有真正懂得什么是对象什么是面向对象才能最大程度地对自己有所裨益这一点恐怕对初学者甚至是从事相关工作多年的人员也会对它们的概念模糊不清下面我从一般的概念出发再引申到软件开发领域中所涉及到的对象的概念 上一篇文章中我曾举过一个树的例子来说明对象的概念这里我仍然利用它对对象的概念做阐述对象一词英文为Object德语为Sachen都可以译做物体其实所有的物体都可以作为我们的对象——只要我们注意并对它思考了一个人从生下来到进行第一次的户外活动他将接触到许许多多的新鲜事物他将睁大眼睛好奇地看着这陌生的一切也许对他来说那些高大的东西有干有枝有叶——虽然那时他并不知道这些——其映象已经深刻地印在了他的脑海中此时对他来说树并不是对象因为在他的脑子当中只有树的映象而没有对树的精神上的意向当他再大一点时也许他会想着爬到树上去玩一会儿——但此时树也还不是他的对象存在的对象只是他自己——他想让自己去做某件事长大以后也许他他成了一名木匠——就像我们成了程序员用他的锯子斧头把一棵树砍下来做成一张桌子——就像我们利用Java C/C++语言开发出一套数据库系统在这里树是木匠的对象而数据库系统是程序员的对象于是我在这里给对象下一个定义对象是人脑中的物质意识和精神意识通俗地讲就是事物在人脑中的映象和人脑对事物的意向之所以要在这里强调事物是我要说明这里所说的物质并不是物理学中的物质思维活动事物间的关系我们也称为是物质的 真正要在较深的层面上讨论什么是对象是很复杂的因为这要涉及到精神意识本质的问题远远超出了我们要讨论的范围我们不要讨论什么高深的问题就以实用为主我就利用这个概念来举一个简单的例子木匠前面有一张桌子他可能要面临两个问题一是给桌子添加一些部件如抽屉这样桌子就可以放更多的东西二是装饰一下桌子使得它更美观在这里桌子是他的对象——他对桌子进行思考了这使得他对桌子的意向性也明显地显露出来我们甚至可以把改造桌子称为面向对象的改造因为那不是随意的改造这一点我在随后对面向对象思想的说明中提到为什么说是不是随意的改造考虑一下面向对象可以知道它是一个动宾关系的短语动词面向表面这个短语含有如何去做的意思这可以说是涉及到了方法论的范畴了这也给我们提供了一个重要的信息面向对象的做不仅牵涉到什么是对象的问题还牵涉到如何去做的问题木匠如何去做他的桌子我们不必担心他肯定能做好的——如果他是一个优秀的木匠的话他有着丰富的经验他有一套自己的方法他知道如何去做也许在做桌子之初就已经做了良好的设计以为以后的升级作准备这就像一个经验丰富的程序员他知道怎么设计才能让自己的程序结构清晰易懂容易排错也易于维护 有一点要注意的是对象不是实体它可以脱离实体而存在这是因为对象只不过是人脑思维活动的产物我们可以用某种方式如自然语言图画等将它表示出来就像我们在软件开发中所说的对象用类(程序当中)或系统结构图(如流程图层次图HIPO图等)来描述一样 于是我们就可以对象我们一般在软件开发领域里所讨论的对象下个定义了对象由一个数据集以及对该数据集的操作组成这个定义适合程序语言中的类也适合对整个系统而言也许大家会对这个定义觉得很熟悉这不是程序或进程的定义吗?注意这里的对象是有自我意识的也就是说它是有自己的行为的而进程指的是一系列的二进制流的集合是一次运行活动在程序中我们用类来描述对象而对整个的系统我们用系统图来描述在这里系统也是我们的对象数据集就像事物在我们大脑中的映像对数据集的操作就如同我们对事物的意向如果我们仔细考察系统的各个部分那么它们也可以看作是对象面向对象的XX就是要求我们如何合理地分配对象之间的层次结构使得它清楚明了在保持效率的同时还便于排错维护我们有一个专业名词来表示已经定型得到大家认可的软件方法那就我们常说的模式各行各业都会有它自己的一般的方法模式如建筑业有建筑模式软件开发有其开发模式我想当初爱因斯坦之所以做出几个丑陋的凳子就是因为他不懂得凳子的设计模式吧这就如同好多编程初学者稍微大一点的程序就会写出杂乱不堪的除了自己谁也看不懂的代码也许过了几天连自己都看不懂了 在软件开发过程当中系统(我们面对的终极对象)的分析设计才是最重要的而这两方面是紧密结合在一起的这两步没有做好下面的编码实现工作很难玩成可以说是寸步难行我曾经在一家软件公司(说是公司其实加上老板才只有六七个人)做过一段时间那时老板叫我们用Java做一个数据库系统(图书馆管理系统)用来当招牌以后也好对接项目有利我以为他会先拿出一个设计图让我们看不料他说现在就开始做说实在的那时我对这方面根本没有经验我当时就对他说你至少得把你设计的蓝图给我们看一看吧?他说没有他也不知道如何做以前没做过还说我们边做边学习我说那至少你应该先做一做系统分析吧他说要是我有这能力还能在这里呆着?结果可想而知我们在那里呆了几天这里瞧一瞧那里看一看又在机子上写一写什么也没做成老板看见我们稍微有所松懈就不断地催促快做快做后来我受不了就一个人跑了也不知道他们做成了没有可以说这是一个不成功的例子就算是写成了没有分析设计的结果肯定也是很难维护的这就象是请来的木匠把一套家具打造得很不合理看上去非常糟糕可能还很不实用有谁会愿意用这样的家具?程序包设计得不好有谁能用得好?无论谁用起来都会很吃力如果说一个项目没有设计好即使开发出来了后来的维护工作别人怎么能接手?在我们中国软件领域有这样事情的例子很多当然产生这样情况的原因很多中国的体制公司的实力也是一大方面但是如何去做有是一个范围很宽的话题了 上面聊得多了对象是一个比较广泛的概念在我们通常软件领域里也是这样对象之间可以包含对象对木匠来说一套组合家具是一个对象一件衣柜也是对象——全局和局部都要考虑对他们来说如何从整体到部分的设计出受人好评的家具是需要丰富的经验和良好的设计方法的对我们来说也是这样除了要打下扎实的基本功积累丰富的经验还要注意学习我们的前辈们给我们留下的东西以及同行们的好的方法现在有关面向对象的书籍文章都很多我们都应该去看看去学习 全文说了这许多只谈了有关面向对象的概念有几位朋友来信问到如何划分对象层次结构对系统运行的重要性等受篇幅所限不能述及还有可能有的朋友对对象的理解不是很合理这里我谈一下我的观点对象在系统运行时是有其生命期的但是在运行内对象自身的改变(如动态地增加缩减功能数据集的变化等)不能看作是改变了对象例如对于一个二叉树初始化时只有根节点当然我们可以看作是一个节点对象但一般我们是将它看成一个整体的二叉数对象当树生成之后它还是那个对象而不能把它看成是另外一个对象了如果你那样理解的话就把对象的各个运行时期分离开来了这就与对象的概念有曲解了 |