什么是面向对象的设计思想?也许有不少初学者对这个概念还有许多不明白的地方特别是这个处于新旧思想交替的时代许多人刚刚学完现在看来是快要淘汰的只是面向过程的语言他们的脑子还没有脱离面向过程思想的束缚抬头却发现面向对象早已经流行开来这个陌生的词漫天飞舞随便拿起一本流行计算机技术书籍那里会没有面向对象的字眼!于是心中便惶惑了什么叫面向对象?不感兴趣者一带而过;有志于在这方面发展的匆忙找到一本有关书籍来啃究竟什么是面向对象然而要突破思想的束缚说难也不难说到要深刻认识却也不容易笔者在做了一些轻量级的工作后颇以为有点心得不怕贻笑大方写出已供广大同行批评指正
对象(Object)一词早在十九世纪就有现象学大师胡塞尔提出并定义对象是世界中的物体在人脑中的映象是人的意识之所以为意识的反映是做为一种概念而存在的先念的东西它还包括了人的意愿举例说明吧当我们认识到一种新的物体它叫树于是在我们的意识当中就形成了树的概念这个概念会一直存在于我们的思维当中并不会因为这棵树被砍掉而消失这个概念就是现实世界当中的物体在我们意识当中的映象我们对它还可以有我们自己的意愿虽然我们并不需要付诸实现——只要在你的脑中想着把这棵树砍掉做成桌子凳子等——我们就把它叫做意向于是对象就是客观世界中物体在人脑中的映象及人的意向只要这个对象存在我们的思维意识当中我们就可以籍此判断同类的东西譬如当我们看到另外一棵树是并不会因为所见的第一棵树不在了失去了供参照的模板而不认识这棵树了当我们接触某些新事物时我们的意识就会为这些事物确立一个对象当然这个过程是怎么形成的那就不是我们所能讨论的问题了上面所说的对象研究的是一般意义上的问题因而它可以外推到一切事物我们经常所说的对象一班指的是解决信息领域内所遇到问题的方法特别是应用软件技术来决问题的方法如我们经常碰到的面向对象的编程(ObjectOriented Programming)面向对象的分析(ObjectOriented Analysis)面向对象的设计(ObjectOriented Design)等应用前面所介绍的关于对象的概念可以对这些问题做进一步的分析在面对较复杂的系统我们可以将它作为一个对象来进行分析一个系统(解决某个问题的全套解决方案)作为一个对象可以由多个部分组成同样这个对象也可以由多个对象组成对于同类的事物可以由一个对象来表示这样做的益处是显而易见的它灵活而高效可以大大减轻设计人员的工作量简化实际的模型举一个例子在关系型数据库的设计当中我们可以把一个元组当作对象给它定义一组操作方法这些方法将适用于所有元组从而我们不必在更大的范围内去细致的考虑不同的元组(如判断一个元素是否合法)因为它们有一组公共的面向本身的方法它们自己可以解决自己的问题更上一层的对象可以是一个表视图等表对象在元组对象的基础上又有它们自己的方法如增加删除等从这个层面上讲它也只需要做自己的事情因为有元组对象的支持它无须去考虑像元素是否合法这类的事情甚至有时为了满足我们还可以将元素或表群当作时对象并定义它们自己的方法这样更能显示面向对象的优势
上面所讨论的可以说是面向对象的分析方法在具体的设计过程当中还应该采用适当的方式因为面向对象的思想固然很先进如果做得不好的话同样不能达到预期的效果这主要表现在处理对象与对象的关系上没有做好对象与对象的层次不分明如上面所举得关系型数据库得例子如果在元组层面上得对象过多得考虑一个表对象得因素或一个表层面上对象过多地考虑一个元组对象的因素甚至去考虑元素层面上的因素这些都不是好的面向对象的设计方法这一点在语言实现方面Java比C++更有优势因为它不允许多重继承从而使对象之间的关系更明确谁也不会否认C++的功能更强大但是它也要由次付出巨大代价——当现在代码库发展到一定程度一定规模时个对象之间的层次关系将变得异常复杂给后继使用者得学习理解带来很大的困难应用上很难把握另外虽然C++具备面向对象的处理能力但它还是保留了很多面向过程的东西用C++完全可以不用面向对象的思想来进行程序设计当然人们不会这样去做——除了那些只是把C++看成是C扩充的初学者这就为以后的发展埋下了隐患在者一方面Java的限制更多一点就者一点还远远不够搞开发的是人开发方法是由人决定的要应用面向对象的方法开发出优秀的软件必须要求开发人员具有良好的面向对象的思想好的工程师可以利用适当的工具开发出优秀的软件——而不在乎他所使用的语言工具——JavaC++Object PascalAda等