3

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

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

2-Попытка привязать интерфейс непосредственно к модели, добавляя слушателей к самой модели по мере необходимости. Я нахожу этот подход довольно неуклюжим, поскольку он загрязняет модель домена.

Есть ли у кого-нибудь другие предложения? В веб-приложении с чем-то вроде JSP-привязки к модели легко, поскольку вы обычно заботитесь только о состоянии модели во время вашего запроса, а не в приложении типа рабочего стола.

Любые идеи?

ответ

2

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

Для такого мелкозернистого управления вы можете проверить, как KVC (Key Value Coding) и KVO (наблюдение за ключевыми значениями) работает в Cocoa. Он в основном позволяет объекту наблюдать свойства любого другого объекта, если он использует некоторые основные принципы KVC. Заинтересованные объекты автоматически уведомляются об изменениях, и вам не нужно явно уведомлять объекты наблюдений о каждом изменении свойств, как об этом заботится базовая реализация KVO. Он несколько похож на слушателей PropertyChange в Java-компонентах.

Если слишком много наблюдений продолжаются, и запись кода клея для обновления моделей/представлений об изменениях свойств становится проблематичной, вы можете сделать это еще дальше и иметь data-binding, чтобы синхронизировать модели и представления. Основываясь на концепциях KVO, идея заключается в связывании свойств объектов, так что изменение в одном автоматически обновляет другое, и наоборот. Например, вы можете привязать текст в поле ответа SO, к просмотру ответа, который мы видим прямо ниже.

.bind('answer.value', 'answerPreview.text') 

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