La descripción del problema es un ejemplo de libro de texto típico cuando demasiado blabla sobre 'esto es bueno, eso es malo' se convierte en la razón por la cual un desarrollador crea el software tal como se creó en vez de mirar el problema y crear software para arreglar ese problema
Caso en cuestión: la descripción de su problema no es su problema para resolver: tiene una aplicación para crear para su cliente, ese es el problema que debe resolver. Si su elección de herramientas le dificulta la vida, eche a un lado y use lo que funciona: si la burla no funciona, ¿para qué molestarse? Oh, ¿porque alguien dijo que tu software apestará si no te burlas? ¿Por qué?
Has recogido algunas cosas de DDD aquí y allá, pero te has perdido algunas partes importantes: El producto es una raíz agregada. Esto significa que debe obtener productos de su propio repositorio. Sí, eso mitiga la función de navegación en el modelo, pero eso es DDD para usted, SI crea los repositorios estrictamente como dicta la segunda parte del libro de Evans. Pero ... ¿deberías?
Si no puede responder por qué el Producto tiene su propio repositorio, pero puede navegar hasta los productos desde Orden, no debe crear repositorios para raíces agregadas. ¿POR QUÉ es ese depósito allí? Si está allí, ¿no debería ser el ÚNICO punto en el que se pueden obtener productos? (¡así que tampoco a través de la carga floja!).
De hecho, esto creará muchos sobrecargas y códigos que probablemente no necesitará (así que irónicamente, YAGNI en pleno efecto).
Ok, suficiente despotricando. DDD se trata de pensando. Entonces, el dominio debe conducir el diseño, y al practicar eso, obtendrás un modelo de dominio que representa la realidad. Eso no quiere decir que debas implementar una gran cantidad de código solo porque leas en algún lugar que deberías. En cambio, si ha reconocido los elementos del dominio, las raíces agregadas, etc., debe colocar el comportamiento para estos tipos en algún lugar, p. dentro de las clases de dominio. Puede colocar la lógica de búsqueda en clases separadas, como la lógica de búsqueda orientada a órdenes en un repositorio de órdenes, pero no será un repositorio en sentido estricto (por ejemplo, no tiene su propia memoria caché local, etc.). Eso no es tan malo, se trata de lo que debe crear para su cliente.
Entonces, primero: pensar, segundo: pensar, y tercero: pensar ... otra vez. Lo que parece lógico para ti Haga una lista de pros/contras de las opciones que tiene y elija la que le parezca más adecuada. Documenta esa elección y por qué elegiste esa y no las alternativas.Esto les da más valor a los mantenedores que a cualquier otra fuente: documentas las alternativas y por qué no las elegiste, investigas qué funcionará para ti y eliges una.
Ingeniería de software no es difícil, pero es que hoy en día parece la manera con que se haga primero y pensar después, sin una motivación adecuada qué uno podría hacerlo de esa manera y no a la inversa.
Buena suerte :)
Gracias. En cuanto a "pensar", eso es lo que he estado haciendo, ¡y es por eso que pedí opiniones aquí antes de seguir adelante! Soy nuevo en este patrón y espero tener una idea de aquellos con más experiencia. Saludos de nuevo. – Grokys
Sí, debería haberte dado más crédito, lo siento. Su último párrafo de la pregunta sugiere, de hecho, que se dio cuenta de que lo que estaba haciendo no era realmente tan útil. La próxima vez, intente aplicar ese proceso antes de escribir cualquier código;) (que está quizás un paso más allá de cómo quiere trabajar) para que no tenga que tirar el código ya escrito. –
¡La parte menos brillante de esta respuesta fue lo mejor que he leído en SO! Hay demasiado de "deberías hacer esto/eso" alrededor y es un soplo de aire fresco de montaña para leer a alguien diciendo "haz lo que funcione para tu solución". – Remotec