平凡的世界

神鹰忽展翅,头顶青天飞
随笔 - 10, 文章 - 0, 评论 - 34, 引用 - 0
数据加载中……

转【规范化面向对象软件设计】

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

转载同事博客里的一篇文章,好像说的是我,呵呵,脸红一下。引以为戒。

posted on 2009-11-03 10:34 西门有悔 阅读(1633) 评论(3)  编辑 收藏 引用

评论

# re: 转【规范化面向对象软件设计】  回复  更多评论   

我现在还是将C++当C用...也脸红一个
2009-11-03 12:20 | 李佳

# re: 转【规范化面向对象软件设计】[未登录]  回复  更多评论   

作者对面向对象的思想理解深刻,面向对象并不一定要用c++,java,c#写。c依然可以写出漂亮的面向对象来(这点我从linux源码中发现,而且它的面向对象抽象基本是零消耗的,但需要很深厚的功底来完成一些技巧),面向对象很好理解,程序的本质还是过程式,所以要把握住对象构造到析构的主干线,理解软件体系中的线程模型。而且对象的抽象要多加思考,是否真的需要抽象这类对象,抽象这类对象是为了什么?能否用聚合组合来替代?过于臃肿的类体系结构扩展性受到影响,而且会增大对象占用空间,明白什么时候upcast,什么时候downcast。好的面向对象抽象一样可以提高效率,而且有时候用好c++效率还会比c高(因为在真正代码执行期间,cpu通过ecx知道c++的类对象上下文),尽量减少或避免虚表重复查找次数。面向对象是一潭深水啊,掉进去一定要出来。
2009-11-03 13:02 | tiny

# re: 转【规范化面向对象软件设计】  回复  更多评论   

其实,面相对像其实就是在面向过程的,比如C++,许多C++编译器就是把C++的程序转成C的程序,然后重用C的编译器。但是,面向对像又不是面向过程的。面向对象是一种思想,就像C能写出面向对象的程序来,但是不要以为C++不好,C比较难写出面向对象的程序来,C++的目的就是把面向对象的思想应用到语言上,让程序员能在语言上得到支持。
其实,语言都是其次,重要的还是思想。现在的书很多说的是面向对象的语言,但是还没有一本很好的书来诠释面向对象的思想。能在应用上去解释面向对象的书更少。希望国内能有这么个人出本这么一本书。
本人还是个学生,不对的还望包涵。
2009-11-03 20:03 | chaogu

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理