Un enfoque centrado en el negocio: cómo el Domain-Driven Design ayuda en la creación de software de calidad

Alejandro Isla
7 min readJan 29, 2023

El desarrollo de software puede ser un desafío, especialmente cuando se trata de proyectos de gran escala y complejidad. Es fácil perderse en la complejidad de los sistemas y terminar con una aplicación que no se ajusta a las necesidades del negocio o que es difícil de mantener. Es aquí donde entra en juego el Domain-Driven Design (DDD). DDD es una metodología para el desarrollo de software que se enfoca en comprender y modelar los conceptos clave de un dominio específico, utilizando patrones y arquitecturas específicas para ayudar en el diseño y la implementación. En este artículo, discutiremos los conceptos básicos de DDD y cómo puede ayudar a abordar la complejidad en el desarrollo de software.

¿Qué es (DDD) Domain-Driven Design?

Domain-Driven Design (DDD) es un enfoque de diseño de software que se centra en el dominio de negocio específico en lugar de centrarse solo en las técnicas de programación. Fue introducido por Eric Evans en su libro “Domain-Driven Design: Tackling Complexity in the Heart of Software” y se ha convertido en una práctica común en el desarrollo de software.

El objetivo de DDD es encontrar el lenguaje común entre los expertos del negocio y los desarrolladores de software, para que puedan trabajar juntos para construir una solución que se ajuste a las necesidades del negocio. Se basa en la idea de que el dominio de negocio es complejo y que es necesario un enfoque especializado para abordarlo adecuadamente. DDD promueve la creación de un modelo de negocio preciso y consistente, y el uso de patrones de diseño para resolver problemas comunes en el dominio.

Uno de los principales defensores de Domain-Driven Design (DDD) es Eric Evans, quien escribió el libro “Domain-Driven Design: Tackling Complexity in the Heart of Software”, considerado como la biblia del DDD. En este libro, Evans presenta los conceptos y patrones de diseño centrales del DDD, así como también ejemplos y casos de uso. Además de Evans, hay otros expertos y profesionales en el campo del desarrollo de software que defienden y promueven el uso del DDD en proyectos de desarrollo de software. Robert C. Martin, conocido como “Uncle Bob” es otro defensor destacado de Domain-Driven Design (DDD) y ha escrito varios libros y artículos sobre el tema. Él cree que el enfoque de DDD ayuda a desarrollar software que es fácil de entender y mantener, ya que se enfoca en el dominio de negocio específico en lugar de centrarse solo en las técnicas de programación. Martin argumenta que “el objetivo de DDD es encontrar el lenguaje común entre los expertos del negocio y los desarrolladores de software”. En resumen, tanto Eric Evans como Robert Martin son defensores prominentes de DDD y creen que es una forma efectiva de desarrollar software.

Conceptos Básicos

Para comprender mejor esta metodología repacemos algunos conceptos básicos a continuación:

  • Análisis del dominio: Comprender los conceptos clave de un dominio y cómo se relacionan entre sí.
  • Diseño del dominio: Utilizar los conceptos del dominio para crear un modelo preciso y consistente.
  • Implementación del dominio: Construir una aplicación usando el modelo del dominio.
  • Patrón de entidad-relación-valor (ERV): Utilizar un patrón específico para representar los conceptos clave de un dominio de manera precisa y consistente.
  • Ubicuidad del dominio: La idea de que los conceptos del dominio deben estar presentes en todas las capas de la aplicación.
  • Lenguaje común: Encontrar un lenguaje común entre expertos del negocio y desarrolladores de software.
  • Complejidad: Abordar la complejidad en el desarrollo de software mediante la comprensión y el modelado del dominio.
  • Aplicaciones de gran escala: DDD es especialmente útil en proyectos de gran escala y complejidad.
  • Patrones: Utilizar patrones específicos para ayudar en el diseño y la implementación del modelo del dominio.
  • Coherencia y consistencia: Asegurar que el modelo del dominio sea coherente y consistente en toda la aplicación.

Fases del proceso

El proceso de DDD se compone de varias fases, aunque la cantidad y nombre de estas pueden variar dependiendo de la fuente. Sin embargo, las fases más comunes son:

  • Análisis del dominio: en esta fase se investiga el dominio específico para comprender los conceptos clave y cómo se relacionan entre sí. Se busca entender las necesidades y problemas del negocio, y se identifican las áreas críticas para el éxito del proyecto.
  • Diseño del dominio: en esta fase se utilizan los conceptos identificados en la fase anterior para crear un modelo preciso y consistente del dominio. Se definen los objetos de negocio, se establecen las reglas y las relaciones entre ellos, y se establecen las arquitecturas y patrones de diseño necesarios para implementar el modelo.
  • Implementación del dominio: en esta fase se construye la aplicación utilizando el modelo del dominio y se asegura de que se cumpla la arquitectura y los patrones de diseño establecidos en la fase de diseño.
  • Mantenimiento: se refiere a la actualización y el mejoramiento continuo de la aplicación para adaptarse a los cambios en el negocio. Incluye tanto la evolución del modelo de dominio como la de la aplicación.

¿Por que deberíamos usar DDD?

  • Mejora la comprensión del negocio: Al comprender el dominio y los conceptos clave, se puede crear una aplicación que se ajuste mejor a las necesidades del negocio y sea más fácil de mantener.
  • Facilita la comunicación: DDD se enfoca en la importancia de encontrar un lenguaje común entre expertos del negocio y desarrolladores de software. Esto ayuda a evitar malentendidos y asegurar que el software se ajusta a las necesidades del negocio.
  • Ayuda en el diseño y la implementación: DDD utiliza patrones específicos para ayudar en el diseño y la implementación del modelo del dominio. Estos patrones ayudan a estructurar el código de manera consistente y fácil de entender.
  • Mejora la escalabilidad: DDD permite dividir un sistema complejo en partes manejables, cada una con su propio modelo del dominio y su propio lenguaje común. Esto ayuda a mejorar la escalabilidad del sistema.
  • Favorece la evolución: Al tener un modelo del dominio preciso y consistente, se pueden hacer cambios en el sistema de manera controlada y organizada. Esto ayuda a evitar problemas de mantenimiento y permite que el sistema evolucione de manera ordenada.

DDD ayuda a comprender mejor el negocio, mejorar la comunicación, facilitar el diseño y la implementación, mejorar la escalabilidad y favorecer la evolución del sistema.

¿Cuáles con la ventajas de usar DDD?

  • Mejora la comprensión del negocio: DDD ayuda a comprender mejor el negocio y sus conceptos clave. Esto permite crear aplicaciones que se ajusten mejor a las necesidades del negocio y sean más fáciles de mantener.
  • Facilita la comunicación: DDD se enfoca en encontrar un lenguaje común entre expertos del negocio y desarrolladores de software. Esto ayuda a evitar malentendidos y asegurar que el software se ajusta a las necesidades del negocio.
  • Ayuda en el diseño y la implementación: DDD utiliza patrones específicos para ayudar en el diseño y la implementación del modelo del dominio. Estos patrones ayudan a estructurar el código de manera consistente y fácil de entender.
  • Mejora la escalabilidad: DDD permite dividir un sistema complejo en partes manejables, cada una con su propio modelo del dominio y su propio lenguaje común. Esto ayuda a mejorar la escalabilidad del sistema.
  • Favorece la evolución: Al tener un modelo del dominio preciso y consistente, se pueden hacer cambios en el sistema de manera controlada y organizada. Esto ayuda a evitar problemas de mantenimiento y permite que el sistema evolucione de manera ordenada.

¿Cuáles con la desventajas de usar DDD?

  • Complejidad: El uso de DDD puede aumentar la complejidad de un sistema, ya que requiere una comprensión más profunda del negocio y una estructura más compleja.
  • Costo: El uso de DDD puede ser más costoso, ya que requiere tiempo y esfuerzo adicional para comprender el dominio y desarrollar el modelo del dominio.
  • Tiempo: Puede tomar más tiempo para desarrollar un sistema utilizando DDD debido a la necesidad de comprender el dominio y desarrollar el modelo del dominio.
  • Experiencia: Se necesita un cierto nivel de experiencia para implementar DDD correctamente. Si los desarrolladores no tienen experiencia en DDD, puede ser difícil implementarlo correctamente.

¿Cuándo usar DDD?

Cuando se considera utilizar DDD, es importante tener en cuenta el contexto del proyecto de software. DDD es especialmente útil en proyectos con un dominio complejo o específico, donde la comprensión del negocio es esencial para el éxito del sistema. Por ejemplo, en sistemas financieros, de seguros, de gestión de recursos humanos, de salud, de logística, entre otros, donde el dominio es muy específico y complejo.

¿Cuándo no usar DDD?

DDD no es necesario o apropiado en todos los proyectos de software. Si el dominio es simple y bien entendido, o si el sistema no está sujeto a cambios significativos, DDD puede ser considerado como sobre-ingeniería. En estos casos, puede ser más eficiente utilizar metodologías de desarrollo más simples.

En resumen, DDD es una metodología de desarrollo de software que se enfoca en comprender y modelar los conceptos clave de un dominio específico, utilizando patrones y arquitecturas específicas para ayudar en el diseño y la implementación. Sus principales defensores, Eric Evans y Robert Martin, creen que es una forma efectiva de desarrollar software que es fácil de entender y mantener, ya que se enfoca en el dominio de negocio específico en lugar de centrarse solo en las técnicas de programación. Algunos de los conceptos básicos de DDD incluyen el análisis del dominio, el diseño del dominio, la implementación del dominio, el patrón de entidad-relación-valor, la ubicuidad del dominio, el lenguaje común y la complejidad. En general, el objetivo de DDD es encontrar un lenguaje común entre los expertos del negocio y los desarrolladores de software para construir una solución que se ajuste a las necesidades del negocio.

--

--

Alejandro Isla

Ingeniero en Informática 🤓, Músico, Gamer, friki del Dota2, igual que en IG @Willywes_