Arquitectura Empresarial - Mapper

El patrón Mapper, a menudo implementado como un objeto que mapea un conjunto de datos a otro, se usa para transferir datos entre objetos que no comparten la misma estructura interna, o entre una capa de presentación y una capa de lógica de negocio, o incluso entre la lógica de negocio y una base de datos.

El objetivo es abstraer y encapsular la lógica necesaria para transformar los datos de una representación a otra, haciendo que el proceso de intercambio de datos sea más flexible y fácil de mantener.

¿Cuándo usarlo?

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

  • Se necesita intercambiar datos entre sistemas que utilizan diferentes modelos de datos.
  • Se desea separar la representación de datos en la interfaz de usuario de la lógica de negocio.
  • Se requiere adaptar o transformar datos provenientes de una fuente externa para que sean compatibles con el modelo de dominio de la aplicación.

Ventajas

  • Desacoplamiento: Facilita el desacoplamiento entre diferentes capas o componentes de la aplicación, permitiendo que cambien independientemente sin afectarse mutuamente.
  • Flexibilidad: Hace que sea más fácil cambiar la forma en que los datos son representados en un lado del mapeo sin alterar el otro lado.
  • Reutilización: Permite reutilizar la lógica de mapeo en diferentes partes de la aplicación, reduciendo la duplicidad de código.

Desventajas

  • Complejidad adicional: Introduce una capa extra de complejidad en la aplicación, ya que requiere la creación y mantenimiento de los mappers.
  • Rendimiento: En algunos casos, el proceso de mapeo puede introducir una sobrecarga que afecta el rendimiento, especialmente si los mapeos son complejos o involucran grandes volúmenes de datos.

Ejemplo Detallado en Java

Consideremos un ejemplo simple donde tenemos un objeto de dominio Persona y un objeto de transferencia de datos (DTO – Data Transfer Object) PersonaDTO, y queremos mapear los datos entre estos dos objetos:


  public class Persona {
      private String nombre;
      private int edad;
      // Constructor, getters y setters
  }
  
  public class PersonaDTO {
      private String nombreCompleto;
      private int edad;
      // Constructor, getters y setters
  }
  
  public class PersonaMapper {
      public static PersonaDTO toDTO(Persona persona) {
          return new PersonaDTO(persona.getNombre(), persona.getEdad());
      }
  
      public static Persona fromDTO(PersonaDTO personaDTO) {
          String[] nombres = personaDTO.getNombreCompleto().split(" ");
          String nombre = nombres[0]; // Simplificación para el ejemplo
          return new Persona(nombre, personaDTO.getEdad());
      }
  }
            

Conclusiones

El patrón Mapper juega un rol crucial en el diseño actual, facilitando la integración y la comunicación entre distintas capas o sistemas, con una forma clara de “traducir” los datos entre diferentes representaciones, eliminando las barreras entre diferentes estructuras de datos, promoviendo un diseño de software más limpio, modular y escalable.