Комментарии 4
Вы простите, но у нас тут в офлайне целый консилиум собрался чтобы понять что автор имел ввиду. Короче, может быть и круто, но вообще ничего не понятно. Идея класная.
+2
На самом деле всё не так сложно.
Суть такая:
Пусть есть
class Автомобиль {
public property int Пробег {
return Маршрут.Sum(m=>m.Расстояние);
}
public property List<Путь> Маршрут;
void Проехать(Путь п) {
Маршрут.Add(путь);
}
}
1. Вычисления в properties заменяются на ValueProvider, который инкапсулируют эти вычисления.
public property ValueProvider<int> Пробег{
____ return new ValueProvider(() => Маршрут.Sum(m=>m.Расстояние));
}
public property ValueProvider<List<Путь>> Маршрут;
Таким образом Пробег и Маршрут всё еще отвечает за вычисление пробега, но при попытке получить Пробег, мы получим не резултат этих вычислений, а объект, содержащий функцию. Т.о. мы не даем программе сразу же сделать вычисления, а просто возвращаем ValueProvider, который знает как их вычислить. А значит теперь мы можем контролировать в какой момент вычислять, а в какой просто возвращать закэшированное значение.
т.е. Пробег зависит от Маршрута, а значит не нужно перерасчитывать значение Пробега, если элементы Маршрута не изменялись.
2. Все вычисления, которые переданы ValueProvider образуют дерево вычислений, которое первый раз выполняются в полном объеме, необходимом для получения результата, а при последующих вызовах возвращает закэшированные значения.
т.е. если Маршрут не изменялся, то путь вычисляться заново не будет, а вернется закэшированное значение.
3. Этот ValueProvider, кроме умного подхода к вычислениям, к тому же наследуется от IObservable, а значит если сделать привязку на это свойство (Пробег или Маршрут) в XAML, то привязанный конторол будет автоматически обновляться при изменении какого либо значения, которое используется для вычисления этого свойства.
т.е. если мы добавим новый Путь в Маршрут, то автоматически обновятся контролы зависящие от Маршрута (в т.ч. и контрол, который будет показывать общий пробег).
Суть такая:
Пусть есть
class Автомобиль {
public property int Пробег {
return Маршрут.Sum(m=>m.Расстояние);
}
public property List<Путь> Маршрут;
void Проехать(Путь п) {
Маршрут.Add(путь);
}
}
1. Вычисления в properties заменяются на ValueProvider, который инкапсулируют эти вычисления.
public property ValueProvider<int> Пробег{
____ return new ValueProvider(() => Маршрут.Sum(m=>m.Расстояние));
}
public property ValueProvider<List<Путь>> Маршрут;
Таким образом Пробег и Маршрут всё еще отвечает за вычисление пробега, но при попытке получить Пробег, мы получим не резултат этих вычислений, а объект, содержащий функцию. Т.о. мы не даем программе сразу же сделать вычисления, а просто возвращаем ValueProvider, который знает как их вычислить. А значит теперь мы можем контролировать в какой момент вычислять, а в какой просто возвращать закэшированное значение.
т.е. Пробег зависит от Маршрута, а значит не нужно перерасчитывать значение Пробега, если элементы Маршрута не изменялись.
2. Все вычисления, которые переданы ValueProvider образуют дерево вычислений, которое первый раз выполняются в полном объеме, необходимом для получения результата, а при последующих вызовах возвращает закэшированные значения.
т.е. если Маршрут не изменялся, то путь вычисляться заново не будет, а вернется закэшированное значение.
3. Этот ValueProvider, кроме умного подхода к вычислениям, к тому же наследуется от IObservable, а значит если сделать привязку на это свойство (Пробег или Маршрут) в XAML, то привязанный конторол будет автоматически обновляться при изменении какого либо значения, которое используется для вычисления этого свойства.
т.е. если мы добавим новый Путь в Маршрут, то автоматически обновятся контролы зависящие от Маршрута (в т.ч. и контрол, который будет показывать общий пробег).
+1
Представьте, что кроме пробега есть десятки(сотни) свойств, которые зависят от Маршрута.
Теперь при добавлении нового элемента в маршрут не нужно указывать что нужно обновить каждый контрол, который отображает зависимые от маршрута параметры.
Нужные свойства обновятся
1. сами,
2. сразу же,
3. и только тогда, когда это действительно нужно.
Теперь при добавлении нового элемента в маршрут не нужно указывать что нужно обновить каждый контрол, который отображает зависимые от маршрута параметры.
Нужные свойства обновятся
1. сами,
2. сразу же,
3. и только тогда, когда это действительно нужно.
+1
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Obtics — функциональное реактивное программирование на .Net