<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, Sep 19, 2014 at 9:08 PM, Boian Mitov <span dir="ltr"><<a href="mailto:mitov@mitov.com" target="_blank">mitov@mitov.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"> Hi Hans,<br>
<br>
I am sorry to disagree with you.<br></blockquote><div><br></div><div>+1.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
The attributes in particular allow you to do real magic, and reduce your code by at least 4 times, and speed up your development up to 10 times.<br></blockquote><div><br></div><div>I tested the new RTTI in Delphi XE and it reduced my typing alot. See:</div><div><br></div><div>(* credits: <a href="https://code.google.com/p/delphi-orm/">https://code.google.com/p/delphi-orm/</a> *)</div><div><div>var</div><div>  person: TPerson; oid: Integer;</div><div>begin</div><div>  person := TPerson.Create('Daniele', 'Teti',32);</div><div>  Session.Save(person);</div><div>  oid := <a href="http://person.id">person.id</a>;</div><div>  person.Free;</div><div>...</div><div>  person := Session.Load<TPerson>(oid);</div><div>  WriteLn(‘Person name is: ‘, person.FirstName);</div><div>  person.Free;</div><div>end;</div></div><div><br></div><div>I'm using an approach like this in Android development (with Java: <a href="http://ormlite.com/sqlite_java_android_orm.shtml">http://ormlite.com/sqlite_java_android_orm.shtml</a>).</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
We have done that in Delphi.<br>
I actually did a session in the PasCon few days on that.<br>
Here is example:<br>
<br>
TMyInterfacedClass1 = class;<br>
<br>
[CreateType( typeinfo( TMyInterfacedClass1 ))] // Specifies the default creation type as TMyInterfacedClass1<br>
IMyInterface = interface<br>
 ['{EB12CEBD-42C3-4259-AE2C-<u></u>70267B67F454}']<br>
<br>
 function GetValue() : String;<br>
<br>
end;<br>
<br>
TMyInterfacedClass1 = class( TBasicInterfacedObject, IMyInterface )<br>
public<br>
 function GetValue() : String;<br>
<br>
end;<br>
<br>
TMyInterfacedClass2 = class( TBasicInterfacedObject, IMyInterface )<br>
public<br>
 function GetValue() : String;<br>
<br>
end;<br>
<br>
TMyNestedClass = class( TBasicObject )<br>
protected<br>
 [Default( True )] // FValue1 will be initialized with True<br>
 FValue1 : Boolean;<br>
<br>
 [Default( 11.5 )] // FValue2 will be initialized with 11.5<br>
 FValue2 : Real;<br>
<br>
 [AutoManage( TMyInterfacedClass2 )] // FInterfaceValue will be created as TMyInterfacedClass2<br>
 FInterfaceValue  : IMyInterface;<br>
<br>
public<br>
 property Value1 : Boolean               read FValue1;<br>
 property Value2 : Real                  read FValue2;<br>
 property InterfaceValue : IMyInterface  read FInterfaceValue;<br>
<br>
end;<br>
<br>
TMyClass = class( TBasicObject )<br>
protected<br>
 [Default( 100 )] // FValue1 will be initialized with 100<br>
 FValue1   : Integer;<br>
<br>
 [Default( 'Helo World!' )]<br>
 FValue2   : String; // FValue1 will be initialized with 'Helo World!'<br>
<br>
 [AutoManage] // FNested will be automatically created and destroyed<br>
 FNested   : TMyNestedClass;<br>
<br>
 [AutoManage( TStringList )] // FStrings will be automatically created as TStringList and destroyed<br>
 // [AutoDestroy] // - If AutoDestroy is used instead of AutoManage, the object will not be created but will be automatically destroyed!<br>
 FStrings  : TStrings;<br>
<br>
 [AutoManage] // FNested will be automatically created as TStringArrayList<br>
 FStringArrayList  : IStringArrayList;<br>
<br>
 [AutoManage]  // FInterfaceValue will be created as TMyInterfacedClass1<br>
 FInterfaceValue  : IMyInterface;<br>
<br>
public<br>
 property Value1 : Integer                   read FValue1;<br>
 property Value2 : String                    read FValue2;<br>
 property Nested : TMyNestedClass            read FNested;<br>
 property Strings : TStrings                 read FStrings;<br>
 property StringArrayList : IStringArrayList read FStringArrayList;<br>
 property InterfaceValue : IMyInterface      read FInterfaceValue;<br>
<br>
end;<br></blockquote><div><br></div><div>I intend to do the following if the new RTTI  (of Delphi XE) come in FPC 2.8.0 (like Java annotations):<br></div><div><br></div><div><div class="gmail_quote" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px">TPerson = class(TObject) // or TSerializableObject</div><div class="gmail_quote" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px">published</div><div class="gmail_quote" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px">  { @code(Id): Field used to store the ID of each *Person*. }</div><div class="gmail_quote" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px">  ['integer', 'notnull', 'autoinc', 'primarykey']</div><div class="gmail_quote" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px">  property Id: Int64;</div><div class="gmail_quote" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px">  { @code(Name): Field used to store the name of each *Person*. }</div><div class="gmail_quote" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px">  ['string:50', 'nonull', 'unique']</div><div class="gmail_quote" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px">  property Name: string;</div><div class="gmail_quote" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px">end;</div></div><div class="gmail_quote" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px"><br></div><div class="gmail_quote" style="margin:0px;padding:0px;border:0px;vertical-align:baseline"><font face="Arial, Helvetica, sans-serif">And from this object above, my framework will generate the metadata for the table creation, generation of HTML/JS forms, generation of object mappers, generation of CRUD web actions with their REST paths, generation of documentation and UML, among others.</font><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
As you can see all the management of all the classes and interfaces is done without the need of even one line of code.<br>
No constructors, no destructors, nothing.<br>
This alone cuts vast amounts of code.<br>
This however only scratches the surface of the RTTI power. You have no idea about some of the other possibilities ;-) .<br>
The RTTI does not only work with properties and fields, but with functions as well, allowing easy implementation of RPC and network distributed execution.<br>
It is a whole ball game.<br>
Frankly some of the arguments you provide ware the same I have heard 20 years ago when I programmed in C++ and people ware telling me I should be doing it in Assembler.<br>
They simply had no idea what power OOP had as example, as you probably have no idea what is the real power of modern RTTI when properly used.<br>
<br>
I am at the same time huge fan of strong typed languages. The advanced RTTI does not really mean the code should and will not be strongly typed. Indeed I have done my own RTTI API which is stronger typed than the one Delphi provides.</blockquote><div><br></div><div>I was very curious to see your RTTI API. :-)<br></div><div><br></div></div>-- <br>Silvio Clécio<br>My public projects - <a href="http://github.com/silvioprog" target="_blank">github.com/silvioprog</a>
</div></div>