铜弹无毒


最近看了园子里的面向对象与过程之争,忍不住想说两句,因为我感觉这里面对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 @ 2008-05-12 22:09 炭炭 阅读(1137) 评论(10)  编辑 收藏

  回复  引用    
#1楼 2008-05-13 08:12 | 户籍民警@ [未注册用户]
人机交互,个人更倾向于是客户与计算机的交互,应该是软件更人性化。程序能不能扩展也不是oo可以解决的好的,还是看需求,没有万能的扩展,这样考虑可能变成一个极端,软件开发成本变大,准确的需求,加上前期对软件需求肯能改变的判断,比加个所谓的oo智能
  回复  引用  查看    
#2楼 2008-05-13 17:05 | BigRain      
非常认同!!!
  回复  引用  查看    
#3楼 2008-05-13 17:26 | 金色海洋(jyk)      
我还是想弄一个银弹出来。
  回复  引用  查看    
#4楼 2008-05-13 17:44 | 怪怪      
呵呵, 这个问题要真这么简单, 早就得出统一的结论了。

事实上很多国外的大师都对OO持不同的意见, 而且很多“优秀的软件作品”的作者也认为OO唯一被证明比较合适的领域是UI部分。 另外, OO绝对不是说得太少, 而是说的太多了; 不然谁能说出其他一种高层组织的方法论,其在开发社区出现的频率和研究的深度广度比的上OO呢?

有很多其他方法论被忽略了, 没有进行更深入的研究, 这说白了还是成本太高的缘故。 大到公司和组织要保护自己的人力物力和宣传投资, 小到个人保护自己进行学习和研究的精力投入。

我个人认为OO的确有可能存在本质性的缺陷,但这与OO的学习和使用, 却未必一定是矛盾的。 有缺陷的东西多了去了, 怎么用好才是关键的问题; 当然有兴趣的人也可以去研究其它的解决之道, 只是对立却毫无用处。
  回复  引用  查看    
#5楼 [楼主]2008-05-13 20:55 | 炭炭      
而且很多“优秀的软件作品”的作者也认为OO唯一被证明比较合适的领域是UI部分
————————
不是吧,.Net 框架不都是按照OO来组织的吗?
另外OO的本质缺陷是指什么呢?
  回复  引用  查看    
#6楼 [楼主]2008-05-13 20:58 | 炭炭      
@金色海洋(jyk)

弄出来,开发Windows这样的产品你组织一帮人也能搞了,你就是中国的Gates了。
  回复  引用  查看    
#7楼 2008-05-13 21:19 | 皇帝的新装      
起码我目前还没有看到比面向对象更好的或者更深入人心的方法论
  回复  引用  查看    
#8楼 2008-05-13 21:21 | 皇帝的新装      
在我的团队中也经常有搞出来就好的口号,但是没有哪个是真的搞的好的。如果采用的方法比面向对象都不如,就不要再说什么了,最好是shut up。
  回复  引用  查看    
#9楼 [楼主]2008-05-14 13:06 | 炭炭      
@皇帝的新装
同意
  回复  引用  查看    
#10楼 [楼主]2008-06-24 15:22 | 炭炭      
little_genuis@163.com

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接: