Как много должно знать представление о модели?


10

Я строю приложение на Python с оболочкой Python для WPF и с поддержкой DAG. В настоящее время я нахожусь в точке, где я должен выбрать согласованный способ взаимодействия между данными и представлением.

Насколько я вижу, в настоящее время есть два очевидных решения.

Первый из них похож на структуру приложений Android. У вас есть контроллер, который устанавливает / заполняет представление. Таким образом, контроллер владеет представлением и отправляет только те примитивные данные, которые будут отображаться. Представление - просто тупой слой и не имеет представления о том, что происходит и откуда эти данные. И затем, если пользователь взаимодействует с представлением, он отправит обратные вызовы контроллеру (если он зарегистрирован).

UserInfoController.py

userInfoView = UserInfoView()
userInfoView.onGenderChangedCallback = self.onGenderChangedCallback 
userInfoView.setUserGenderValue(user.getGender())

UserInfoView.py

def setUserGenderValue(self, gender):
    self.userGender = gender

def getView(self):
    return ui.Label(self.userGender, onEditCallback=self.onGenderChangedCallback)

Второй - это передача (ссылка) модели в представление и разрешение представлению извлекать и обновлять данные. Теперь представление содержит модель и, следовательно, может обновлять ее без каких-либо дополнительных обратных вызовов к контроллеру.

UserInfoViewModel.py

self.gender = 'Male'

UserInfoView.py

def getView(self):
    return ui.Label(self.ViewModel().getGender(), onEdited=self.genderEdited)

def genderEdited(self, newValue):
    self.ViewModel().setGender(newValue)

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

Или я должен передать всю модель в представление и позволить представлению обновить модель напрямую. Это означает, что будет меньше кода для ввода.

PS. Не судите код - это просто для наглядности.

РЕДАКТИРОВАТЬ:

Кроме того, чтобы добавить - это приложение будет написано на Python, который поддерживает Ducktyping. Это означает, что при втором подходе представление можно использовать повторно, если модель соответствует требуемому интерфейсу.

Ответы:


3

Единственной «логикой», которую должно содержать представление, должен быть код, ответственный за изменение видимого состояния GUI для пользователя. Любой код, который манипулирует данными или вычисляет значение, должен обрабатываться где-то еще.

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

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

Вы должны передать модель непосредственно в представление, если модель построена для манипулирования представлением. Если ваша модель аналогична используемой вашим механизмом хранения данных, это может вызвать проблемы в будущем, если ваше внутреннее представление и представление представления расходятся (как это часто бывает).

По сути, у вас должны быть только View, View Model, Data Model и что-то для управления бизнес-логикой. Тогда все ваши проблемы легко разделяются, вам нужно просто склеить их.


1

Это несколько обобщенный ответ, но представление IMO должно выполнять как можно меньше работы (например, проверять вводимые пользователем данные).

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


Что ж, при втором подходе логика все равно будет в модели представления, а не в представлении.
Артурс Vancans
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.