Don't think you are, know you are

博客园 首页 新随笔 管理


最近看了园子里的面向对象与过程之争,忍不住想说两句,因为我感觉这里面对OO存在一些关键误解,不说出来真的是难受。我有什么说错的地方,也欢迎大家指出。

首先,题目引用的是《人月神话》中的典故,面向对象是在软件危机的大背景下产生的,被作者称为“铜弹”,相对于作者理想中的至今仍未出现的“银弹”来说,我觉得已经是一种赞誉了。

开发,说到底就是人与机器的对话。这里面我们以前忽略了一个平衡问题。软件危机的本质,我觉得就是我们的思维太偏向于机器而忽略了人这一要素。我们用面向过程的方式组织程序就是从CPU的角度出发,一切都是按顺序执行,按顺序组织。刚开始程序简单没什么。可是随着系统的越来越复杂,人这一要素在人与机器的对话过程中“崩溃”了,因为在面对成千上万的函数过程时,人脑接受不了了,人脑不是这么认识事物的!而最重要的是,需求不可能不变的,我们没有封装变化点,那么每一个变化都会有牵一发而动全身的效果。什么意思,你改变了一处代码,你的功能正常了,其他的地方崩溃了,于是你再改,再崩溃,再修改.....记得《人月神话》里那个在“焦油坑”挣扎的怪兽吗,越挣扎陷的越深,多么形象啊。

面向对象的出现,它的伟大之处就在于在机器与人之间找到新的平衡点。从人的角度而不再是CPU的角度来组织程序。小余说的“软件学的本质来说,面向对象并没有改变软件运行的本质,所改变的只是代码开发中问题处理和思维方式 ”是多么正确啊。但是不要小看它阿,正是这一点点改变,才是它的伟大之处。不再忽略开发中人的要素,才使我们构建更复杂的系统成为可能!如果没有OO,我无法想象现在会有如此多的优秀的软件产品。

究竟OO给我们带来了什么? 什么封装、多态,继承什么的我就不想多说了,比我理解的透的高人多了去了。我就说一下面向对象的核心原则:OCP。开发封闭原则,什么意思? 一言以蔽之:我们编写的程序,要能扩展,而且扩展的同时不需要改变已有的代码,上层逻辑的代码不需要根据具体实现的不同而改变。于是我们不再被变化拖入“焦油坑”,其意义真的不亚于一场革命!

现在的语言都是OO的了,什么C#,Java。但是现实的问题不是我们强调的面向对象不是太多,而是太少。用的OO语言干的面向过程的勾当这种事实在是太多太多了。你用了C#但你的程序可能和OCP边都沾不上。很多项目OO语言下其实就是一堆面向过程的程序,当初写代码的人一走,复用,维护,扩展都几乎是不可能的,很多项目的失败就是这个简单的原因。相反,我从来没看到过因为“过分”强调OO而导致项目失败的事。

当然我也细想了一下为什么有时候OO会被人诟病。我想这与我们对OO的一个误解有关:OO就是现实对象的隐射,实现OO就是要“道法自然”“一切皆对象”。这是误解也是很可笑的,如前所述OO是“代码开发中问题处理和思维方式”,根据解决问题的不同,甚至封装的变化点不同,最终得到的OO设计是不尽相同的。肯定不是现实中有什么你就要设计什么对象,更不能以现实对象的行为作为构建对象的依据。把问题简单化,忽略了这中间有个重要的抽象过程,难怪会被人抓住小辫子。比如我记得book.save()到底够不够OO的争论,在我看来这与现实中book能不能save自己是一点关系没有的,至于说够不够OO要你解决的上下文看。

至于对象设计的原则我推荐大家看《.net 设计规范》,其实这本书正确的翻译是《.net 框架设计规范》,讲的是微软的大牛们怎么设计.net框架里的对象的。其中的重要一点原则就是站在对象使用者最常用的使用场景下设计对象,简单说就是站在程序员的角度,看你们习惯怎么用,人家就怎么设计,这与敏捷开发中的测试驱动是异曲同工的。所以说OO的对象设计成什么样,到底这个设计够不够OO,都是由应用这个对象的人和应用场景决定的。

也许有人说我说了一堆废话,希望是这样。

posted on 2008-05-12 22:09  炭炭  阅读(1682)  评论(10编辑  收藏  举报