争论到现在,我觉得已经有点偏离主体了,而且大家开始纠缠不清了,呵呵
我看应该按yysun的思路,将目前的几个核心问题揪出来,然后有针对性地进行讨论
首先,是gp到底是什么的问题。
我和yysun的观点的最大差别就是,template对于是gp来说到底处于什么
地位。我以为他是工具而不是目的,很有用但不是必须。C++和Delphi/java
一类语言有很大不同。前者为兼容C保留了很多东东,而且功能强大,灵活性大,
因此进化出了template这个工具,而且因为template的进化和GP的发展
可以说是相辅相成的,因此现有的很多资料包括yysun将两者混为一谈,认为离开了
template就没有gp。但是就像我前面分析的,gp实际上只是一种从更高层次上
进行抽象的方法论而已,这种思想体系映射到不同语言有不同实现方式。在C++
里面,通过template实现concept及类型无关;而在delphi/java里面以接口
及单根类树来实现。gp的核心思想是静态的算法与动态的操作元素分离,至于如何
分离只是体现这种思想的方式,而template恰恰处在这个地位,因此我说template
是实现gp的工具。当然因为我前面提到的原因,template对gp可以非常出色的贯彻
执行,有了template可以给使用者带来很大的便利。但并不能因为没有template
就称之不是gp。
举个不是很恰当的例子。在汇编语言里,本来是可以是没有循环语句的,可以通过
一系列的整数运算和条件判断语句,实现循环这个概念。(实际上以前在386下为了
优化程序效率,很多情况下用这种方式替代速度较慢的LOOP。而且在CPU的微指令一级,
循环肯定也是这样实现的)这时一种新的语言出现了,比如说PASCAL他提出了循环
这个概念的新实现,并且通过FOR,WHILE,DO等等关键字实现了他。新的语言中有效率
非常高、而且结构清晰、自动类型检测等等编译器级特性支持的循环实现,如果用惯了
这种新语言的人,可能就认为循环就是FOR,FOR就是循环。而实际上循环是一个思想,
他映射到汇编中是一系列整数操作和判断指令,映射到PASCAL里是FOR等编译器
内建支持语句,你能因为汇编没有FOR就说汇编里那些语句不是循环吗?就算是汇编
有LOOP,我用DEC ECX, JNZ Loop_Begin实现的难道不是循环吗?GP和template
的关系也类似于此,一个是思想,一个是技术,更本不是一个层面上的东西,你怎么
能把它绑到一起呢?
当然,这个例子运用在这里有他不妥之处,我只是借他说明一个道理而已。
其次,是类型安全
这里的主要分歧,大概就是一个检测时间、一个效率,两个问题。(检测时间指的是
类型判定是何时进行?编译时或运行时,template实现方式是前者,单根类树RTTI
检测是后者。)我觉得完全没有必要为孰优孰劣做争论。因为这在不同的应用范围中
有不同的需求。比如一个工作在内核中的网卡转包程序,对时间考虑的精度已经达到
ns级,你要他用RTTI肯定要有人发疯的
但是如果你对一个财务软件,数据库操作
本来就慢的要死,谁还在乎进行检测这十几个CPU周期?我的观点是,除非那些真正的
核心代码段,比如进行图象处理,网络程序的核心函数等等,其他大部分情况应该以程序的
简洁、易懂、或者说可维护性、可扩展性为主。毕竟大部分函数在你程序运行时,一共
也才执行几次,那种频繁执行的函数少之又少。何况这种非算法的优化实在是效果有限
不如等一年半你产品开发出来时买快一倍的CPU来得快,呵呵
你可以找个Turbo Profile之类的工具将你编写的各种程序测试一下,看看真正
经常调用的函数是那些,比例多大,复杂性多大。
但是,类型检测必须要有,而且范围越窄越好,因为人的因素是不确定的,必须以
技术约束来降低因为人的因素带来的潜在风险,这也是为什么我最喜欢C++语言,但是
平时做项目写程序多用Delphi的原因(因为C++太强大、太灵活,反之Pascal非常严谨)
最后,是GP与OO的关系
我前面文章里大概谈过我的一些看法,一个大概的发展路线是OO->IO(CO)->GP
(IO/CO指Interface-Oriented或者Component-Oriented,两者有区别但是联系很紧密)
但GP不仅仅是IO的发展,他还从Procedural Model和Object-Based Model
吸取了很多思想。前面dream_soft说看我把GP说得像Procedural Model,
其实两者本来就有很多相似之处,只是抽象的层次不同,应用的对象不同而已;
而GP在实现中更多地是以OB的形式而不是OO的形式,你看STL实现中virtual几乎没有
这也是GP与重要冲突OO的区别之一。因此GP不是简单的对某种现有model的发展或取代
他更多的是起到一种补充的作用,也就是说OO+GP+???来实现程序的构建。前面yysun
说GP有时并不比OO强,正确,因为GP和OO关注的问题域的角度不同,两者进行抽象的
方式不同,纯粹以OO进行设计的程序,会造成我前文中所提到的诸多弊端,如果能够辅以
GP思想,能够大大提高程序的可维护性、可扩充性、可复用性
总之……算了不多说了,要看球去了,呵呵