lunes, 15 de abril de 2013


Diseño guiado por el dominio


INTRODUCCIÓN
Hoy en día, la complejida del desarrollo de software es una realidad, por lo que es necesario contar con herramientas que ayuden a los procesos mas importantes de la creación de algún tipo de aplicación, es por esto que en el siguiente informe se hablara de DDD( Diseño guiado por el dominio) que es un enfoque para el desarrollo de software.

Domain-driven design (Diseño guiado por el dominio)
Es un enfoque para el desarrollo de software con necesidades complejas, mediante una profunda conexión entre la implementación y los conceptos del modelo y núcleo del negocio, al referirse al dominio se refiere al negocio, por lo tanto es importante conocer muy bien el negocio al cual se dirige el software que se desarrollara.
Domain-Driven Design no es una tecnología o una metodología. Es una manera de pensar y de un conjunto de prioridades, encaminadas a acelerar los proyectos de software que tienen que ver con los dominios complicado.
Para lograr ese objetivo, los equipos necesitan un amplio conjunto de prácticas de diseño, técnicas y principios. La refinación y la aplicación de estas técnicas será objeto de discusión para este sitio, por lo general a partir del lenguaje de los patrones establecidos en Domain-Driven Design .
Cuando la complejidad va de las manos, el software no puede ser entendido lo suficientemente bien como para ser fácilmente modificado o ampliado. Por el contrario, un buen diseño puede hacer que las oportunidades de las características complejas, la complejidad más importante de muchas aplicaciones no es técnico. Es en el dominio de sí mismo, la actividad o negocio del usuario. Cuando esta complejidad de dominio no se trata en el diseño, no importa que la tecnología de infraestructura está bien concebido. Un diseño exitoso de manera sistemática debe hacer frente a este aspecto central del programa.
El diseño del dominop propone una arquitectura, el cual nos muestra que, por lo menos, vamos a contar con una capa de dominio, una capa de infraestructura, una capa de aplicación y algún cliente o interfaz de usuario que consuma esa aplicación. Los nombres de las capas en las diferentes arquitecturas pueden variar, alguna capa puede estar o no estar, o se puede dividir en dos o más, pero lo importante es que nunca puede faltar la capa de Dominio o de Negocio. Esta capa se debe aislar del resto de las capas del sistema. Esta capa será la expresión final del negocio, la implementación limpia de un modelo guiado por el dominio. Domain-Driven Design requiere sólo la capa de negocio para existir. Los objetos de dominio deben quedar libres de la responsabilidad de mostrarse, guardarse y/o responder a tareas de la aplicación, para poder enfocarse en expresar el modelo de dominio.

Algunos de los pilares de DDD son:
·         Potenciar la colaboración con los interesados y expertos del dominio. Todo el mundo tiene que ayudar a definir el modelo (el modelo es la representación del dominio, el modelo son los elementos del dominio y sus relaciones).
·         Tiene que existir un leguaje ubícuo, es decir, tiene que haber un mismo lenguaje que esté en todas partes, tanto en los expertos del dominio, como en los técnicos, como en el modelo, como en el código
·         Cualquier programador, analista o lider de proyecto tiene que participar.
·         Cuando alguien codifica tambien participa en el modelo. El código es la implementación del modelo, pero es todo lo mismo. No tiene sentido definir un modelo y luego implementar otra cosa, en tal caso el modelo ha perdido todo su valor y hemos perdido el tiempo.
·         Como el código es el modelo, si cambiamos código habrá que avisar a los interesados y expertos del dominio.
Algunos conceptos definidos por DDD:
·         Entidad: Es un objeto que tiene un identificador único en el contexto que se este tratando. 
·         Value Object: Es un objeto que tiene atributos, pero no tiene identificador en el contexto. Pueden tener comportamiento y suelen ser inmutables. Sirven para describir cosas.
·         Servicio: Son los verbos del lenguaje ubícuo. Un servicio aparece cuando tenemos una funcionalidad que no pertenece a ningún objeto del dominio, en tal caso creamos un nuevo objeto que no es del dominio y que tendrá la responsabilidad de realizar esta funcionalidad. Esto es el patrón Fabricación Pura de GRASP. No tienen estado. Tienen que tener poco código, si hay mucho es que no se está haciendo bien la Orientación a Objetos. Normalmente se limitan a “sincronizar” operaciones entre varios objetos del dominio.
·         Agregado: Es una composición de objetos. Tiene una raíz que es una entidad. Lo normal es no poder acceder al contenido del Agregado, y todas las operaciones que se quieran hacer sobre el contenido siempre se harán a través de la entidad raíz.
·         Factoría: Crea objetos complejos (en muchos casos agregados). Crea objetos válidos (no devolverá nulos). Se parece mucho a los distintos patrones de creación de GOF.
·         Repositorio: Básicamente es el patrón DAO. Persiste entidades y agregados, no Value Objects (Los Value Object se persisten al persistir el Agregado correspondiente). La interfaz está en el dominio pero la implementación esta en la capa de infraestructura. Es muy importante el ver como en DDD hay que ser muy consciente de que los objetos es necesario guardarlos en algún sitio, y por ello la interfaz del repositorio está dentro del dominio.
·         Módulos: Paquetes, namespaces, ... Lo importante es que tienen que formar parte del lenguaje ubícuo (agrupación lógica). Es decir no tiene sentido hacer un módulo con todas las entidades, otro módulo con todos los repositorios, ...
·         Modelos anémicos. DDD no habla expresamente de modelos anémicos, pero sí lo hace de modelos “ricos” que sería el opuesto. Lo que está claro es que DDD intenta centrarse en el modelo de dominio para precisamente crear modelos ricos y evitar los modelos anémicos.

Conclusión

DDD no es una método, ni una técnica, ni una tecnología. Podríamos decir que es simplemente un conjunto de buenas prácticas especialmente pensadas para lidiar con dominios complejos o múltiples dominios, de forma que estas prácticas nos guíen en la toma de decisiones para elaborar nuestro diseño.

No hay comentarios:

Publicar un comentario