He estado usando el patrón de comando durante bastante tiempo, pero nunca estoy seguro de cuánta lógica puedo poner realmente en el Execute
método.
Mi implementación actual del patrón de comando es similar a esta:
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;
}
}
y estas son las preguntas que me hago (y practico en mis comandos):
- ¿Está bien mostrar cuadros de mensajes o cuadros de diálogo para abrir archivos, etc.?
- ¿Está bien establecer propiedades de cualquier objeto?
- ¿Puede un comando contener lógica empresarial?
- ¿Puede un comando modificar los controles de la GUI de todos modos?
- ¿A qué comandos de capa pertenecen? Vista o capa de datos? ¿Puedo tener comandos en ambas capas?
- ¿Puede un comando hacer todo lo que anteriormente estaba en el
button1_Click
? - ¿Debería un comando por unidad comprobable?
- ¿Se puede ver un comando como un usuario que hace uso de las API y que crea la última capa de una aplicación y también el último recurso para detectar excepciones?
- ¿Pueden ejecutarse los comandos también por código (el comando llama a la API, la API se ejecuta y finalmente alguna otra API llama a un comando) o solo el usuario puede invocarlo y las API no deben saber sobre su existencia?
- ¿Hay un lugar para los comandos en MVC o MVVC o cualquier otro patrón de diseño con un controlador? Parecen ser mutuamente excluyentes. ¿Qué es preferible?
Hay muchos tutoriales que muestran cómo implementar el patrón de comando, pero ninguno realmente discute cómo aplicarlo en una aplicación real.