Инициализатор свойств
От: _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 в пользу использования инициализаторов.


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