Condividi su Facebook
MVC: un po di software engineering
Scritto da: spider il 26/06/2009 alle 12:51
Tag: Programmazione, Python.Visto 1433 volte.

MVC (Model-View-Controller) è un pattern architetturale molto usato nella programmazione object-orientend, in particolar modo per lo sviluppo di interfacce grafiche.

Il pattern MVC è stato descritto per la prima volta nel 1979 da Trygve Reenskaug, che lavorava su Smalltalk allo Xerox PARC. In molti hanno provato ad emulare MVC. Uno dei più conosciuti (a causa del suo utilizzo da parte di Microsoft) è il pattern Model View Presenter apparso nei primi anni 1990 ed è stato progettato per essere una evoluzione del MVC. Tuttavia Model-View-Controller è ancora molto diffuso. Nel 2002, W3C ha votato perchè il pattern MVC faccia parte del loro XForms architecture, per le future applicazione web. Queste specifiche sono ora incluse direttamente in XHTML 2.0.


Model View Controll

Questo modello ha una netta divisione dei compiti:
~ Model: chiamato anche modello, incapsula lo stato dell'applicazione definendo i dati e le operazioni che possono essere eseguite su questi. Per lo sviluppo del Model è quindi consigliato utilizzare le tecniche di astrazione, tipiche della programmazione object oriented, al fine di ottenere un componente software il più astratto possibili rispetto al mondo reale.
~ View: la vista si occupa della presentazione dei dati. Questo significa che la view deve fondamentalmente gestire la costruzione dell' interfaccia grafica (GUI - Graphical User Interface) che rappresenta il mezzo mediante il quale qualsiasi utente interagisce con il programma. Per far sì che i dati presentati siano sempre aggiornati è possibile adottare due strategie note come "push model" e "pull model". Col push model le View possono richiedere gli aggiornamenti al Model in tempo reale grazie alla notifica di quest'ultimo. Nel pull Model la View richiede gli aggiornamenti quando le serve. Inoltre la View delega al Controller l'esecuzione dei processi richiesti dall'utente dopo averne catturato gli input e la scelta delle eventuali schermate da presentare.
~ Controller: il controllore o logica di gioco, permette di trasformare gli input dell'utente dall View, in azioni eseguite dal Modell. Quindi il Controller implementa la logica di controllo dell'applicazione.

Esempio pratico.
Vogliamo creare un'applicazione con tre tasti e una label. Due tasti permettono di incrementare o decrementare un valore (massimo 5, minimo -5), che verrà visualizzato nella label. Tralasciando tutti i concetti di programmazione in python e la grafica, vediamo come potremmo implementare questo esempio (qui il file completo).

Code:

class Model:
   def __init__(self): self.cont=0
   def contUp(self): self.cont+=1
   def contDown(self): self.cont-=1
   def getCont(self): return self.cont

class Controll:
   def __init__(self): self.model=Model()
   def up(self,widget,text):
      if self.model.getCont() < 5:
         self.model.contUp()
         text.set_text(str(self.model.getCont()))
   def down(self,widget,text):
      if self.model.getCont() > -5:
         self.model.contDown()
         text.set_text(str(self.model.getCont()))

class View:
   def __init__(self):
      self.controll=Controll()
   ...
      self.buttonUp.connect("clicked", self.controll.up,self.text)
   ...
      self.buttonDown.connect("clicked", self.controll.down,self.text)


Nella view abbiamo connesso i bottoni ai metodi della classe Controll.
Nella classe Controll è presente la nostra logica del programma.
Nella classe Model ci sono tutti i metodi per astrarre al meglio il modello.
Se invece di un massimo di 5 volessimo mettere un massimo di 2, andremmo a modificare semplicemente il valore nel metodo Controll.up() senza intaccare altro codice.

In conclusione, questo tipo di pattern facilita la modifica della logica, lasciando intatta la GUI, e viceversa. Se per esempio qualche parte di un programma dovesse cambiare per qualsiasi motivo, dovrei agire solo sulle classi che implementano la stessa, senza toccare le altre, facilitando la modifica ed evitando la creazione di possibili errori.


Aggiungi un commento:
Nick:
captchaInserire il codice: