Un controller deve avere un oggetto Model come attributo?

4

Per contesto, questo progetto è un programma di bilancio personale su cui sto lavorando mentre cerco di imparare a utilizzare i pattern MVC in modo efficace.

C'è un SessionController che passa i comandi dell'utente a un MonthController. Ogni controller ha un parser che associa i comandi ai metodi del controller.

Attualmente, il controllore ha un oggetto Month come attributo e chiama direttamente i metodi del modello. Assomiglia a questo:

class MonthController(Controller):
    def __init__(self, budget, *args, **kwargs):
      Controller.__init__(self, *args, **kwargs) 
      self.month  = budget.get_current_month()

    def add_transaction(self, params):
      # get user data, do parameter validation here
      self.month.add_transaction(params)

Questa normale implementazione di MVC? Ci sono delle insidie nel permettere al Controllo di "possedere" un oggetto Modello che dovrei cercare?

Inoltre, ho intenzione di avere il SessionController "proprietario" di un numero di Visualizzazioni. Una di queste viste avrà anche un attributo Month (ma solo i metodi call read-only). Non riesco a capire perché, ma questo sembra sbagliato. Sono fuori pista, o è questo MVC standard?

    
posta g_sue 11.11.2017 - 18:35
fonte

1 risposta

6

Sì, questo è abbastanza comune ( python esempio, semplice java esempio, esempio java utilizzando un elenco di modelli e C ++ esempio)

Perché? Il controller deve inviare comandi al modello. Quindi o conosce il modello (cioè è stato iniettato nella costruzione e conservato per riferimento futuro) o c'è un modo per trovare il modello al volo. La versione successiva potrebbe tuttavia rendere il controller meno flessibile (ad esempio, l'utilizzo di un riferimento globale o di un singleton per trovare il modello significherebbe che tutti i controller utilizzano lo stesso modello, a meno che la complessità aggiuntiva non aggiri questa limitazione).

Una variante che potresti prendere in considerazione è quella di utilizzare il schema di comando . Ciò potrebbe consentire di migliorare il design con la possibilità di annullare / ripristinare .

    
risposta data 11.11.2017 - 22:32
fonte

Leggi altre domande sui tag