Skip to content

Commit

Permalink
Draft: Modelos y DTOs
Browse files Browse the repository at this point in the history
  • Loading branch information
urrestarazu-alejandro authored Jun 11, 2024
1 parent 4558efc commit 3375546
Showing 1 changed file with 44 additions and 22 deletions.
66 changes: 44 additions & 22 deletions pages/draft/post-draft.md
Original file line number Diff line number Diff line change
@@ -1,47 +1,69 @@
---
layout: post
title: Patrones y estilos de software
subtitle: soluciones reutilizables
title: Modelos Anémicos vs. Enriquecidos
subtitle: Modelos y DTOs
#gh-repo: daattali/beautiful-jekyll
#gh-badge: [star, fork, follow]
#thumbnail-img: https://es.wikipedia.org/wiki/Dualidad_onda_corp%C3%BAsculo#/media/Archivo:Dualite.jpg
tags: [Patrones de diseño,Patrones arquitectónicos,Estilos Arquitectónicos]
tags: [Modelado]
#comments: true
#mathjax: true
author: Alejandro Urrestarazu
---

## Patrones y estilos de software
## Modelos Anémicos vs. Enriquecidos

Antes de adentrarnos en el mundo del software, me parece importante clarificar algunos conceptos. Aunque existe un debate sobre estas definiciones, podemos establecer unas bases útiles para quienes están empezando.
En el desarrollo de software, particularmente en el dominio de la programación orientada a objetos y el diseño de arquitecturas de software, se discute frecuentemente la diferencia entre modelos anémicos y modelos enriquecidos (también conocidos como modelos de dominio ricos). Cada uno de estos enfoques tiene implicaciones significativas en cómo se estructura y se gestiona la lógica de negocio en las aplicaciones.

Existen tres conceptos relacionados con la estructura y organización de un sistema de software que difieren en su enfoque y nivel de abstracción. Estos son:
### Modelos Anémicos

* Patrones de diseño de software.
* Patrones arquitectónicos de software.
* Estilos arquitectónicos de software.
Un **modelo anémico** describe una aproximación donde los objetos de dominio son básicamente contenedores de datos sin comportamientos o lógicas de negocio significativas. Estos modelos están compuestos primordialmente por campos de datos y sus respectivos métodos getters y setters. La lógica de negocio se maneja típicamente fuera de los objetos de dominio, a menudo en clases de servicio separadas.

![Alt text](/assets/img/Patrones-y-estilos-software.png){: .mx-auto.d-block :}
**Características de los modelos anémicos:**
- Separación de datos y comportamiento.
- Facilidad inicial en la separación y organización del código (aunque puede llevar a problemas de mantenibilidad).
- Frecuente en arquitecturas basadas en transacciones o en aplicaciones donde la lógica de negocio no está fuertemente acoplada a los estados de los objetos.

### Modelos Enriquecidos o de Dominio Rico

### Patrones de diseño de software
Un **modelo de dominio rico** es aquel en el que los objetos de dominio están diseñados para encapsular tanto datos como comportamientos. Esto significa que, además de tener campos para almacenar datos, también contienen la lógica necesaria para manejar esos datos y representar correctamente las operaciones del dominio.

{: .box-success}
Un patrón de diseño es una forma canónica nombrada para una combinación de estructuras de software y procedimientos que han demostrado ser útiles a lo largo de los años.- Uncle bob
**Características de los modelos enriquecidos:**
- Integración de datos y comportamientos en las mismas entidades o clases.
- Mayor adherencia a los principios de la programación orientada a objetos, como encapsulación e inherencia.
- Promueve un diseño más intuitivo y una mayor cohesión, lo que puede mejorar la mantenibilidad y la robustez del código.
- Puede complicar el diseño inicial y aumentar la curva de aprendizaje para nuevos desarrolladores en el proyecto.

Tal como nos dice el tío Bob los patrones de diseño de software son _soluciones_ reutilizables a problemas recurrentes (No es necesario reinventar la rueda) a nivel de diseño pero más específicamente a **nivel de implementación de clases y objetos**.
Algunos ejemplos de patrones de diseño son Singleton, Factory y Observer.
### Relación con los DTOs (Data Transfer Objects)

### Patrones arquitectónicos de software
Los **DTOs (Objetos de Transferencia de Datos)** son una técnica utilizada en el desarrollo de software para transferir datos entre sub-sistemas de una aplicación, especialmente en aplicaciones con una arquitectura de capas o en entornos distribuidos. Un DTO es, en muchos casos, similar a una instancia de un modelo anémico ya que es principalmente un contenedor de datos sin ningún comportamiento significativo agregado, diseñado solo para el transporte de datos entre capas o servicios.

