Идея макроса
От: catbert  
Дата: 27.09.13 19:42
Оценка:
Когда пишешь иммутабельные классы, особенно Record-ы, часто возникает потребность добавить метод который возвращает копию this, но с одним свойством измененным.

Даже в микрософте это поняли, когда разрабатывали Immutable Collections.

Заметна тенденция для каждого свойства такого класса писать специальный метод With..., который так и делает:


[Record]
class MyData
{
  [Accessor] _a : A;
  [Accessor] _b : B;
  [Accessor] _c : C;

  public WithA(newA : A) : MyData
  {
    MyData(newA, this.B, this.C)
  }

  public WithB(newB : B) : MyData
  {
    MyData(this.A, newB, this.C)
  }

  public WithC(newC : C) : MyData
  {
    MyData(this.A, this.B, newC)
  }
}


Писать все это влом, конечно же. В связи с чем вопросы.

Что вы обычно делаете в такой ситуаци? Насколько было бы круто написать макрос GenerateUpdaters, который в Record-ах для каждого поля мог бы таких методов нагенерить? Достоин ли он стандартной библиотеки?

Спасибо за внимание.
Re: Идея макроса
От: CodingUnit Россия  
Дата: 27.09.13 19:47
Оценка: 51 (1)
Здравствуйте, catbert, Вы писали:

C>Писать все это влом, конечно же. В связи с чем вопросы.


C>Что вы обычно делаете в такой ситуаци? Насколько было бы круто написать макрос GenerateUpdaters, который в Record-ах для каждого поля мог бы таких методов нагенерить? Достоин ли он стандартной библиотеки?


C>Спасибо за внимание.


Лично я использую макрос NeedChange в своей библиотеке https://github.com/CodingUnit/Nemerle.Statechart/blob/master/Lib/NeedChange.n

им помечается поле которое должно быть изменено в новой копии объекта, генерируется метод Change[имя поля] внутри метода вызывается конструктор с измененным полем и остальными неизменными и получается нужный результат. У меня используется как стандартный для всего проекта, вполне возможно что можно такой макрос хранить в стандартной библиотеке.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.