В связи с недавним обсуждением о том как плохо выставлять наружу public instance поля, да еще и в камальКейзе именованные предлагаю следующее решение.
На входе имеем:
variant X
{
| Foo { a : string; mutable b : int }
}
На выходе:
abstract class X
{
public sealed class Foo : X
{
private a : stirng;
[VariantOptionField("a", 0)]
public A : string { get { a } }
private mutable b : int;
[VariantOptionField("b", 1)]
public B : int { get { b } set { b = value } }
public this(a : string, b : int) { this.a = a; this.b = b; }
}
}
Атрибут VariantOptionField содержит имя поля при объявлении а также его позицию.
Имя свойства генерируется по правилам макроса Accessor: _some____foo_bar -> SomeFooBar.
Здравствуйте, hardcase, Вы писали:
H>В связи с недавним обсуждением о том как плохо выставлять наружу public instance поля, да еще и в камальКейзе именованные предлагаю следующее решение.
Спасибо за предложение
H>На входе имеем:
H>variant X
H>{
H>| Foo { a : string; mutable b : int }
H>}
А почему не
variant X
{
| Foo { A : string; mutable B : int }
}
По историческим причинам? OK. Только давайте, что бы можно было бы и так как я написать и имя параметра (и имя поля) получилось бы в камэлКейс?
H>На выходе:
H>abstract class X
H>{
H> public sealed class Foo : X
H> {
H> private a : string;
H> [VariantOptionField("a", 0)]
H> public A : string { get { a } }
H> private mutable b : int;
H> [VariantOptionField("b", 1)]
H> public B : int { get { b } set { b = value } }
H> public this(a : string, b : int) { this.a = a; this.b = b; }
H> }
H>}
Кстати, но я бы концевым параметрам конструктора, соответствующим изменяемым полям/свойствам в конструкторе указал бы значения по-умолчанию:
H> public this(a : string, b : int= 0) { this.a = a; this.b = b; }
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, hardcase, Вы писали:
H>В связи с недавним обсуждением о том как плохо выставлять наружу public instance поля, да еще и в камальКейзе именованные предлагаю следующее решение.
Кстати, то же (свойства/case) надо продумать и для Records.
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, hardcase, Вы писали:
_FR>>>Кстати, то же (свойства/case) надо продумать и для Records.
H>>Records — это что?
_FR>
_FR> [Record]
_FR> public class Identifier : Located
_FR> {
_FR> [Accessor] Id : string;
_FR> public override ToString() : string
_FR> {
_FR> id
_FR> }
_FR> }
_FR>
_FR>Тут следует применить ту же логику, что и с вариантами.
Зачем? Макрос [Accessor] какраз генерирует свойство для поля.
Здравствуйте, hardcase, Вы писали:
H>В связи с недавним обсуждением о том как плохо выставлять наружу public instance поля, да еще и в камальКейзе именованные предлагаю следующее решение.
Почему не наоборот, пишем UpperCase, а имя поле генерируется в _lowerCase ?
На входе
variant X
{
| Foo { A : string; mutable b : int }
}
На выходе
abstract class X
{
public sealed class Foo : X
{
private _a : string;
[VariantOptionField("_a", 0)]
public A : string { get { _a } }
private mutable _b : int;
[VariantOptionField("_b", 1)]
public b : int { get { _b } set { b = value } }
public this(a : string, b : int) { this._a = a; this._b = b; }
}
}