Annotation programming in my design code ..

Eugene Wissner via Digitalmars-d digitalmars-d at puremagic.com
Sun Jan 8 12:30:26 PST 2017


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!());".


More information about the Digitalmars-d mailing list