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