强大的DELPHI RTTI--兼谈需要了解多种开发语言

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 raptor 的 blog

风焱在《“18般武艺”?》中说到他碰上的被多种语言纠缠的问题。我在回复里说:
 很多语言只要能看懂几分就行了,没必要每一种都精通
但是如果只会很少的一两种语言也是不行的。

因为看了一些关于java的反射技术的应用,忽然想到delphi的rtti也很强,于是试着拿数据集下手,用rtti来实现它的对象化。用了两个晚上时间就搞定了(要不是因为开始时搞错对象--基类用了tobject,其实应该是用tpersistent才对),果然很简单。

假设有一个adodataset控件,连接罗斯文数据库,sql为:

select * from employee

现在要把它的内容中employeeid, firstname, lastname三个字段显示到listview里。我通过rtti实现了一个数据集代理类,使得代码得到大大的简化(这两天争取把结果整理出来另外撰文说明)。其结果大致如下:

type
  tpdsemployee = class( tmproxydataset )
  published
    property employeeid : integer index 0 read getinteger write setinteger;
    property firstname : string index 1 read getstring write setstring;
    property lastname : string index 2 read getstring write setstring;
  end;
...
emp := tpdsemployee.create( adodataset1 );
while emp.foreach do
    with listview1.add do
    begin
      caption := inttostr( emp.employeeid );
      subitems.add( emp.firstname );
      subitems.add( emp.lastname );
    end;
emp.free;

对比传统的实现代码,好处是显尔易见的。

但是当我实现出这个tmproxydataset类后,不禁感到痛心疾首,这个我早在三年前就应该想到的。

三年前delphi6刚推出时,我就发现它的soap功能是通过delphi强大的rtti来实现的,我为什么当时没有想到去深入研究一下delphi的rtti呢?

这次要不是因为看到了一些java的资料,我可能还是想不到,所以多了解一些别的语言是很重要的事。特别是最近以来,动态语言越来受到关注,虽然它们在性能上不能跟原生开发相比,但在很多的开发思想上,具有重要的启发意义。

在做了这个东东以后,我才意识到,delphi其实是所有原生开发语言中,动态性最高的,并不比基于虚拟机的java和c#低多少。只是长期在做rad的开发,没有体会到而已。程序员在rad下被惯坏了。

做完这个,我打算下一步再试试用rtti实现对象的xml持久化(基本上就是抄袭一下delphi本身的soap实现代码-_-|||)。这个思路应该会比我原先用的xml data binding要方便很多,至少不用再去写那个麻烦的xml schema了。

btw:以前没有太关注rtti,效率恐怕是其中最重要的一个原因,但是现在看来,跟虚拟机语言甚至动态语言相比,delphi作为原生应用开发,这点rtti效率损失其实根本没有想像中那么大的影响。换来开发效率的大大提高还是很值得的。

本文关键:强大的DELPHI RTTI--兼谈需要了解多种开发语言
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top