精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2005-07-04
接口在java中的意义在于把类型的职责从类中分离出来,这样类的职责就纯化为实现的容器,以这种方式实现“Design By Contract”。
开始的时候,继承在OO观念中占有重要的地位,试图以继承树来描述现实世界关系,但后来发现这样问题很多,首先,在java这样的单继承语言中,单颗继承树根本无法描述复杂的现实情况,以致后来弄出一个著名的“组合优于继承”。在C++这样的多继承语言中,情况也好不到哪里去,C++实现的多继承只在非常有限而特殊的情况能带来好处,代价却是让语言复杂了很多,因使用多继承带来的问题更是多多,我觉得是得不偿失了。 再回过头来,在java中,继承更多的是作为实现子类型的多态的技术手段,因为不宜使用过深的继承等级。而且java作为一种静态类型语言,类型的自动提升和转化在缺乏操作符重载的支持下是很难做好的,因此实现GP是很困难的——java1.5的GP是不是真正意义上的GP还值得看看哩(还没接触过jdk1.5,呵呵)。 恩,所有的问题的都归结为类型系统,对于这个,脑子里还比较混乱:( |
|
返回顶楼 | |
发表时间:2005-07-04
我还是得反复强调,OO设计的价值并不在于所谓的“代码重用”或者“接口重用”,任何一种设计方法都能够获得“重用”的能力,就算是写汇编一样可以“重用”。Coder们总是反反复复对所谓的“重用”津津乐道,好象能够重用就是什么了不起的伟大成就,看看其他产品设计,就拿战斗机来说吧,最古老的战斗机就是一把机枪固定在非机上,后来武器种类多了才增加挂载器,可以挂载各种类型的武器,拿OOer们的行话来说就是所谓的“接口”,这种事情本来就是天经地义,难道飞机设计师们会傻到去为每种武器设计一部专用飞机吗?但是这种事情到了Coder那里好象就变成伟大创举了:哇噻,我的设计重用了整部飞机啊,今年的银蛋奖必定是非我莫属!
现在的OO理论是太多,而不是太少,无论是泛型、模版还是design pattern之类都过于重视卖弄某些技巧性的东西,实际上对OO的发展并没有太多正面的影响。经过这么多年的发展,OO确实应该进入反思时代,现在应该停下来好好的总结过去的种种经验,将OO真正的核心价值提炼出来,把一些看起来感觉良好但完全不实用的东西抛弃或者边缘化,精炼的OO才是最宝贵的财富。 从现有的篇幅来看,庄对于OO的批评主要还是集中OO在某些理论上含糊不清的矛盾之处及某些被过度炒作的概念或者技巧上,但是这些东西并不能代表OO的核心价值,即使某天完全消失了OO世界也会照常运转下去,所以这种批评更象是为OO思想去伪存真的善举。 |
|
返回顶楼 | |
发表时间:2005-07-05
age0 写道 我还是得反复强调,OO设计的价值并不在于所谓的“代码重用”或者“接口重用”,...
将OO真正的核心价值提炼出来... what is "OO真正的核心价值" in your opinion? |
|
返回顶楼 | |
发表时间:2005-07-05
buaawhl 写道 age0 写道 我还是得反复强调,OO设计的价值并不在于所谓的“代码重用”或者“接口重用”,...
将OO真正的核心价值提炼出来... what is "OO真正的核心价值" in your opinion? 我在想也许age0和我的想法一样!OO的本质应该是提供比面向过程更强的结构化能力. |
|
返回顶楼 | |
发表时间:2005-07-05
重用为什么那么难?
http://spaces.msn.com/members/zbw25/Blog/cns!1pA6-3FOo9yNp_4lmEHxdDqA!279.entry |
|
返回顶楼 | |
发表时间:2005-07-06
这句话特别关键,让我再仔细分析给大家看看:ADT=抽象数据类型。就是封装了操作和数据的一种用户自定义数据类型。 |
|
返回顶楼 | |
发表时间:2005-07-06
OOer们总是喜欢吹嘘“XX重用”,谎言说上一千遍,就成了真理。
对于这种赤裸裸的谎言,简单的面向过程案例就可以将其华丽的轰至渣。 还是解码器的案例,标准的输入输出接口,可置换的解码芯片。 OO设计1 class device1 { Input();; Output();; Decode();; } class device2 { Input();; Output();; Decode();; } usage: // 解码方案1 Device1 d1 = new Device1();; d1.Input();; d1.Decode();; d1.Output();; // 解码方案2 Device2 d2 = new Device2();; d2.Input();; d2.Decode();; d2.Output();; Input和Output写了两遍,看起来确实很愚蠢 OO设计2 class device { Input();; Output();; virtual Decode();; } class device1 : device { override Decode();; } class device2 : device { override Decode();; } usage: // 解码方案1 device d = new device1();; d.Input();; d.Decode();; d.Output();; // 解码方案2 device d = new device2();; d.Input();; d.Decode();; d.Output();; 使用继承及接口技术,重用了Input、Output的实现及Decode的接口,看起来好象很伟大 设计3 看看面向过程 Input();; Output();; Decode1();; Decode2();; usage: // 解码方案1 Input();; Output();; Decode1();; // 解码方案2 Input();; Output();; Decode2();; 设计2和设计3基本上是等价的,设计1则最愚蠢。在面向过程的设计理念中,Once and Only Once 本来就是最天经地义的事情,同一件事不会去做两遍,OO的继承及接口机制不过是使OOer们能够避免愚蠢设计回归到正常设计而已,犯不着整天挂着“重用”的美名自娱自乐。 |
|
返回顶楼 | |
发表时间:2005-07-06
// 解码方案1 Input();; Output();; Decode1();; // 解码方案2 Input();; Output();; Decode2();; 难度这client的重复代码便不算重复代码了么? 若是有人将这解码器的程序写至你这样,便素该杀亚。 |
|
返回顶楼 | |
发表时间:2005-07-06
age0,拜托,你对OO中的模板技术,再了解了解然后再来说吧。
|
|
返回顶楼 | |
发表时间:2005-07-06
注意模板和OO没有关系,只是现在的模板大多数是针对类型的(所谓的泛型),这和OO面向类型的特性往往还比较一致。
|
|
返回顶楼 | |