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.