Utilizzo lo schema di comando da un po 'di tempo ma non sono mai veramente sicuro di quanta logica posso effettivamente inserire nel metodo Execute
.
La mia attuale implementazione del modello di comando è simile a questa:
public abstract class Command
{
public static event EventHandler Completed = delegate { };
public bool Success { get; private set; }
public Exception Exception {get; private set; }
public abstract bool Execute();
protected bool OnCompleted(bool success, Exception ex = null)
{
Success = success;
Exception = ex;
Completed(this, EventArgs.Empty)
return success;
}
}
e queste sono le domande che mi pongo (e pratico nei miei comandi):
- È OK mostrare caselle di messaggistica o aprire finestre di dialogo ecc.?
- Va bene impostare proprietà di qualsiasi oggetto?
- Un comando può contenere la logica aziendale?
- Può un comando modificare i controlli della GUI in ogni caso?
- A quale livello appartengono i comandi? Visualizza o livello dati? Posso avere comandi in entrambi i livelli?
- Un comando può fare tutto ciò che prima era
button1_Click
? - Dovrebbe un comando per unità testabile?
- Un comando può essere visto come un utente che fa uso delle API e che costruisce l'ultimo livello di un'applicazione e anche l'ultima risorsa per catturare le eccezioni?
- I comandi possono essere eseguiti anche tramite codice (il comando chiama api, api esegue e infine qualche altro api chiama un comando) oppure può solo l'utente invocarlo e le API non devono sapere dell'esistenza?
- Esiste un posto per i comandi in MVC o MVVC o in qualsiasi altro modello di progettazione con un controller? Sembrano escludersi a vicenda. Cosa è preferibile?
Ci sono molti tutorial che mostrano come implementare il pattern di comando, ma nessuno in realtà discute su come applicarlo in una vera e propria applicazione wold.