作为当今主流的软件开发方法,面向对象程序设计已经为广大程序员所熟悉,什么类呀,继承呀,多态呀等等玩意儿也用得嗖嗖的,但是为什么设计出来的大多数系统都很糟糕呢?这里面有两个重要原因:一是我们的设计师对面向对象设计仍然没有深刻理解,市面上的很多书也都是些没什么工程经验的“学院派”专家编写的,在面向对象设计的理论上仍然没什么完整理论系统出来,有的只是一些零零星星的建议。另一个原因是目前的面向对象语言对面向对象设计的支持也不够完整,尤其是对关系的描述。面向对象设计的核心思想不是什么什么类呀,继承呀,多态呀等概念,甚至完全抛弃这些东西,依然可以设计一个优秀的面向对象的软件系统。面向对象设计的核心思想是面向自然的设计,即通过识别和表达出系统中对象、对象间的关系、对象的状态迁移等关键因素,软件设计达到自然的、正确的描述目标系统的目的,这种自然的设计忠实反映了目标系统中的对象和他们之间的关系以及他们之间的交互过程,是自然系统到软件系统的自然的映射。任何一个自然系统都是由一些对象组成,这些对象有自己的属性、行为和事件。任何一个系统都是不停运转的,所以光有对象还不够,这些对象要互动起来,才能让整个系统运转,因此这些对象内部的状态会迁移,对象之间会有交互,这样对象之间就产生了某种关系。那么究竟有些什么样的关系呢?可以把关系分为三种类型,第一种是组合关系,也就是HAS-A关系;第二种是关联关系,表示对象间存在某种关系,如师生关系、父子关系等;第三种是认识关系,表示一个对象知道另一个对象的一些情况,它可以使用它知道的对象,比如学生对象知道有个公告板对象,也知道用它可以贴布告,因此,当学生想发布告的时候就使用一下公告板对象,但学生对象并不需要持有一个公告板对象,它仅需要知道从哪儿可以得到公告板对象就行了,这是最弱的一种关系。有人可能要问了,为什么没有IS-A关系呢?那是因为IS-A关系本来就不是自然系统中的关系,它只是人们在认识论中的一个概念。分类、继承这些都是认识论的概念,很多设计师把它们和自然系统中的对象、关系混为一谈,随意的设计类、滥用继承正是当今糟糕的所谓的面向对象的软件产生的根源。规范化面向对象软件设计就是识别、描述了目标系统中所有有效的对象、对象状态、对象间关系、对象交互过程的设计,在保证正确反映目标系统的前提下,仔细设计类接口,这才是正确的设计之道。
转载同事博客里的一篇文章,好像说的是我,呵呵,脸红一下。引以为戒。