Как стать автором
Обновить

Комментарии 4

Вы простите, но у нас тут в офлайне целый консилиум собрался чтобы понять что автор имел ввиду. Короче, может быть и круто, но вообще ничего не понятно. Идея класная.
На самом деле всё не так сложно.
Суть такая:
Пусть есть
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. сами,
2. сразу же,
3. и только тогда, когда это действительно нужно.
мы то уже разобрались… это я намекал что далеко не все будут тратить такое количество времени чтобы разобраться. Я бы вам советовал ваши ответы перенести в статью, плюс перевести Why? секцию с сайта проекта.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории