Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
January 06, 2017 Annotation programming in my design code .. | ||||
---|---|---|---|---|
| ||||
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@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; } } |
January 06, 2017 Re: Annotation programming in my design code .. | ||||
---|---|---|---|---|
| ||||
Posted in reply to Brian | 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@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. |
January 08, 2017 Re: Annotation programming in my design code .. | ||||
---|---|---|---|---|
| ||||
Posted in reply to Eugene Wissner | 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@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);
}
|
January 08, 2017 Re: Annotation programming in my design code .. | ||||
---|---|---|---|---|
| ||||
Posted in reply to Brian | 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@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!());". |
January 09, 2017 Re: Annotation programming in my design code .. | ||||
---|---|---|---|---|
| ||||
Posted in reply to Eugene Wissner | 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@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.
|
January 09, 2017 Re: Annotation programming in my design code .. | ||||
---|---|---|---|---|
| ||||
Posted in reply to Brian | On Monday, 9 January 2017 at 18:41:31 UTC, Brian wrote:
>
> I see, man!
>
> If the parent class cannot generate code for a subclass, it's not as good as a high-level programing language.
It isn't possible. mixin is interpeted at compile time and the parent class has no knowledge about its children.
|
Copyright © 1999-2021 by the D Language Foundation