Инициализатор свойств
От: _NN_ www.nemerleweb.com
Дата: 26.07.12 13:48
Оценка: 238 (7)
Набросал тут простой ининциализатор свойств: (Пока сидит в ветке PropertyInitializer)

class Test
{
  public Get    : int { get; default { 1 } }
  public GetSet : int { get; set; default { 2 } }
}


Собственно в блок default можно писать любое выражение, которым можно инициализировать поле.

Вопрос, нужно ли поддерживать синтаксис без скобок для простых выражений ?
Т.е.
public Prop : int { get; default 10 }


Может в таком случае и для get/set поддержать этот синтаксис ?
Есть предложения по улучшению этого дела ?

P.S.
Не доделана поддержка в студии.
Если есть желающие помочь, милости просим
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Инициализатор свойств
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.07.12 15:40
Оценка: +1
Здравствуйте, _NN_, Вы писали:

_NN>Вопрос, нужно ли поддерживать синтаксис без скобок для простых выражений ?


Я считаю, что нужно. Скобки для разных констант будут совершенно лишними.

_NN>Может в таком случае и для get/set поддержать этот синтаксис ?


Может, если не будет конфликтов с имеющимися исходниками.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Инициализатор свойств
От: Ziaw Россия  
Дата: 26.07.12 20:16
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Собственно в блок default можно писать любое выражение, которым можно инициализировать поле.


Отлично, только большая просьба, кроме тестов добавить к этой фиче описание в вики.

_NN>Вопрос, нужно ли поддерживать синтаксис без скобок для простых выражений ?


да

_NN>Может в таком случае и для get/set поддержать этот синтаксис ?


да
Re: Инициализатор свойств
От: hardcase Пират http://nemerle.org
Дата: 26.07.12 20:45
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Есть предложения по улучшению этого дела ?


Есть предложение заобсолетить макру Accessor в пользу использования инициализаторов.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Инициализатор свойств
От: fddima  
Дата: 26.07.12 20:54
Оценка:
Здравствуйте, hardcase, Вы писали:

_NN>>Есть предложения по улучшению этого дела ?

H>Есть предложение заобсолетить макру Accessor в пользу использования инициализаторов.
Разве Accessor не генерирует просто property на соответствующее поле?
И при чём тут инициализатор вообще?

Кстати это забавный баг или фича?
class MyClass
{
    public virtual Field1 : int { get; } // ошибки нет
}
Re[3]: Инициализатор свойств
От: _NN_ www.nemerleweb.com
Дата: 26.07.12 21:28
Оценка:
Здравствуйте, fddima, Вы писали:

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


_NN>>>Есть предложения по улучшению этого дела ?

H>>Есть предложение заобсолетить макру Accessor в пользу использования инициализаторов.
F> Разве Accessor не генерирует просто property на соответствующее поле?
F> И при чём тут инициализатор вообще?

F> Кстати это забавный баг или фича?

F>
F>class MyClass
F>{
F>    public virtual Field1 : int { get; } // ошибки нет
F>}
F>


Фича https://github.com/rsdn/nemerle/blob/master/ncc/testsuite/positive/getproperty.n
Генерирует readonly поле.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: Инициализатор свойств
От: fddima  
Дата: 26.07.12 21:33
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Фича https://github.com/rsdn/nemerle/blob/master/ncc/testsuite/positive/getproperty.n

_NN>Генерирует readonly поле.
Ну я так понимаю, что кроме макросов к такому полю не достучаться невозсожно (т.к. имя backstore field неизвестно)?
Re[5]: Инициализатор свойств
От: _NN_ www.nemerleweb.com
Дата: 27.07.12 05:51
Оценка:
Здравствуйте, fddima, Вы писали:

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


_NN>>Фича https://github.com/rsdn/nemerle/blob/master/ncc/testsuite/positive/getproperty.n

