Arquitectura Empresarial - Separated Interface

Separated Interface se refiere a la práctica de definir la interfaz de un componente en un paquete o módulo separado de su implementación.

No es más que la aplicación del principio SOLID “D”, Dependency Inversion Principle (Inversión de la Dependencia).

Esto permite que múltiples implementaciones de la misma interfaz coexistan sin que el consumidor de la interfaz necesite saber detalles específicos sobre cuál implementación está siendo utilizada.

El consumidor y el proveedor de la interfaz están desacoplados, lo que facilita el intercambio de implementaciones sin afectar el código que depende de la interfaz.

¿Cuándo usarlo?

Este patrón es especialmente útil en situaciones donde:

  • Se espera que la implementación de una interfaz cambie con el tiempo o entre diferentes entornos.
  • Se desea promover la separación de responsabilidades y el desacoplamiento entre diferentes partes de una aplicación.
  • Se están desarrollando bibliotecas o frameworks que serán utilizados por una variedad de clientes o proyectos.
  • Cuando se desea crear arquitecturas limpias, aislando la lógica de negocio de las demás capas, se definen las interfaces dentro del dominio y se implementan en capas exteriores.

Ventajas

  • Desacoplamiento: Permite que los detalles de implementación de un servicio o componente sean modificados sin afectar a los consumidores de la interfaz.
  • Flexibilidad: Facilita el cambio entre diferentes implementaciones de una interfaz.
  • Facilita la prueba: Al separar la interfaz de su implementación, se pueden crear implementaciones falsas o simuladas para pruebas sin necesidad de depender de la implementación real.

Desventajas

  • Complejidad adicional: Puede introducir una capa adicional de complejidad al requerir la gestión de interfaces y sus implementaciones separadas.
  • Gestión de dependencias: Puede complicar la gestión de dependencias en proyectos grandes donde múltiples interfaces e implementaciones necesitan ser coordinadas.

Ejemplo Detallado en Java

Tenemos una aplicación que necesita enviar notificaciones, pero el método de envío de notificaciones puede variar (correo electrónico, SMS, etc.).

Definimos la interfaz en su propio módulo o paquete:


  public interface Notificador {
      void enviarMensaje(String mensaje);
  }
            

Creamos una implementación de esta interfaz:


  public class NotificadorEmail implements Notificador {
      public void enviarMensaje(String mensaje) {
          // Lógica para enviar notificaciones por correo electrónico
      }
  }
  
  public class NotificadorSMS implements Notificador {
      public void enviarMensaje(String mensaje) {
          // Lógica para enviar notificaciones por SMS
      }
  }
            

Conclusiones

El patrón Separated Interface promueve un diseño de software flexible y desacoplado mediante la inversión de dependencias, permitiendo que los sistemas se construyan de manera modular, donde las partes pueden ser desarrolladas, probadas y modificadas de forma independiente.

Este patrón permite que diferentes componentes de software colaboren de manera efectiva sin estar fuertemente acoplados a las implementaciones específicas de los demás.