Как делать хороший GUI и data bindings

Mar 01, 2014 01:15

Оригинал взят у justy_tylor в Как делать хороший GUI и data bindings
Сначала хотел прокомментировать в http://jakobz.livejournal.com/238313.html , но решил подробнее осветить тему в виде отдельного поста.

И так, как делается хороший динамический GUI при большом количестве данных:

I. Забудьте MVC. Это доисторический хак из тех времён, когда пещерные оопэшники с удивлением обнаружили, что вьюх может быть больше одной и стали придумывать костыли для реализации. Но ведь бывают не только вьюхи.

В каждый отдельный момент времени в типичном приложении могут быть активны:
1. Настройки приложения, включая типовой background_color для текста.
2. Множество окон, использующих в реальном времени эти настройки.
3. Диалог выбора цвета, в котором в данный момент редактируется настройка background_color.
4. Датасет локализации, из которого подкачиваются тексты для интерфейса приложения, включая метки в диалоге.
И это лишь одно из сочетаний.

Вывод: используемые информационные объекты должны рассматриваться равноценно, без каких-либо разделений на M и V.

II. Забудьте FRP. Это непредсказуемая помойка невидимых состояний "на проводах". А зачем плодить дополнительные невидимые состояния, если нам надо всего лишь соединить видимые (например, между диалогом и настройками)?

Всё можно описать тремя видами уравнений:
1. value = other_value // одностороннее равенство
2. value == other_value // двухстороннее равенство
3. values... = f(other_values...) // односторонняя эквивалентность
Выражение двухсторонней эквивалентности требует двух уравнений, из которых при решении системы выбирается то, что соответствует направлению изменений.

Вывод: требуется решатель системы уравнений для синхронизации изменений между равноценными информационными объектами.

Что касается практических примеров, то взаимодействие данные-данные удобно посмотреть в САПРах, в частности, dependency graph в Autodesk Maya. А последний шаг взаимодействия данные-визуализация прекрасно иллюстрируется в WPF (AffectMeasure, AffectsRender, ...).
Previous post Next post
Up