Patrón de diseño: COMMAND

Patrón de diseño: COMMAND

El patrón Command es un patrón que realiza un trabajo específico. Es muy útil ya que con él cumplimos el primer principio de SOLID. Sigue leyendo para aprender más sobre este patrón.

SwiftBeta

Utilizamos el patrón de comportamiento Command para encapsular lógica de negocio y ejecutarla según nos llegan peticiones de otras capas. Como por ejemplo, un user puede pulsar un botón en la UI y notificar a las capas inferiores para que realizen alguna acción.

Imagina que tienes una app que envía mensajes a tus amigos y puedes enviar mensajes desde varias pantallas. Cada vez que pulsas un botón en una de estas pantallas tenemos que ejecutar la misma lógica.
Para evitar escribir la misma lógica en los dos sitios, puedes crear un comando y usarlo en distintas pantallas.

La UI nunca debe encargarse de esta responsabilidad.

Es decir, la UI enviaría una petición a capas inferiores hasta llegar a tu nuevo comando, una vez llega al comando, se ejecutaría toda la lógica y cuando acabe de ejecutarse podríamos notificar hacía arriba (hacía la vista) para indicar que todo ha ido bien (solo en el caso de que quieras mostrar algún tipo de feedback al usuario de tu app, como por ejemplo con un banner).

Este patrón tiene un único método que se llama execute() y como ves no acepta ningún parámetro. En nuestro caso necesitamos obtener por ejemplo el mensaje que queremos enviar, es por eso que podemos pasarlo en el inicializador.

Vamos a ver un ejemplo creando un APIClient muy sencillo, para que sea más claro todo:

protocol API {
    func send(message: String)
}

class APIClient: API {
    init() {}
    
    func send(message: String) {
        print("Send XMPP: \(message)")
    }
}

Y ahora vamos a crear el nuevo comando, lo vamos a llamar SendMessageCommand que va a conformar la interfaz Command:

protocol Command {
    func execute()
}

class SendMessageCommand: Command {
    private let message: String
    private let apiClient: API
    
    init(message: String, apiClient: API = APIClient()) {
        self.apiClient = apiClient
        self.message = message
    }
    
    func execute() {
        apiClient.send(message: message)
    }
}

y una forma de ejecutar este comando sería la siguiente:

let sendMesageCommand = SendMessageCommand(message: "Hello! SwiftBeta")
sendMesageCommand.execute()

// El resultado es "Send XMPP: Hello! SwiftBeta"

Como ves, este comando es muy util para seguir uno de los principios SOLID, en este caso el de Single Responsibility Principle donde creamos una clase comando con una única misión: enviar un mensaje a través de nuesto APIClient.


Hasta aquí el post de hoy, gracias por leernos! 🤓
Si tienes preguntas no dudes en contactar con nosotros a través de Twitter

Si quieres seguir aprendiendo sobre SwiftUI, Swift, Xcode, o cualquier tema relacionado con el ecosistema Apple


Patrones