Disculpe cualquier desconocimiento aquí, soy bastante nuevo en DDD, así que sea amable.DDD en un sistema de reglas configurables
Estoy trabajando en un gran sistema de gestión de datos de configuración. El sistema se construye especificando fragmentos de configuración (como reglas comerciales, procesos y validaciones) en una sintaxis externa. Digamos que la sintaxis era un conglomerado de un DSL basado en Groovy y Drools.
Me gustan las ideas de simplicidad que ofrece DDD, específicamente separando las preocupaciones de infraestructura de los conceptos básicos del dominio.
Sin embargo, estoy luchando para aplicar algunos de los conceptos de DDD debido a la naturaleza configurable del sistema. Tanto el comportamiento (procesos), la validación y las reglas comerciales se definen de forma externa al sistema. Entonces las entidades en el dominio intrínsecamente no tienen comportamiento propio. Más bien son delicado para el asunto "Validador" o el "Motor de reglas" o el "Motor de flujo de trabajo".
Lo aclararé con un ejemplo. Digamos que mi sistema administra a los empleados de una empresa. Sin pensarlo demasiado, se imaginaría que tengo una Entidad de Empleado y una Entidad de Compañía en mi dominio.
Después de DDD, estoy tratando de modelar un escenario donde se promueve a un empleado. Es posible que vea un nuevo método en el empleado denominado promote (Employee.promote). Podríamos tener una regla de negocios que indique que un empleado no puede ser promovido dos veces en el mismo año (sí, todo está compuesto). Por lo tanto, podría tener algo como:
public void promote(EmployeeLevel newLevel) {
if (hasBeenPromotedThisYear(this) {
throw new InvalidPromotionException
Pues bien, en la aplicación que estoy trabajando con esta regla de negocio se exterioriza a un motor de reglas. Después de DDD, podría hacer algo como:
if(promotionRules.isEligibleForPromotion(this)
Para exteriorizar mis reglas. Sin embargo, el sistema es mucho más genérico que esto. La operación de "promoción" se define como un "Proceso" a través de una configuración externa. Entonces, en tiempo de compilación, ni siquiera sabría si tengo una operación de "promoción" disponible para este empleado. Así que mi objeto empleado se vuelve bastante simple desde la perspectiva del código, delegando toda la funcionalidad a la configuración. Podría ser algo como:
public class Employee {
public void execute(Process process)
O, alternativamente
public class EmployeeProcess {
public void process(Employee employee)
Mi pregunta es: ¿DDD siquiera tiene sentido en esta aplicación? ¿Debería simplemente modelar la colaboración de procesos, validaciones, reglas de negocio (motor de reglas) en un sentido no DDD?
Me gusta la arquitectura de cebolla, y puedo usar la interfaz de usuario -> Servicios de aplicaciones -> Núcleo -> Infraestructura para mantener una buena separación de preocupaciones. Pero el Núcleo podría ser los colaboradores mencionados anteriormente, a diferencia de los "conceptos de dominio" reales.
Parte de mí cree que, en este caso, los "conceptos de dominio" SON los validadores, procesadores, reglas de negocio porque constituyen el lenguaje omnipresente del que hablamos cuando hablamos de nuestro sistema. En este caso, tendría Entidades sin ningún comportamiento real (en su mayor parte), y conceptos de dominio en términos de Procesadores, Validadores, Motor de Reglas que realizan el comportamiento en el sistema.
Agregando un poco más de información. Dada mi pregunta anterior, estaba trabajando en una solución que se vería así:
org.example.aplicación
org.example.domain - Empleado - Compañía - EmployeeLevel
org.example.domain.shared - Proceso - BusinessRule - Validador
org.example.infrastructure
Afortunadamente, este pequeño fragmento agrega un poco de claridad.
Por lo tanto, los conceptos Process, BusinessRule y Validator se encontrarían dentro del dominio, pero apoyarían el modelo de dominio en términos de las cosas que hace el sistema.
Gracias por la respuesta. El modelo ciertamente tendrá conceptos comerciales en ellos (siguiendo el ejemplo, habría una entidad de Empleado y una entidad de Compañía con relaciones apropiadas). Es solo que esas entidades estarían desnudas en su mayor parte. Entonces, si lo estoy siguiendo bien, ¿los procesos, las reglas y los validadores se compartirán/cosas comunes en el dominio (siguiendo el patrón de especificación)? Este era el camino por el que bajaba. – noplay
Ver la actualización de la respuesta –
Gracias por la actualización. Estoy bastante seguro de que los conceptos de negocio serán centrales en el modelo de dominio. Se trabaja mucho en la configuración, pero hay muchos conceptos básicos de negocio que estarán activos en el doman. – noplay