我不完全同意yysun的看法。范型编程的意义并不是只在于效率。
无可非议,效率是非常重要的,但并不是判定的唯一标准,在Delphi
的很多应用范围里,效率并不是首要考虑因素。计算机发展到今天,
软件的发展速度远远被硬件甩在后面,与其担心那些效率问题,不如
花更多精力将逻辑实现的清晰明了,毕竟一个系统使用中最大的经费开销
在于软件的维护,而不是硬件。何况这种非算法的优化,真正起到的作用
并不大,也许对特定的程序来说有意义,但对绝大多数的应用来说,程序
的简洁明了,可维护性更重要。
其次是模板。前面很多文章似乎将模板和范型编程混为一谈,而实际上
模板只是实现范型编程思想的工具而已。C++和Java, Delphi不同,没有
一个单根类结构,因此无法方便地以RTTI实现类型的检测。对C++来说,
模板也许是最好的解决方法,他具有效率高,编译时类型检测等等优点;
但对于其他语言来说,模板并不是唯一的解决方案。只是现在C++以模板
成功地实现了范型编程的思想,谁又能说范型编程不能以其他方式实现?
至于范型编程,我以为他是一个完整的思想体系,并不仅仅只是一种技术,
他以与OO不同的角度看待问题域,通过将动态的操作元素集和静态的算法分离
来达到抽象的目的,他的优势在于抽象出了真正具有普遍性的行为,这种行为
的对象是无差别的操作元素,不管是模板中的T也好,单根类树中的ADT也好,
都只是这种思想的体现而已。
因此,我以为不论以什么方式实现,只要能体现出范型编程思想的这种
操作对象类型无关性,就可以说他是遵循范型编程思想。使用遵循这种思想的
程序,就取得得到范型编程的优势。去争论什么效率,争论该用什么技术不该
用什么技术是无意义的,最终程序员需要的是从这种思想或技术中获得生产力
的提高。其间肯定要付出一些代价,如使用模板时程序编写、调试的复杂性;
运行时使用RTTI后效率的降低等等。但只要这种代价小于使用后的收益,我想
大家就都会乐意使用的。
下面是我从DeCal文档里摘出的几个使用范型编程的例子,看过这几个例子
你就会认识到去争论什么应不应该实现、能否实现都是毫无意义的,现在关键
在于如何去实现,如何既能体现范型编程的优势,又能在效率上最优,
这才是实际问题。
例1:在选修两个课程的学生中找出成绩80分以上的学生,并按名字排序
Procedure test;
Var
class1, class2 : DMap;
GoodStudents : DArray;
I : Integer;
Iter1, Iter2 : DIterator;
Begin
// fill our classes with random students and grades
class1 := DMap.Create;
class2 := DMap.Create;
for I := 1 to 25 do
begin
class1.putPair([Random(100), RandomName]);
class2.putPair([Random(100), RandomName]);
end;
goodStudents := DArray.Create;
iter1 := class1.lower_bound([80]);
iter2 := class2.lower_bound([80]);
setIntersectionIn(iter1, class1.finish, iter2, class2.finish, goodStudents.finish);
reverse(goodStudents);
PrintContainer(goodStudents);
FreeAll([class1, class2, GoodStudents]);
End;
想想如果用TList,你实现这些功能所需的代码量、复杂度、可维护性,
谁敢说这不是范型编程优势的体现?以范型编程思想开发的程序,将远远优于普通程序。
当然,C++在范型编程方面远远领先于其他语言,DeCal还有很多不足之处,
Delphi语法有其固有的限制(但绝对不要小看他),但前途是美好的。
btw:我这两天正在考虑范型编程思想Delphi实现的一些思路,大概写了一两千行代码,
尝试了两三种思路,不知哪位也在实际动手,我们可以互相探讨一下?