Los patrones arquitectónicos son son _soluciones_ ya que describen cómo implementar **estructuras a nivel de componentes**.
**Conexión entre DTOs y modelos de diseño:**
- Los DTOs son frecuentemente utilizados junto con modelos anémicos para transferir datos desde y hacia las capas de servicio donde la lógica de negocio está implementada.
- En el contexto de modelos de dominio ricos, los DTOs aún pueden ser útiles para simplificar y desacoplar la transferencia de datos entre diferentes partes de un sistema o entre diferentes sistemas, pero el diseño de DTOs debe ser cuidadosamente gestionado para no replicar indebidamente la lógica o el estado interno del dominio.

Algunos ejemplos de patrones arquitectónicos son: Modelo-Vista-Controlador (MVC), Modelo-Vista-Presentador (MVP) o View-Interactor-Presenter-Entity-Router (VIPER).
En conclusión, los modelos anémicos y ricos representan diferentes filosofías en el diseño de software y la elección entre uno y otro puede depender de varios factores, incluidos los requisitos específicos del proyecto, las preferencias del equipo, y el contexto técnico y de negocio. Los DTOs juegan un papel importante en ambos contextos, principalmente como facilitadores en la transferencia de datos.

### Estilos Arquitectónicos de software
El concepto de los **Objetos de Transferencia de Datos (DTOs)** es bastante común en el desarrollo de software, particularmente en aplicaciones multi-capa o en sistemas distribuidos. Un DTO es un objeto que lleva datos entre procesos, con el fin de reducir el número de llamadas a métodos, especialmente en las interfaces de red. Así, su propósito principal es estructurar los datos que se pasan, por ejemplo, de la capa de lógica de negocio a la capa de presentación o entre distintos componentes de un sistema.

Los estilos arquitectónicos son configuraciones de alto nivel que definen la estructura global y las **relaciones e interacciones de componentes** en un sistema de software.
La función de los estilos arquitectónicos es proporcionar una base conceptual con principios fundamentales para el diseño de sistemas y ayudan a definir la organización general de un sistema de software.
### ¿Son los DTOs antipatrones?

Algunos de ejemplos de estilos arquitectónicos son: la arquitectura en capas (donde los componentes se organizan en capas horizontales), la arquitectura cliente-servidor (separando la funcionalidad en servidores que proveen servicios y clientes que los consumen) y la arquitectura dirigida por eventos (centrada en reaccionar a eventos).
No necesariamente. La consideración de los DTOs como antipatrones depende en gran medida del contexto específico y de cómo se implementan.

#### **Casos en que los DTOs son útiles y no representan un antipatrón:**
1. **Reducir el tráfico de red**: En aplicaciones distribuidas, especialmente aquellas que operan sobre redes más lentas o sobre Internet, minimizar el número de llamadas remotas es crucial. Los DTOs pueden encapsular múltiples datos necesarios para una sola llamada, reduciendo la necesidad de múltiples interacciones entre las capas cliente y servidor.

2. **Desacoplamiento**: Los DTOs ayudan a desacoplar la capa de presentación de la capa de negocio al servir como un intermediario que solo transfiere datos necesarios para la presentación, sin exponer la lógica de negocio interna o las entidades de persistencia.

3. **Integración entre sistemas**: En los escenarios de integración de sistemas, donde diferentes aplicaciones necesitan intercambiar datos, los DTOs proporcionan una forma estandarizada y simplificada de compartir datos sin necesidad de exponer las estructuras internas de los sistemas involucrados.


#### **Situaciones en que los DTOs podrían considerarse un antipatrón:**
1. **Sobreutilización/Abuso**: Si los DTOs se utilizan en exceso donde no son necesarios, pueden llevar a un diseño sobrecomplicado y a una gran cantidad de mapeo redundante y tedioso entre las entidades del dominio y los DTOs, lo cual podría introducir errores y complicaciones de mantenimiento.

2. **Desincronización**: Si no se gestionan adecuadamente, los DTOs pueden llevar a una desincronización entre las múltiples representaciones de los objetos (por ejemplo, entidades de dominio versus DTOs), haciendo que el sistema sea más difícil de entender y mantener.

3. **Rendimiento**: Aunque los DTOs pueden mejorar el rendimiento reduciendo las llamadas de red, el coste de mapear datos entre entidades del dominio y DTOs puede ser significativo, especialmente si el mapeo es complejo o si se manejan grandes volúmenes de datos.

### Conclusión
Los DTOs no son inherentemente antipatrones. Son herramientas que, si se utilizan correctamente, pueden mejorar la estructura y el rendimiento de una aplicación. Sin embargo, como con cualquier herramienta en ingeniería de software, su uso inapropiado puede llevar a problemas de diseño y mantenimiento. Es crucial evaluar su necesidad en el contexto específico del proyecto y aplicarlos de manera que maximicen su utilidad sin introducir complejidad innecesaria.

0 comments on commit 3375546

Please sign in to comment.