`
庄表伟
  • 浏览: 1150593 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

敲响OO时代的丧钟——重用为什么那么难?

阅读更多
先说句提外话,由于徐昊的推荐,我在网上找到了《Modern C++ Design》繁体中文版的前四章PDF文件。果然不出我所料,Loki的设计思路与我的随后将会介绍的自己的设计实现,实有异曲同工之妙。对于C++的熟悉程度超过Java的某同学,可以先去看看这本书,如果能够同意书中的观点,再来与我讨论,相信会得到更多的收获。

程序员都是聪明人,没有谁愿意干重复劳动这样的傻事,因此,程序中出现重复代码是程序员的耻辱。就算不能消除重复代码,至少也可以对于相同的功能,用不同的代码来实现所以发明新轮子的程序员才会那么多。
 
面向对象作为一种横空出世的新技术,首先承诺的就是“更好的重用性”,而“重用性”这样一个闪闪发光的词,也的确能够吸引程序员的实现,那么多新的理论、新的技术、新的方法、新的框架、新的思想,用来说服别人接受的一个最大的理由,就是“更好的重用性”。然而,OO以及一直以来不断发展的OO相关技术,对于重用性的提高,作出了多大的贡献呢?
 
 
在面向过程的时代,重用很简单,就是代码的重用,函数、函数库、模板、模板库。如此而已。在ADT出现之后,世界分裂了。代码重用的需求,现在分裂为三个部分:数据类型的重用、ADT内部代码的重用、操作ADT的代码的重用。
 
这句话特别关键,让我再仔细分析给大家看看:ADT=抽象数据类型。就是封装了操作和数据的一种用户自定义数据类型。
 
1、如果仅仅是ADT,那么相近的用户自定义数据类型就无法重用,因此出现了一个数据类型的重用需求;
2、因为ADT封装了对于数据的操作,对于A类数据的操作,就无法被B类数据重用,因此出现了一个ADT内部代码的重用需求;
3、因为对于ADT的操作是借助ADT的外部界面执行的,也就是说,对于接近但是不同的类型的操作,必须写出不同的代码,因此出现了对于操作ADT的代码的重用需求。
 
这样的分裂的三个需求,在随后的OO的发展历史中,分别被两种方法来初步满足。第一、第二种需求,被继承这样的技术来试图满足;第三种技术被泛型类试图满足。这两个技术满足了三种重用的需求了吗?没有!不但没有满足,而且还带来的诸多麻烦的问题,更在分别满足三种需求的时候,起了冲突。(前面已经讨论过的内容,可以回头再看一看,我将来再改写这篇文章的时候,会将封装 VS. 重用性的分析,作为一根主线贯穿OO分析的始终,现在就不重新组织结构了。)
 
由于封装与重用性之间,存在着本质性的冲突,因此,OO的分析、设计、编程方法就始终处于一个难学、难用、难懂的状态。我们说给OO下定义非常困难,但是大家都应该承认,ADT是OO的根。数据与操作的封装是一切OO思想的基础,也是所有OO信奉者从来没有怀疑的“前提”!
 
在继承与泛型不能解决重用难题之后,OO大师们提出了OO设计原则,提出了OO设计模式,这是我接下来的文章里将要细细批驳的两大“贡献”。但是OO的原则、模式,依然没有解决重用难题。在此之后,又有人提出了AOP、IoC这样的概念,还有人真正开始和我一样怀疑封装的意义,而开发了CGLib,Mixin这样的动态改变对象行为与结构的技术,这也是我将要批判的“最新进展”。到了这个时候,真正理解OO本质的人,应该已经看出来了,OO时代即将结束,因OO而带来的混乱也该结束了。现在唯一的问题是:“什么样的技术,才是可行的、替代的方案呢?”
 
(未完待续)
 
下三节预告:
《OO设计原则批判》
《设计模式批判》
《OO新技术批判》
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics