Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save eamodeorubio/857561 to your computer and use it in GitHub Desktop.
Save eamodeorubio/857561 to your computer and use it in GitHub Desktop.
Esta clase viola el SRP y algunas cosas más (very bad things)
public class AuditorTransferenciasMonetarias {
/* Ahora la clase implementa lógica de negocio "pura"
* y es independiente de la plataforma (a.k.a. framework)
*/
private DirectorioEmpleados directorioEmpleados;
private SistemaMensajeriaCorporativa mensajero;
private PlantillasCorporativas almacenDePlantillas;
/* No se muestra todo el código */
public void transferenciaRealizada(Transferencia transferencia) {
if(transferencia.esImportante()) {
this.mensajero
.enviar(
new Mensaje()
.a(interesadosEnTransferenciasImportantes()
.conContenido(this.componerMensajeAviso(transferencia))
);
}
}
private Documento componerMensajeAviso(Transferencia transferencia) {
return this.almacenDePlantillas.usandoPlantilla("avisos/transferencia-importante").crearDocumentoCon(transferencia);
}
private List<Empleado> interesadosEnTransferenciasImportantes() {
return this.directorioEmpleados.empleadosConRol(Empleado.INTERESADOS_TRANSFERENCIAS_IMPORTANTES);
}
}
@eamodeorubio
Copy link
Author

Ahora delegamos la responsabilidad de a quien debemos notificar en el directorio de empleados. La asociación de que empleados están interesados se hace mediante un rol, y podríamos llegar a cambiarla en runtime mediante un backoffice.

@eamodeorubio
Copy link
Author

Ahora usamos un sistema de mensajería abstracto. Puede tener varias implementaciones, SMS, correo, impresora, web, etc. De hecho podríamos tener una implementación "composite" que redirigiera la notificación a varios sistemas de mensajería.

@eamodeorubio
Copy link
Author

Para aislar a la clase de cambios en el framework, usamos tres interfaces de negocio, PlantillasCorporativas, Plantilla y Documento.
Ahora si cambiamos de framework esta clase no hay que tocarla. Además, en vez de usar String, usamos Documento, que podría (si fuera necesario) saber como serializarse en String, en array de bytes, en HTML, en XML o en JSON, según le interese a la implementación concreta de SistemaMensajeriaCorporativa que usemos.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment