風焱在《“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效率損失其實根本沒有想像中那麼大的影響。換來開發效率的大大提高還是很值得的。