Sincronizzazione dei dati tra modello e vista nel pattern MVC

3

Ho una domanda sul pattern MVC, riguardante la parte del controller.

La maggior parte del programma che scrivo è fondamentalmente simile a un foglio di calcolo. Sono scritti in C / GTK + e Python3 / Qt5 / Tkinter ma condividono un design comune: separo il gui dalla logica (struttura dei dati e metodi di sollevamento pesante) che sembra essere il pattern MVC.

Domanda Devo davvero passare i dati dalla vista al modello ogni volta che modifico i dati della GUI e voglio calcolare qualcosa? Quindi passare i nuovi dati dal modello alla vista? È così che dovrebbe essere fatto? Capisco che questo va bene per una piccola GUI che esegue calcoli pesanti nel modello. Ma che dire di una grande GUI, come un grande tavolo o un foglio di calcolo.

risposta Ecco gli elementi che ho preso dalla discussione con @dcorking: Devi aggiornare i dati da solo. Una scorciatoia è di aggiornare a caso, solo ciò che deve essere aggiornato e non toccare il resto. Ovviamente, se si ordina la raccolta dopo una singola modifica, potrebbe essere necessario aggiornare nuovamente l'intera GUI in ogni caso. "Osservatori" sono stati menzionati che sembra un modo automatico di fare come sopra.

Codice Pseudo / Python

Consideriamo un collection di items di base (lista della spesa, libreria di libri, ...). La mia classe principale Collection contiene una lista (decine o centinaia) di Item e metodi da applicare sulla lista.

#The model package

class Collection():
    def __init__(self, name=""):
        self.name = name
        self.items = []
        self.itmesToUpdate = []

    def sort(self):
        self.items.sort(key=lambda x:float(x.price))
        self.itemsToUpdate = []
        self.itemsToUpdate = listItemsThatWereMovedAround()

class Item():
    def __init__(self, name="", price=0.):
        self.name = name
        self.price = price

Ora la parte Gui:

class Gui():
    #The View part.
    def __init__(self):
        self.collection = model.Collection()
        ...then fill the View with widgets (Menus, EditTexts, Buttons, ...)

    #The Controller part starts here
    def setViewFromModel(self):
        for i in self.collection.itemsToUpdate:
            self.editTextName[i].setText(self.container.items[i].name)
            self.editTextPrice[i].setText(self.container.items[i].price)
        self.collection.itemsToUpdate = []# reset the list

    def setModelFromView(self):
        for i in self.collection.itemsToUpdate:
            self.container.items[i].name = self.editTextName[i].getText()
            self.container.items[i].price = self.editTextPrice[i].getText()

    #CALLBACKS
    def onItemModified(self, index):
        self.collection.itemsToUpdate.append(index)

    def onClickSort(self):
        self.setModelFromView()#Read the GUI data
        self.collection.sort()#Compute in Model
        self.setViewFromModel()#Update the View with new data

Questo design è perfetto? Per l'app simile a un foglio di calcolo? Grazie.

    
posta funkygoby 01.03.2018 - 18:48
fonte

1 risposta

2

MVC non ti dice quanto sia piccolo per realizzare i modelli.

Per un foglio di calcolo, quando si scopre che passare l'intera struttura di dati tra una vista e un modello è troppo lento o rende il codice troppo complesso, è possibile creare una triade MVC per rappresentare qualcosa di piccolo come una singola cella. / p>

La parte modello della cella potrebbe quindi connettersi in un modo appropriato a un oggetto business più grande che rappresenta l'intero foglio.

Allo stesso modo, le viste cella saranno incorporate in un'altra vista per rappresentare un foglio o una finestra su un foglio.

Aggiorna

L'obiettivo principale di MVC non è quello di migliorare le prestazioni, ma di rendere il codice più comprensibile e quindi più facile da mantenere.

Se si crea una triade MVC per ogni singola cella, questa dovrebbe essere più semplice da comprendere e modificare rispetto a quando la triade rappresenta un'intera colonna o l'intero foglio. Tuttavia, le prestazioni potrebbero risentire di modifiche che interessano l'intero foglio, in quanto si potrebbe finire con molti piccoli oggetti che inviano messaggi tra loro.

Un'alternativa a MVC che potresti voler considerare anche se vuoi evitare di passare i dati tra Views e Models è una manipolazione diretta. Nella manipolazione diretta, l'oggetto con cui l'utente interagisce è l'oggetto che memorizza i dati aziendali (il valore della cella) e le regole aziendali (come il valore della cella può cambiare).

    
risposta data 03.03.2018 - 13:14
fonte

Leggi altre domande sui tag