To yysun:
不用那么客气,“您”字听起来怪别扭的
我记得我曾经说过这样一句话,“范型编程思想是以与OO不同的角度看待问题域”。
的确,OO或者范型,只不过是一直抽象的方法而已,两者都是方法论,并不存在好坏之分,
只是对于不同的情况有着自己的优势和劣势而已。从最初的结构化,到后来的Object-Based,
到OO,到接口,到GP,到以后的Agent,其实都是在尝试着以更高的层次来抽象这个世界,
他们都有自己的思想体系,有自己的方法论,是独立的世界观。这些思想体系只是
基于不同的观察角度来诠释这个世界而已,并没有谁取代谁的必要性和可能性。
我前面的文章也只是阐述范型编程相对于现有其他思想体系的一些优势,并没有说OO
会被其取代啊。范型的优点也不是具有完全普遍性的,只是对于目前很多情况适用而已。
如果我的文中没有说明这个观点,造成了你的误解,请原谅。
实际上以我的理解,范型思想是可以很好地与OO想结合的。在OO思想看来,世界就是
由无数的对象组成的,这些对象通过抽象可以构造成一棵包含万事万物的类树
这可以说是OO的世界观(可能不全面,但我想也差不多:)。而在范型思想看来,世界分为
静态的和动态的两个部分(我的理解,不一定对)。静态的是那些具有普遍意义的行为,
或者说算法;动态的则是算法操作的对象,这些对象被容器组织起来。行为或者算法本身,
并不对某种特定类型的对象进行操作(这大概是你理解的类型无关抽象),而是通过Concept
(观念?概念?我不知道该怎么翻译)进行操作,这里的Concept本身就可以看作是一组
行为的集合,比如Input Iterator Concept包含*i, ++i, i++等等这些行为,
而容器本身也是一直Concept,比如Container Concept包含begin(), end(),
size()等等,算法只针对Concept进行设计,根本不去管具体的类型,因此称之为
Generic。因此,范型编程的抽象和OO中的抽象是有区别的,他们对世界分类的标准是
不同的。而且,范型思想的抽象层次可以说比OO又高了一层,因为从OO到接口,说到底
还是有类型的,到了GP,根本就连类型都没了,呵呵,只剩Concept了。因此,我认为
接口的思想是OO思想的进化表现,因为他抽象出了行为集;范型编程又是另一次进化,
他将接口中行为集与原来思想的唯一联系——类型也给割断了,就好像具有普遍意义的
接口一样。如果用过COM中的IEnumXXX一套接口,就可以体会出其中奥妙。
但是,范型思想也不是凭空存在的,因为他抽象的层次较高,必须挂接在其他
抽象方法上,比如OO。毕竟算法得有实现,而且要有操作对象,这些对象是OO最好的
用武之地。因此,我以为GP对OO不是取代而是改进,以GP的思想将OO中静止的那部分
抽出来,最大限度结合GP和OO才是正途。前者可以改善后者,特别是可以降低OO中
对象组织、互操作的复杂性;而后者是前者的基础,可以说没有OO、范型也没的玩,
起码实现起来复杂N倍。而且两者并没有什么直接的冲突。
至于template,我想我前面的文章已经说得很清楚了。你和前面朋友总是
认为范型就是template,template就是范型,这其实是错误的。那只是因为范型
思想现在在C++中实现得非常出色,而且基本上范型思想的发展就是随着C++一路
发展下来的,好像范型就是template。其实不然,范型的真正意义在于其通过
Concept这个渠道进行设计,他在设计时根本就不去考虑什么类型,什么存储,
所有需要考虑的就是提供的不同Concepts,比如设计一个find,我需要两个
Input Iterator Concept的Model定义一个查找范围,然后一个需要查找的值
这个值本身就是一类Concept,其行为是可进行比较等等(operator ==())。
然后我就可以设计出这个find,从头到尾就和类型不搭边。真正需要和操作对象打交道时,
委托给那些Concept的Model去干,比如Input Iterator Concept有++i, i++
行为,可以遍历一个Container Concept,如果需要随机访问就得有一个
modal of Random Access Iterator Concept等等
映射到实现中就是一组算法,一组Iterator,一组Container,诸如此类的东东
注意,这里只是一个映射而已。也就是说,我在C++里可以把这些Concept映射成以
Template实现的class,我在delphi/java里一样可以映射成对单根的ADT进行操作的class,
只要实现了这些Concept,算法本身就是静态的,就可以说他是遵循GP思想的。
至于Template实现GP的优势,我也非常喜欢。但这并不意味着GP只能以Template实现
例如在Delphi/java这一点的单根类结构中,也可以实现这些行为。
好了,手也敲累了,先说到这里吧,明天有精神再说