[技术贴]强大的DELPHI RTTI–兼谈需要了解多种开发语言

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

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

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

select * from Employee

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

TypeTPDSEmployee = class( TMProxyDataSet )publishedProperty 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 DoWith ListView1.Add DoBeginCaption := 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效率损失其实根本没有想像中那么大的影响。换来开发效率的大大提高还是很值得的。

BTW:抄了令狐的一段CSS(<pre>)。^O^

12 Replies to “[技术贴]强大的DELPHI RTTI–兼谈需要了解多种开发语言”

  1. 技术帖…… , 我也占個位置!我自己的工作中遇到, 經常是一開始, 定下個大概框架很容易, 但到後來, 各種 dataset 的交互, 就有點亂了!類與類的在一個系統中的關系, 要處理得很精巧, 需要很深的功力的感覺!>>动态性最高的對delphi的動態性這方面, 我所知不多! 期待新的討論!

  2. RTTI的确有很多好处,但是RTTI的一个大问题就是将语言本身的实现和程序代码绑定到了一起,RTTI功能越强,这种绑定越紧。猛禽说的XML的持久化倒是一个不错的思路,值得考虑。不过,还是效率问题。一个影响效率的RTTI加上一个影响效率的XML解析……

  3. 对于ARI那样的问题,现在好像流行用O/R mapping处理,不过我没用过,不好说。我这种数据集对象化只是一种简单的方法,对于不太复杂的应用可以把问题简化一些。要说动态,这个还是让令狐说说Python吧,这类的动态语言才是王道。不过说RTTI跟语言绑定,这是不可避免的。就像在C++里要实现lamda也是一件很难看的事。既然用了XML,RTTI的效率影响远远比不上XML parse的效率损失,可以忽略不计。更何况个人感觉XML Data Binding的效率也不比RTTI高。

  4. 说一句无聊的话,曾经大学里学习c++,不怎么喜欢,当我开发delphi的时候为vcl惊叹过,开始真正理解oo思想,后来搞java,模式和设计思想成为王道,最近看了一下boots方面的东西,发现c++依然是如此的美丽,我觉得回到原点啦:)

  5. 用DELPHI的RTTI实现数据集的简单对象化 (转)在《强大的DELPHIRTTI–兼谈需要了解多种开发语言》一文中,我说了一下我用DELPHI的RTTI实现了数据集的简单对象化。本文将详细介绍一下我的实现方法。

Leave a Reply

Your email address will not be published. Required fields are marked *