Инициализатор свойства
От: hardcase Пират http://nemerle.org
Дата: 25.08.11 14:33
Оценка: 11 (1)
Наверное все здесь присутствующие в курсе существования макры Accessor. Им вполне можно пользоваться, да только код выглядит не особенно красиво, автосвойства читать легче и удобнее — они исходят из описания интерфейса класса.

Подход Accessor-а к объявлению свойств ведет к следующим минусам:
1) настройка модификаторов видимости свойства аргументами макроса
2) невозможность вводить различные модификаторы для акцессоров (т.е.: get {...} internal set {...})
2) неудобно вешать атрибуты на свойства

Единственная фича, которая есть у Accessor-а, и которой нет у автосвойств — это возможность задать начальное значение полю.
Именно этот синтаксис хочется прикрутить к объявлению автосвойства.

Предлагается ввести следующий синтаксис (get, set, default могут идти в любом порядке) и воплотив его объявить Accessor устаревшим:
public Foo : int { get; set; default = 10; }
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Инициализатор свойства
От: hi_octane Беларусь  
Дата: 25.08.11 14:37
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Предлагается ввести следующий синтаксис (get, set, default могут идти в любом порядке) и воплотив его объявить Accessor устаревшим:

H>
H>public Foo : int { get; set; default = 10; }
H>


А почему бы тогда не приблизить эту запись к записи инициализаторов полей?

Foo : int = 10 { get; set; }
или
Foo : int { get; set; } = 10;
Re[2]: Инициализатор свойства
От: hardcase Пират http://nemerle.org
Дата: 25.08.11 15:50
Оценка: 2 (1) +2
Здравствуйте, hi_octane, Вы писали:

_>Здравствуйте, hardcase, Вы писали:


H>>Предлагается ввести следующий синтаксис (get, set, default могут идти в любом порядке) и воплотив его объявить Accessor устаревшим:

H>>
H>>public Foo : int { get; set; default = 10; }
H>>


_>А почему бы тогда не приблизить эту запись к записи инициализаторов полей?


_>
_>Foo : int = 10 { get; set; }
_>или
_>Foo : int { get; set; } = 10;
_>


Первое будет конфликтовать с объявлением поля в indent-синтаксисе, а усложнять парсер для такой простой фичи я не вижу смысла.
И оба решения плохо выглядят в случае, если выражение инициализации будет занимать более одной строки.
Решение с { get; set; default = очень_много_закорючек } визуально ограничивает выражение инициализации.


P.S. Если же подходить к этому вопросу совсем глобально, то конечно, объявление свойства должно быть максимально простым — т.е. текущий синтаксис поля должен по сути быть объявлением свойства. А поля, если они все же необходима, объявлять c ключевым словом field.
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Инициализатор свойства
От: para  
Дата: 25.08.11 16:17
Оценка:
Здравствуйте, hardcase, Вы писали:
H>
H>public Foo : int { get; set; default = 10; }
H>


а если надо чтоб поле было неизменяемым, но с аксессором?
Re[2]: Инициализатор свойства
От: hardcase Пират http://nemerle.org
Дата: 25.08.11 16:22
Оценка:
Здравствуйте, para, Вы писали:

P>Здравствуйте, hardcase, Вы писали:

H>>
H>>public Foo : int { get; set; default = 10; }
H>>


P>а если надо чтоб поле было неизменяемым, но с аксессором?


Какое поле? Тут же свойство
get-only свойства у нас уже есть.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: Инициализатор свойства
От: para  
Дата: 25.08.11 16:39
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Какое поле? Тут же свойство

я имею в виду аналог
[Accessor]
private def _x : int = 100;

H>get-only свойства у нас уже есть.
приведи пожалуйста пример, а то мне что-то не попадалось на глаза
что-то типа:...?
public X : int { get; }

которое раскрывается в неизменяемое поле?
Re[4]: Инициализатор свойства
От: hardcase Пират http://nemerle.org
Дата: 25.08.11 16:47
Оценка:
Здравствуйте, para, Вы писали:

P>Здравствуйте, hardcase, Вы писали:


H>>Какое поле? Тут же свойство

P>я имею в виду аналог
P>
P>[Accessor]
P>private def _x : int = 100;
P>

H>>get-only свойства у нас уже есть.
P>приведи пожалуйста пример, а то мне что-то не попадалось на глаза

См. первое сообщение.
public X : int { get; default = 10 }
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Инициализатор свойства
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.08.11 17:23
Оценка:
Здравствуйте, hardcase, Вы писали:

H>объявить Accessor устаревшим:


Вот это делать не надо, так как у него все же остаются некоторые возможности (например, возможность навесить атрибуты на поле).

С остальным согласен.

ЗЫ

За одно предлагаю сделать человеческую реализацию инициализации полей. А то сейчас это делается через макроатрибут, что зачастую приводит дикой кривизне и непониманию работы компилятора.

Вообще, макросы в принципе не должны использоваться компилятором для построения АСТ.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Инициализатор свойства
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.08.11 17:25
Оценка:
Здравствуйте, hardcase, Вы писали:

H>P.S. Если же подходить к этому вопросу совсем глобально, то конечно, объявление свойства должно быть максимально простым — т.е. текущий синтаксис поля должен по сути быть объявлением свойства. А поля, если они все же необходима, объявлять c ключевым словом field.


Согласен с такой формулировкой! Может так и сделать?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Инициализатор свойства
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.08.11 17:31
Оценка: 1 (1) +1
Здравствуйте, hardcase, Вы писали:

Вообще, мне твое предложение отсюда
Автор: hardcase
Дата: 25.08.11
больше понравилось:

P.S. Если же подходить к этому вопросу совсем глобально, то конечно, объявление свойства должно быть максимально простым — т.е. текущий синтаксис поля должен по сути быть объявлением свойства. А поля, если они все же необходима, объявлять c ключевым словом field.


