Saltar al contenido

Patrón DTO (Data Transfer Objects)

Compartir en:

La mayoría de las veces cuando desarrollamos aplicativos (si estos no son muy simples) utilizamos capas para separar las funcionalidades y desacoplar los módulos entre sí. Esto nos da agilidad, modularidad y nos permite estructurar nuestro código conforme a los estándares y realizar pruebas con mayor facilidad.

Uno de los problemas más comunes del desarrollo de aplicaciones   es determinar como enviamos y los datos entre nuestras capas. Lo más sencillo es enviar la información bruta, lo cual no quiere decir que sea la mejor idea, ya que esta información sin tratar es en su gran mayoría inútil (las capas no usan todos los datos).

Además, sabemos que normalmente nuestras entidades necesitan de otras para funcionar, un tipo de dato enumerado, una categoría, etc.

Para resolver esta problemática surge un patrón de diseño de comunicación entre capas llamado Data Transfer Objects (DTO).

Este patrón consiste en crear objetos planos que contienen toda la información necesaria para que la aplicación realice su cometido. Cuando digo toda la información necesaria digo que tiene SOLO la información necesaria. Además, al invocar un tiempo de objeto DTO se consigue transportar toda la información con una sola llamada.

Los objetos DTO no proveen lógica de aplicación ni validaciones, como el nombre indica se usan para transferir datos compuestos de manera eficiente y concisa.

Imaginar la situación de una APP que necesita presentar en la capa de presentación los datos de un empleadoy su departamento, y cuantos compañeros mas están en este.

Tendríamos que consultar el empleado, nuevamente consultar el departamento de este y realizar una consulta para saber cuantos compañeros tiene.

Si utilizamos simplemente las entidades, la vista debe realizar varias consultas, el patrón DTO utiliza un mapeado que devuelve un objeto DTO con toda la información necesaria para que la vista haga su función, todo esto con una sola llamada.

Las herramientas de AutoMapper por ejemplo en Asp.net nos ayudan a este cometido.

¿Usar DTO o Entidades?

Esta pregunta nos va a surgir en la mayoría de casos cuando trabajamos con bases de datos. La respuesta está en la función de cada elemento, las entidades han sido creadas para mapear los datos con la base de datos, mientras que los DTO están pensados para presentar datos (ya se a una vista o en una API).

Por tanto, debemos ser conscientes de utilizar los elementos con una finalidad, esto evita que tengamos que crear nuevos campos en una entidad para satisfacer las necesidades de una vista (una mala práctica frecuente), que hace poco legible nuestro código y vulnera el principio de responsabilidad única.


Juan Ibero

Inmerso en la Evolución Tecnológica. Ingeniero Informático especializado en la gestión segura de entornos TI e industriales, con un profundo énfasis en seguridad, arquitectura y programación. Siempre aprendiendo, siempre explorando.

Compartir en:

2 comentarios en «Patrón DTO (Data Transfer Objects)»

  1. Asp.Net Core
    Api
    estructura de carpetas.
    -controller
    -models

    -Services
    -models

    -DataAccess
    -entities

    Esta es mi estructura de carpetas. Me gustaria saber si esto es lo correcto. y como deberian de llamarse las clases dentro de las carpetas models.

    1. Buenas Bryan,

      No dispongo de la suficiente info para determinar si el esquema es correcto o no. Creo que las carpetas es algo bastante personal y depende bastante de la Arquitectura funcional y el proyecto en sí.

      Te recomiendo que busques en github proyectos de gente top y veas como lo organizan, quizás te sirva (busca proyectos de Asp.net Core con muchas estrellas).

      En cuanto a lo de las clases, deberías utilizar nombre lógicos, intuitivos y no ambiguos, piensa que si una persona lo lee, debe poder determinar por que está ahí esa clase e intuir su funcionalidad. Escribir código es como escribir textos, mientras mas claro y entendible, mejor.

      Te recomiendo el libro Clean Code de Uncle Bob, se lee fácil y habla de todos estos temas.

      Saludos!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *