Quanto deve sapere una vista sul modello?

10

Sto costruendo un'applicazione in python con un wrapper python per WPF e con supporto DAG. Sono attualmente in un punto in cui devo decidere un modo coerente di interagire tra i dati e la vista.

Per quello che vedo, ci sono attualmente due soluzioni ovvie.

Il primo è simile a come sono strutturate le applicazioni Android. Hai un controller che imposta / popola la vista. Quindi il controllore possiede la vista e spinge solo i dati primitivi che verranno visualizzati. La vista è solo un livello stupido e non ha idea di cosa sta succedendo e da dove provengono i dati. E se l'utente interagisce con la vista, invierà le chiamate al controller (se è registrato).

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)

Il secondo sta passando un modello (di riferimento) alla vista e consente alla vista di recuperare e aggiornare i dati. La vista ora contiene il modello e quindi può aggiornarlo senza ulteriori callback al controller.

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)

Quindi immagino che cosa sto chiedendo è, dovrei passare i dati molto primitivi e mantenere la visualizzazione il più generica possibile, quindi lavorare con i callback e fare le specifiche aziendali nel controller.

O devo passare l'intero modello alla vista e lasciare che la vista aggiorni direttamente il modello. Ciò significa che ci sarà meno codice da digitare.

PS. Non giudicare il codice: è solo per la visualizzazione.

EDIT:

Inoltre per aggiungere - questa applicazione sarà scritta in python che supporta il ducktyping. Ciò significa che con il secondo approccio, la vista è ancora riutilizzabile a condizione che il modello soddisfi l'interfaccia richiesta.

    
posta Arturs Vancans 25.08.2015 - 20:54
fonte

2 risposte

3

L'unica "logica" che una vista dovrebbe contenere, dovrebbe essere il codice responsabile della modifica dello stato visibile della GUI per l'utente. Qualsiasi codice che manipoli dati o calcoli un valore dovrebbe essere gestito da qualche altra parte.

La tua vista dovrebbe sapere come appare il modello, ma dovrebbe ignorare il comportamento associato a qualsiasi cosa il modello esponga.

Il passaggio di tipi di dati semplici alla vista rende responsabile sia la manipolazione della GUI che la memorizzazione dello stato di visualizzazione, che può facilmente diventare poco pratico.

Dovresti passare il modello direttamente alla vista se il modello è stato creato per essere manipolato dalla vista. Se il tuo modello è lo stesso utilizzato dal meccanismo di archiviazione dei dati, ciò può causare problemi lungo la strada se la rappresentazione interna e la rappresentazione della vista divergono (come spesso accade).

Fondamentalmente, dovresti avere solo una vista, un modello di vista, un modello di dati e qualcosa per gestire la logica di business. Quindi tutte le tue preoccupazioni sono facilmente separate, devi solo incollarle insieme.

    
risposta data 26.08.2015 - 17:09
fonte
1

Questa è in qualche modo una risposta generalizzata, ma la vista IMO dovrebbe fare la minima quantità di lavoro possibile (ad esempio, convalidare gli input dell'utente).

In questo modo puoi aspettarti che tutta la tua logica sia nel controller. Ciò rende molto più facile mantenere la strada, principio di responsabilità unica e tutto il resto.

    
risposta data 26.08.2015 - 15:29
fonte

Leggi altre domande sui tag