Quale modello di notifica è preferibile?

6

Sto lavorando su un modello di vista per una vista che presenta una finestra di dialogo con le opzioni di esportazione. L'utente seleziona le opzioni quindi fa clic su Esporta. Quando il modello di visualizzazione completa l'esportazione, il modello di visualizzazione chiamante riceve la notifica.

Sono curioso quale sia la pratica migliore per implementare la notifica: un evento tradizionale o un callback Action che viene passato quando viene aperta la finestra di dialogo.

Evento tradizionale

public class ExportDialogViewModel : ViewModelBase
{
    private readonly ICommand _exportCommand;
    private readonly ICommand _cancelCommand;

    public event EventHandler Finished;

    public ICommand ExportCommand
    {
        get { return _exportCommand; }
    } 

    public ICommand CancelCommand
    {
        get { return _cancelCommand; }
    }

    public ExportDialogViewModel()
    {
        _exportCommand = new RelayCommand(Export);
        _cancelCommand = new RelayCommand(Cancel);
    }

    public void Initialize()
    {
        //set the initial conditions
    }

    public void Export()
    {
        //perform export
        OnFinished();
    }

    public void Cancel()
    {
        OnFinished();
    }

    private void OnFinished()
    {
        if (Finished != null) Finished(this, EventArgs.Empty);
    }
}

Callback

public class ExportDialogViewModel2 : ViewModelBase
{
    private readonly ICommand _exportCommand;
    private readonly ICommand _cancelCommand;

    private Action _callback;

    public ICommand ExportCommand
    {
        get { return _exportCommand; }
    }

    public ICommand CancelCommand
    {
        get { return _cancelCommand; }
    }

    public ExportDialogViewModel2()
    {
        _exportCommand = new RelayCommand(Export);
        _cancelCommand = new RelayCommand(Cancel);
    }

    public void Initialize(Action callback)
    {
        _callback = callback;
        //set the initial conditions
    }

    public void Export()
    {
        //perform export
        _callback();
    }

    public void Cancel()
    {
        _callback();
    }
}

Il mio pensiero iniziale è che l'evento tradizionale è un po 'più flessibile: consente a più abbonati di essere avvisati e consente anche di avvisare zero abbonati. Il callback, d'altra parte, impone un particolare modo di interagire con la finestra di dialogo - il callback deve essere passato durante l'inizializzazione. Il callback è anche più semplice da implementare e utilizzare, anche se forse è meno familiare degli eventi.

Quale dei due modelli di notifica consigli e perché?

    
posta devuxer 08.02.2012 - 22:23
fonte

1 risposta

6

Hai sostanzialmente risposto alla tua domanda nel tuo ultimo paragrafo. Ogni opzione si comporta in modo simile ad un certo grado, è programmata in modo diverso e presenta compromessi in termini di flessibilità e semplicità.

Con le azioni, è possibile implementarle in modo da non richiedere alcun tipo di passaggio di inizializzazione. Possono essere passati a una funzione e attivati in determinate condizioni all'interno del metodo chiamato. È inoltre possibile utilizzare le azioni per comportarsi esattamente come un evento, assegnando un'azione a una proprietà e attivando l'azione quando necessario. Come hai già detto, l'Azione ti consentirà solo di notificare un singolo gestore. In alcune circostanze, ciò può essere utile se la tua intenzione è limitare la notifica a un solo gestore. Non riesco a pensare a molte circostanze fuori dalla mia testa, dove questo sarebbe davvero la pena lo sforzo per così dire.

Gli eventi sono cose bellissime. Ricordo di aver scritto il mio primo codice basato su Event in Delphi molti anni fa, e mi venne in mente allora (e con la mia esperienza mondana di 6 mesi) che non c'era davvero un gran motivo non rendere attivo tutto il codice dell'applicazione. quando alla fine ho attraversato il pattern MVC alcuni anni dopo, non sono stato sorpreso di vedere che si trattava essenzialmente di un pattern guidato dagli eventi. C'è una grande eleganza e semplicità nel connettere semplicemente un intero gruppo di gestori di eventi individuali a un semplice notificatore, e avere tutti questi gestori semplicemente fare la propria piccola cosa, piuttosto che dover scrivere un metodo lungo e completo con logica edge-case fai la stessa cosa Ancora meglio è la possibilità di sostituire o aggiungere funzionalità semplicemente modificando o aggiungendo all'elenco dei gestori registrati a un particolare evento.

Per questi motivi sarei tentato di uscire su un ramo e dire che gli eventi sono migliori in una certa misura, ma come con tutte le cose c'è un tempo e un luogo per tutto, e qualche volta un'azione funzionerà altrettanto bene, anche se forse non come una sostituzione ragionevole per un evento.

    
risposta data 17.02.2012 - 03:00
fonte

Leggi altre domande sui tag