Leggendo gli articoli che sono linkati dal post di Pierre sono rimasto fortemente impressionato da quanto facile potrebbe essere implementare questo pattern in .NET, specialmente in ambiente Windows Forms. Quello che avviene normalmente in una applicazione è che la form (a.k.a view) interroga il database, tipicamente attraverso una serie di strati intermedi e popola ad uno ad uno i controlli in essa contenuti. Ques'ultima operazione avviene per mezzo del Databinding che consente al programmatore di "dimenticarsi" del dato dopo che lo ha affidato al controllo fintanto che non se lo andra a "riprendere" direttamente nell'oggetto di business cui esso è collegato.

Nel codice di Fowler, questa parte è rappresentata da una serie di metodi set() e get() che non fanno altro che scrivere e leggere i "controlli" in risposta alla loro modifica. In .NET tutto ciò si potrebbe tranquillamente realizzare esponendo all'esterno le proprietà dei controlli e "bindando" gli oggetti di business a queste ultime piuttosto che ai controlli stessi. In questo modo tutto il codice di set() e get() è semplicemente "inutile". Non resta altro che da agganciarsi agli eventi dei pulsanti Ok e Cancel e leggere/scrivere gli oggetti di business nel supporto di persistenza.

Poniamo ad esempio di avere una form che espone la checkbox dell'esempio di Fowler:

public class AlbumForm : Form
{
    
private CheckBox chkIsClassical;

    
public AlbumForm()
    {
        
// inizializzazione controlli
    
}
    
    
public bool IsClassical
    {
        
get return chkIsClassical.Checked;  }
        
set { chkIsClassical.Checked = value; }
    }
}

La nostra classe Presenter non dovrà fare altro che istanziare la View e poi fare il bind dell'oggetto di business (model)

public class AlbumPresenter
{
    
public void LoadViewFromModel( Form form, Album album )
    {        
        Binding binding = 
            form.DataBindings.Add( "IsClassical", album, "IsClassical" );
    }
    
    
public void LoadModelFromView( Form form, Album album )
    {    
        form.BindingContext[ album ].EndCurrentEdit();
        UpdateModel( album );
    }

    
public void EditAlbum( Album album )
    {
        AlbumForm form = 
new AlbumForm();

        LoadViewFromModel( form, album );
        
        
if ( DialogResult.Ok == form.ShowDialog() )
            LoadModelFromView( form, album );
    }
}

Il codice l'ho buttato giù direttamente nel post, senza verificare che compili, ma direi che di primo acchito la cosa può funzionare. Sarebbe interessante capire se ci sono delle responsabilità che possono essere accomunate da una classe astratta Presenter oppure da una View.

Naturalmente la domanda che mi sorge è: è davvero così semplice oppure ho scordato di considerare qualcosa?

powered by IMHO 1.1