Когда пишешь иммутабельные классы, особенно 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-ах для каждого поля мог бы таких методов нагенерить? Достоин ли он стандартной библиотеки?
Спасибо за внимание.
Здравствуйте, catbert, Вы писали:
C>Писать все это влом, конечно же. В связи с чем вопросы.
C>Что вы обычно делаете в такой ситуаци? Насколько было бы круто написать макрос GenerateUpdaters, который в Record-ах для каждого поля мог бы таких методов нагенерить? Достоин ли он стандартной библиотеки?
C>Спасибо за внимание.
Лично я использую макрос NeedChange в своей библиотеке
https://github.com/CodingUnit/Nemerle.Statechart/blob/master/Lib/NeedChange.n
им помечается поле которое должно быть изменено в новой копии объекта, генерируется метод Change[имя поля] внутри метода вызывается конструктор с измененным полем и остальными неизменными и получается нужный результат. У меня используется как стандартный для всего проекта, вполне возможно что можно такой макрос хранить в стандартной библиотеке.