Существует ли обобщенный подход к обработке уведомлений об изменениях из большой постоянной структуры данных? - PullRequest
3 голосов
/ 24 марта 2011

Сначала мотивация для этого вопроса: любой, кто использует постоянные структуры данных и графический интерфейс, сталкивается с этой проблемой. Итак, мои вопросы вроде: люди просто решают это на индивидуальной основе, или это их библиотеки, утилиты, фреймворки, что-то, что абстрагирует общий случай, чтобы сделать его проще.

Конкретный язык, на который я нацеливаюсь, - это Scala, но я думаю, что это общий вопрос, связанный с постоянными структурами данных.

Допустим, у вас есть большая структура данных, отображаемая в сложном графическом интерфейсе с деревьями, таблицами, таблицами свойств и т. Д. Различные действия пользователя или системы приводят к изменениям в структуре данных.

Существует ли общая стратегия обработки уведомлений, которая сообщает графическому интерфейсу о необходимости обновления?

Одна из интригующих идей с постоянными структурами данных заключается в том, что можно обрабатывать отмену / повтор, просто переключаясь между корнями. Это работает для данных, но существует ли общий механизм для информирования слушателей (например, графического интерфейса пользователя) об изменении, если нужно переключить корни?

Насколько я понимаю, это должно быть постепенно - мне нужно знать, что изменилось. Я не могу просто сказать все, чтобы сделать полное обновление графического интерфейса, так как это может быть очень дорого (и некоторые элементы управления не справляются с этим (или вообще) из-за поддержания состояния графического интерфейса).

Ответы [ 2 ]

0 голосов
/ 17 июля 2011

См. Этот вопрос о Функциональном реактивном программировании в Scala .А также посмотрите Манифест Ячеек и статью Википедии о FRP для фона.

И прочитайте статью "Устаревание шаблона наблюдателя с использованием Scala.React": http://lamp.epfl.ch/~imaier/pub/DeprecatingObserversTR2010.pdf упоминается в ответе magicduncan на вышеуказанный вопрос SO.

0 голосов
/ 24 марта 2011

Вы будете обновлять графический интерфейс одновременно с переключением корней, поскольку если структура действительно постоянна, то любое изменение в глубине структуры повлечет за собой новый корень. Это, однако, будет сделано обязательно (или в какой-то монадической конструкции; я никогда не занимался программированием GUI на Haskell).

Например, если ваш код GUI является обязательным / OO, но использует постоянную структуру State:

// poor man's zipper for unbounded undo/redo
var curState : State
var prevStates : List[State]
var nextStates : List[State]

def undo = {
    val prev = prevStates.head
    prevStates = prevStates.tail
    nextStates = curState :: nextStates
    curState = prev
    updateGui(curState)
}
...