_NN>>Генерирует readonly поле.
F> Ну я так понимаю, что кроме макросов к такому полю не достучаться невозсожно (т.к. имя backstore field неизвестно)?

А зачем это нужно ?
Ведь только в конструкторе можно инициализировать readonly.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[6]: Инициализатор свойств
От: fddima  
Дата: 27.07.12 07:21
Оценка:
Здравствуйте, _NN_, Вы писали:

F>> Ну я так понимаю, что кроме макросов к такому полю не достучаться невозсожно (т.к. имя backstore field неизвестно)?

_NN>А зачем это нужно ?
_NN>Ведь только в конструкторе можно инициализировать readonly.
Ну в общем-то да. Я просто как-то случайно вместо абстрактного свойства сделал виртуальное в варианте и заметил уже потом (компилятор варнинг какой-то сыпал, сейчас не вспомню какой именно). В общем был немало удивлён, но раз это фича тогда окей.
Re[7]: Инициализатор свойств
От: _NN_ www.nemerleweb.com
Дата: 27.07.12 07:26
Оценка:
Здравствуйте, fddima, Вы писали:

F> Ну в общем-то да. Я просто как-то случайно вместо абстрактного свойства сделал виртуальное в варианте и заметил уже потом (компилятор варнинг какой-то сыпал, сейчас не вспомню какой именно). В общем был немало удивлён, но раз это фича тогда окей.


Это позволяет более просто и правильней описывать иммутабельные структуры данных.
В отличии от private set , переменную нельзя будет изменить случайно потом.
[Record]
class My
{
  public I : int { get; }
  public S : string { set; }
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Инициализатор свойств
От: Аноним  
Дата: 27.07.12 07:57
Оценка: -1
Здравствуйте, _NN_, Вы писали:

_NN>Набросал тут простой ининциализатор свойств: (Пока сидит в ветке PropertyInitializer)


_NN>
_NN>class Test
_NN>{
_NN>  public Get    : int { get; default { 1 } }
_NN>  public GetSet : int { get; set; default { 2 } }
_NN>}
_NN>


А может так лучше ( типа как поля ):

class Test
{
  public Get    : int { get; } = 1;
  public GetSet : int { get; set; } = 2;
}
Re[2]: Инициализатор свойств
От: Ziaw Россия  
Дата: 27.07.12 08:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А может так лучше ( типа как поля ):


А>
А>class Test
А>{
А>  public Get    : int { get; } = 1;
А>  public GetSet : int { get; set; } = 2;
А>}
А>


Для однострочных похоже на смайлики, но в принципе не так страшно. В остальных случаях будет совсем некрасиво.
Re: Инициализатор свойств
От: Ziaw Россия  
Дата: 27.07.12 08:22
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Есть предложения по улучшению этого дела ?


А можно озвучить причины ограничения только на автосвойства?
Re[2]: Инициализатор свойств
От: hardcase Пират http://nemerle.org
Дата: 27.07.12 09:29
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А может так лучше ( типа как поля ):


А>
А>class Test
А>{
А>  public Get    : int { get; } = 1;
А>  public GetSet : int { get; set; } = 2;
А>}
А>


Как ни странно, но это технически невероятно трудно реализуемо в нышнешнем компиляторе
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: Инициализатор свойств
От: hardcase Пират http://nemerle.org
Дата: 27.07.12 09:33
Оценка: +1
Здравствуйте, fddima, Вы писали:

H>>Есть предложение заобсолетить макру Accessor в пользу использования инициализаторов.

F> Разве Accessor не генерирует просто property на соответствующее поле?
F> И при чём тут инициализатор вообще?

Код с Accessor-ами не слишком красив — писать свойства удобнее, так как мы ими описываем интерфейс типа, а не его реализацию (поля), к тому же код с автосвойствами короче . Единственный сценарий в котором Accessor удобнее автосвойств — это случай объявления поля с инициализацией. Теперь, когда есть автосвойства с инициализатором, Accessor становится совершенно ненужным.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Инициализатор свойств
От: matumba  
Дата: 27.07.12 10:51
Оценка:
Здравствуйте, Аноним, Вы писали:

_NN>> public Get : int { get; default { 1 } }



Баба-Яга категорически против default! Это сбивает с толку, подразумевая, что если не писать set, то будет возвращаться всегда 1.

А>А может так лучше ( типа как поля ):


А> public Get : int { get; } = 1;


Так намного лучше. Я бы даже сделал так:

public Name : string = "атас" { get; set; }


...и тогда при первом обращении к свойству вызовется set с value = "атас". Заодно, это вписывается в общий синтаксис инициализации.
Re[3]: Инициализатор свойств
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.07.12 14:02
Оценка:
Здравствуйте, fddima, Вы писали:

F> Разве Accessor не генерирует просто property на соответствующее поле?


Добавлю к словам Хардкейса, что Accessor еще неудобен при рефакторинге. Можно было бы рефекторинг переименования обучить наличию этой макры, но это хардкод.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Инициализатор свойств
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.07.12 14:04
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>А зачем это нужно ?


Например, если нужно атрибут на него повесить. Но у нас то как раз есть возможность узнать имя поля из макроса.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Инициализатор свойств
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.07.12 14:12
Оценка:
Здравствуйте, matumba, Вы писали:

M>Баба-Яга категорически против default! Это сбивает с толку, подразумевая, что если не писать set, то будет возвращаться всегда 1.


Скажу Бабе Яге по секрету, что если свойство сделать статическим, то и поля то не будет. Оно автоматом в константу превратится в константу. И это замечательно! Что хотели то и получили.

Кроме того, если будут конструкторы, то значение будет задано.

А>>А может так лучше ( типа как поля ):


А>> public Get : int { get; } = 1;


От изменения синтаксиса сути не меняется. Но появляются проблемы с многострочными инициализаторами.

По уму оптимальным вариантом было бы просто отказаться от полей. Тогда можно было бы выразить это дело так:
public Get : int = 1;


M>Так намного лучше. Я бы даже сделал так:


M>
M>public Name : string = "атас" { get; set; }
M>


Это вообще конфликты будет вызывать. Мелка опечатки и фейерверк непонятных сообщений об ошибках.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Инициализатор свойств
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.07.12 14:53
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Есть предложение заобсолетить макру Accessor в пользу использования инициализаторов.


А обсолт пашет на макрах?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Инициализатор свойств
От: WolfHound  
Дата: 28.07.12 22:01
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Добавлю к словам Хардкейса, что Accessor еще неудобен при рефакторинге. Можно было бы рефекторинг переименования обучить наличию этой макры, но это хардкод.

Можно делать в общем виде. Но это уже в Н2.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Инициализатор свойств
От: _NN_ www.nemerleweb.com
Дата: 29.07.12 07:44
Оценка:
Здравствуйте, Ziaw, Вы писали:

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


_NN>>Есть предложения по улучшению этого дела ?


Z>А можно озвучить причины ограничения только на автосвойства?


Буду рад выслушать как это сделать для обычных свойств.
У ручных свойств не обязано быть переменной вообще, скажем:
public X : int { get { 1 } set { } }


Что здесь будет означать default ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Инициализатор свойств
От: Ziaw Россия  
Дата: 29.07.12 08:31
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Буду рад выслушать как это сделать для обычных свойств.


Точно так же как и для любых других. Вызвать сеттер в конструкторе. Других способов сделать это я не вижу.

_NN>У ручных свойств не обязано быть переменной вообще, скажем:

_NN>
_NN>public X : int { get { 1 } set { } }
_NN>


_NN>Что здесь будет означать default ?


Да ничего Что, без default можно мало бессмысленных конструкций написать?
Re[4]: Инициализатор свойств
От: _NN_ www.nemerleweb.com
Дата: 29.07.12 08:49
Оценка:
Здравствуйте, Ziaw, Вы писали:

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


_NN>>Буду рад выслушать как это сделать для обычных свойств.


Z>Точно так же как и для любых других. Вызвать сеттер в конструкторе. Других способов сделать это я не вижу.

Интересно, можно подумать над этим.
Кто еще поддерживает эту фичу ?

Добавление этого поведения усложнит код, готов помочь это реализовать ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Инициализатор свойств
От: _NN_ www.nemerleweb.com
Дата: 31.07.12 13:04
Оценка:
Здравствуйте, _NN_, Вы писали:

А вот слово "default" всех устраивает ?
Может обозвать как-то покороче типа "init" ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Инициализатор свойств
От: fddima  
Дата: 31.07.12 13:09
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>А вот слово "default" всех устраивает ?

_NN>Может обозвать как-то покороче типа "init" ?
Мне лично default по душе. В дельфях он тоже default.
Re[2]: Инициализатор свойств
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.07.12 16:59
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>А вот слово "default" всех устраивает ?


default нормально. Ты бы лучше в мастер это дело смерджил.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Инициализатор свойств
От: _NN_ www.nemerleweb.com
Дата: 31.07.12 17:50
Оценка:
Здравствуйте, VladD2, Вы писали:

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


_NN>>А вот слово "default" всех устраивает ?


VD>default нормально. Ты бы лучше в мастер это дело смерджил.


Да я вот смотрю как замутить поддержку выражения без скобок.
Если не получится , то замерджу как есть

Только еще поддержка студии нужна.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: Инициализатор свойств
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.07.12 17:52
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Да я вот смотрю как замутить поддержку выражения без скобок.

_NN>Если не получится , то замерджу как есть

Что там может не получиться? Просто вызови парсинг выражения после обнаружения default.

_NN>Только еще поддержка студии нужна.


Это да. Не помешало бы.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Инициализатор свойств
От: _NN_ www.nemerleweb.com
Дата: 01.08.12 06:42
Оценка: 30 (2)
Здравствуйте, _NN_, Вы писали:

Итак удалось побороть парсер и теперь поддерживаются простые выражения в блоках: add, remove, get, set, default:
public X : int { get; set; default 2 }
public Y : int { get 10 }
public Z : int { get 10; set _ = value; }


Что еще осталось:
1. Поддержка студии.
2. default для обычных свойств.

Есть желающие помочь ?

P.S.
Тут появилась мысль, а может все функции так обрабатывать ?
{nemerle]
class A
{
F() : int 1;
G() : string "a";
}
{/nemerle]
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Инициализатор свойств
От: nCdy http://nCdy.org/
Дата: 01.08.12 07:54
Оценка:
Поддерживаю 2ой вариант
But I don't really mean it
Re[3]: Инициализатор свойств
От: hardcase Пират http://nemerle.org
Дата: 09.08.12 10:32
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>А обсолт пашет на макрах?


Конечно. Гадим в аутпут из макры: Message.Warning("Accessor macro is obsolete, please use auto-properties instead")
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Инициализатор свойств
От: _NN_ www.nemerleweb.com
Дата: 09.08.12 11:02
Оценка:
Здравствуйте, hardcase, Вы писали:

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


_NN>>Есть предложения по улучшению этого дела ?


H>Есть предложение заобсолетить макру Accessor в пользу использования инициализаторов.


А как же код компилятора ? Его кто переделывать будет ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: Инициализатор свойств
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.08.12 18:04
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Конечно. Гадим в аутпут из макры: Message.Warning("Accessor macro is obsolete, please use auto-properties instead")


Не спорделаротивно
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Инициализатор свойств
От: hardcase Пират http://nemerle.org
Дата: 14.08.12 08:48
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>А как же код компилятора ? Его кто переделывать будет ?


Я и передалаю на досуге
/* иЗвиНите зА неРовнЫй поЧерК */
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.