Скільки повинен знати погляд про модель?


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. Не судіть про код - він просто для візуалізації.

Редагувати:

Ще додати - ця програма буде написана пітоном, який підтримує каченя. Це означає, що при другому підході подання все ще може використовуватись до тих пір, поки модель не відповідає необхідному інтерфейсу.

Відповіді:


3

Єдина "логіка", яку має містити перегляд, повинен бути кодом, відповідальним за зміну видимого стану графічного інтерфейсу для користувача. Будь-який код, який маніпулює даними або обчислює значення, повинен оброблятися деінде.

Ваш погляд повинен знати, як виглядає модель, але не повинен знати про поведінку, пов'язану з будь-якою річчю, яку викриває модель.

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

Ви повинні передати модель безпосередньо на вигляд, якщо модель побудована для маніпуляції видом. Якщо ваша модель є тією самою, що використовується вашим механізмом зберігання даних, це може спричинити проблеми в дорозі, якщо ваше внутрішнє представлення та представлення подання розходяться (як це часто буває).

По суті, ви просто повинні мати представлення даних, модель перегляду, модель даних та щось для обробки логіки бізнесу. Тоді всі ваші турботи легко відокремлюються, потрібно просто склеїти їх.


1

Це дещо узагальнена відповідь, але перегляд IMO повинен виконати якнайменший обсяг роботи (наприклад, перевірити введення даних користувачів).

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


Ну а в другому підході логіка все ще буде в оглядовій моделі, а не в погляді.
Arturs Vancans
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.