Будет не хилая несовместимость с предыдущими версиями, но зато более чистое решение (синтаксис), унификация и отсутствие двуличия (ханжества). А то наличие полей, но при этом почти обязательная (причем, маниакальная и необоснованная) страсть к инкапсуляции всех полей (даже неизменяемых) в свойства меня всегда раздражала.

Много лет назад (о знакомства с Н) я уже озвучивал мысль отказа от полей. Идея по умолчанию делать свойства мне очень нравится. А модификатор field позволит решить мелкие неувязочки.

Может правда так сделать?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Инициализатор свойства
От: Jack128  
Дата: 25.08.11 18:13
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Много лет назад (о знакомства с Н) я уже озвучивал мысль отказа от полей. Идея по умолчанию делать свойства мне очень нравится. А модификатор field позволит решить мелкие неувязочки.


VD>Может правда так сделать?


если кто еще не читал: http://confluence.jetbrains.net/display/Kotlin/Properties+And+Fields
Re[2]: Инициализатор свойства
От: Jack128  
Дата: 25.08.11 18:19
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, hardcase, Вы писали:


H>>объявить Accessor устаревшим:


VD>Вот это делать не надо, так как у него все же остаются некоторые возможности (например, возможность навесить атрибуты на поле).


в C# насколько мне помниться есть примерно такой синтаксис:

class MyClass
{
   [field: Description("Str")]
   public int Prop {get;set;}
}

В N такое есть?
Re[3]: Инициализатор свойства
От: hardcase Пират http://nemerle.org
Дата: 25.08.11 19:46
Оценка:
Здравствуйте, Jack128, Вы писали:

J>в C# насколько мне помниться есть примерно такой синтаксис:


J>
J>class MyClass
J>{
J>   [field: Description("Str")]
J>   public int Prop {get;set;}
J>}
J>

J>В N такое есть?

Есть.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: Инициализатор свойства
От: hardcase Пират http://nemerle.org
Дата: 25.08.11 19:47
Оценка:
Здравствуйте, Jack128, Вы писали:

J>если кто еще не читал: http://confluence.jetbrains.net/display/Kotlin/Properties+And+Fields


Оттуда ноги и растут.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Инициализатор свойства
От: _FRED_ Черногория
Дата: 25.08.11 21:16
Оценка:
Здравствуйте, VladD2, Вы писали:

H>>объявить Accessor устаревшим:


VD>Вот это делать не надо, так как у него все же остаются некоторые возможности (например, возможность навесить атрибуты на поле).


А модификаторов атрибутов в Немерле нету, типа

[field: NotSerialized] // Атрибут будет примён к сгенерированному компилятором полю
public Foo : int { get; set; default = 10; }


Help will always be given at Hogwarts to those who ask for it.
Re[5]: Инициализатор свойства
От: _FRED_ Черногория
Дата: 25.08.11 21:21
Оценка:
Здравствуйте, hardcase, Вы писали:

H>См. первое сообщение.

H>public X : int { get; default = 10 }


Здорово, если я правильно понимаю, то set-акессора в этом случае вообще не будет, даже приватного?
Это хорошо: когда инициадизатор простой, можно делать так, а когда сложный, то

H>public X : int { get; private set; }


А как на счёт ещё одного варианта: свойство, которое инициализируется строго один раз в конструкторе (например, параметром), но при этом не имеет сеттера? Синтаксически в конструкторе программист обращается к свойству, а компилятор заменяет это на инициализацию поля. Типа:

class X
{
  public this(int x) {
    X = x; // по факту тут запись в ридонли-поле для свойства.
  }

  public X : int { get; readonly set; }
}
Help will always be given at Hogwarts to those who ask for it.
Re[3]: Инициализатор свойства
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.08.11 23:00
Оценка:
Здравствуйте, _FRED_, Вы писали:


_FR>А модификаторов атрибутов в Немерле нету, типа


_FR>
_FR>[field: NotSerialized] // Атрибут будет примён к сгенерированному компилятором полю
_FR>public Foo : int { get; set; default = 10; }
_FR>


Вроде есть, но как он себя ведет с автосвойствами я не знаю.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Инициализатор свойства
От: _FRED_ Черногория
Дата: 25.08.11 23:28
Оценка:
Здравствуйте, VladD2, Вы писали:

_FR>>А модификаторов атрибутов в Немерле нету, типа


_FR>>[field: NotSerialized] // Атрибут будет примён к сгенерированному компилятором полю
_FR>>public Foo : int { get; set; default = 10; }


VD>Вроде есть, но как он себя ведет с автосвойствами я не знаю.


Ведёт, наверняка, не-важнецки, но было бы полезно, ИМХО.
Help will always be given at Hogwarts to those who ask for it.
Re[6]: Инициализатор свойства
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.08.11 23:46
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>А как на счёт ещё одного варианта: свойство, которое инициализируется строго один раз в конструкторе (например, параметром), но при этом не имеет сеттера? Синтаксически в конструкторе программист обращается к свойству, а компилятор заменяет это на инициализацию поля.


То что ты сейчас описал и есть get-only-свойство немерла. Именно так оно и работает. Только никаких readonly set не нужно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Инициализатор свойства
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.08.11 23:47
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>
_FR>>>[field: NotSerialized] // Атрибут будет примён к сгенерированному компилятором полю
_FR>>>public Foo : int { get; set; default = 10; }
_FR>


VD>>Вроде есть, но как он себя ведет с автосвойствами я не знаю.


_FR>Ведёт, наверняка, не-важнецки, но было бы полезно, ИМХО.


Я бы поставил вопрос по другому. На фиг оно упало, если с автосвойствами его использовать нельзя?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.