Annotation programming in my design code ..

Brian via Digitalmars-d digitalmars-d at puremagic.com
Mon Jan 9 10:41:31 PST 2017


On Sunday, 8 January 2017 at 20:30:26 UTC, Eugene Wissner wrote:
> On Sunday, 8 January 2017 at 20:11:23 UTC, Brian wrote:
>> On Friday, 6 January 2017 at 17:48:23 UTC, Eugene Wissner 
>> wrote:
>>> On Friday, 6 January 2017 at 17:44:13 UTC, Brian wrote:
>>>> I would like to design features, how should I do?
>>>>
>>>> coding:
>>>>
>>>> class User
>>>> {
>>>> 	@GenerateProperty
>>>> 	int id;
>>>> 	
>>>> 	@GenerateProperty
>>>> 	string name;
>>>> }
>>>>
>>>> struct GenerateProperty
>>>> {
>>>> 	this(string propertyName)
>>>> 	{
>>>> 		propertyName = propertyName
>>>> 	}
>>>> 	
>>>> 	string propertyName;
>>>> 	
>>>> 	string getGenerateCode()
>>>> 	{
>>>> 		return "@property int " ~ propertyName ~ "() { return __" 
>>>> ~ propertyName ~ "; }\n at property int " ~ propertyName ~ 
>>>> "(int value) { return __" ~ propertyName ~ " = value; }";
>>>> 	}
>>>> }
>>>>
>>>> result code:
>>>>
>>>> class User
>>>> {
>>>>     @property int id() { return __id; }
>>>>     @property int id(int value) { return __id = value; }
>>>> 	
>>>>     @property string name() { return __name; }
>>>>     @property string name(int value) { return __name = 
>>>> value; }
>>>> 	
>>>> 	private
>>>> 	{
>>>> 		int __id;
>>>> 		string __name;
>>>> 	}
>>>> }
>>>
>>> Look into https://github.com/funkwerk/accessors for the 
>>> implementation.
>>> You should have a mixin which iterates through all class 
>>> members and generates the properties.
>>
>> Can write this code to impl it?
>>
>> import accessors;
>> import std.stdio;
>>
>> class Base
>> {
>>     mixin(GenerateFieldAccessors);
>> }
>>
>> class Person : Base
>> {
>>     @Read @Write
>>     private uint age_;
>>
>>     @ConstRead
>>     private string name_;
>>
>>     this(in string name, in uint age = 0)
>>     {
>>         this.name_ = name;
>>         this.age_ = age;
>>     }
>> }
>>
>> void main()
>> {
>>     auto person = new Person("Saul Kripke");
>>
>>     person.age = 57;
>>
>>     writeln(person.name, ": ", person.age);
>> }
>
> I think you have to include "mixin(GenerateFieldAccessors);" 
> into "Person" class. accessors has currently a problem with 
> inheritance. We're looking for a way to fix it.
> I gave a link, so you can take a look how it is implemented. 
> But you can also use the library if it meets your needs :)
> But yes you can define a enum mixin which iterates through the 
> class members and generates the code:
>
> template GenerateFieldAccessorMethods()
> {
>     static enum GenerateFieldAccessorMethods()
>     {
>         foreach (name; __traits(allMembers, typeof(this)))
>         {
>             return "Generated code";
>         }
> }
>
> and then you can include it in the class/struct with 
> "mixin(GenerateFieldAccessorMethods!());".

I see, man!

If the parent class cannot generate code for a subclass, it's not 
as good as a high-level programing language.



More information about the Digitalmars-d mailing list