DDD y CQRS: Preguntas Frecuentes
āļāļąāļ
- āđāļāļĒāđāļāļĢāđāđāļĄāļ·āđāļ 5 āļ.āļ. 2025
- ðĨ ÂĄAprovecha la oferta del Black Friday de CodelyTV Pro!
âŪ codely.tv/pro/...
---
Respouestas a dudas surgidas a partir del vÃdeo sobre DDD y CQRS. Preguntas o posibles planteamientos alternativos que tambiÃĐn nos surgieron a nosotros al empezar con Domain-Driven Design y Command Query Responsibility Segregation. MÃĄs info: codely.tv/scree... - āļ§āļīāļāļĒāļēāļĻāļēāļŠāļāļĢāđāđāļĨāļ°āđāļāļāđāļāđāļĨāļĒāļĩ
Ya disponible el curso de CQRS completo donde entramos mucho mÃĄs en detalle y lo ilustramos con ejemplos de implementaciÃģn tanto en PHP como en Scala. MÃĄs informaciÃģn: pro.codely.tv/library/cqrs-command-query-responsibility-segregation-3719e4aa/62554/about/
CÃģmo gestionan cuando el command bus es asÃncrono , como se entera de que ha sucedido un error si no se espera una respuesta ?
Gracias por vuestros vÃdeos. Enhorabuena!
Excelente video amigos!!!
Eso de dejar el metodo vacio es un poco smell no? Tiene toda la pinta de estar aplicando mal la herencia
Saludos, geniales sus vÃdeos, he aprendido un montÃģn con ellos. DeberÃan hacer unos cuantos videitos sobre patrones de diseÃąo y cuando usarlos correctamente. De pronto podrÃĄ ser algo de novatillo tal vez, pero tienen una facilidad tremenda para explicar.
Para nada es algo de novato!
De hecho en el Último vÃdeo puedes ver cÃģmo usamos algunos patrones de diseÃąo para hacer el cÃģdigo mÃĄs legible: th-cam.com/video/t_gPxAeC3rc/w-d-xo.html ð
ÂĄSaludos!
Video super Útil e interesante. Tengo unas preguntas: cuando hablÃĄis de delegar al cliente la responsabilidad sobre el UUID del recurso a crear, como lo planteÃĄis a nivel de API? Imaginando que el caso de uso es crear un Post de un blog: el recurso a nivel de API incluye el UUID y nos esperamos que haya un endpoint POST /posts que en el body tenga el UUID? O pedimos un PUT /posts/{uuid}? Y cuando definimos el GET /posts/{uuid} en el body de la respuesta vuelve a aparecer el uuid como parte de la definiciÃģn de ese recurso? Cual serÃa vuestra propuesta ideal? Gracias y enhorabuena!!
con lo de crear el Id desde cÃģdigo, que pasa con la concurrencia. TambiÃĐn, otra cosa, es muy improbable que se repita, pero y si se repite? Mas que nada pensando en el Murphy... No creo que sea una buena prÃĄctica lo de crear ids para que los tests sean mas fÃĄciles, los tests, no son la aplicaciÃģn, no se si me explico.
17:20 pero se puede hacer un MockService o MockBus Tranquilamente para que no suceda eso... aislas la funcionalidad de ese raiseEvent y que da pruebas lo puntual sin afectar a lo demas, tan secillo como eso
Yo creo q pondrÃa una variable global q de estar con valor TEST, omitiera el lanzado de eventos
.... O ampliando, harÃa esto. Cada capa del dominio tendrÃa su extend abstract, asà tendrÃa una clase para implementaciÃģn, infraestructura, o como quiera subdividirse los casos de uso y nuestros test, luego entonces si, tendrÃa la variable global q indicarÃa q parte se estÃĄ testeando y el cÃģdigo sabrÃa q funcionalidad deberÃĄ ejecutarse o omitirse.
10:15 tenia entendido que en DDD el controlador pertenece a la capa de presentacion, no a la de aplicacion
4:10 Otra cosa que tenia entendido es no usar excepciones ni para las validaciones ni para la logica de negocio o para el control de flujo en general. "Deja las excepciones para situaciones excepcionales".
Por ultimo, Âŋusar un uuid como clave primaria (o cualquier campo no numerico) no disminuye el rendimiento de las consultas que requieren joins?
Hola, aunque ya ha pasado un aÃąo y quizÃĄs ya has resuelto tus dudas, creo que puedo aportar algo al respecto.
1) Cuando hablan de "aplicaciÃģn' en 10:15, no se refieren a la capa de "AplicaciÃģn" de Arquitectura Hexagonal, sinÃģ mÃĄs bien al tÃpico directorio "apps" que contiene los puntos de entrada (i.e. controllers) y otros ficheros de configuraciÃģn del propio framework o de otros bundles.
2) En cuanto a lo de las UUIDs y el bajo rendimiento al hacer joins, CQRS es tu amigo. Uno de los grandes beneficios de CQRS es que dispones de un modelo de escritura y varios de lectura. La clave estÃĄ en el modelo de lectura, puesto que estÃĄ tan "denormalizado" como necesites para facilitar las consultas de bÚsqueda, minimizando el nÚmero de JOINS, haciendo que solo sean necesarios de forma excepcional, ganando asà bastante rendimiento.
Imagina que en un modelo relacional de toda la vida tienes "user" y "user_info" dÃģnde "user_info.user_id" es una FK a la tabla "user". Para buscar la info por DNI, desde un punto de vista "tradicional", tendrÃas que hacer un JOIN entre ambas tablas, pero con CQRS simplemente tendrÃas una Única tabla (modelo de lectura) con TODOS los campos de "user" y "user_info". Ahà te ahorras el JOIN. De hecho, si al trabajar con DDD tus consultas suelen tener muchos JOIN, suele ser un sÃntoma de que el dominio no estÃĄ bien modelado y hay que segregar mÃĄs entre modelo de escritura y modelo de lectura.
Buen video, apenas estoy intentando aprender todo esto y no se por donde comenzar, que me recomiendan.
ÂĄBuenas!
Si te interesan estos temas, te recomendamos los vÃdeos de:
* IntroducciÃģn a Arquitectura Hexagonal: th-cam.com/video/GZ9ic9QSO5U/w-d-xo.html
* De cÃģdigo acoplado al framework hasta microservicios pasando por DDD: th-cam.com/video/o0w-jYun6AU/w-d-xo.html
* Si programas en PHP, el libro "DDD in PHP" tambiÃĐn te puede ser de ayuda :)
* MÃĄs vÃdeos en proceso!
Que pros!
16:50 mi punto de vista es que utilizar un ORM es una metida de pata que comunmente sucede, pierdes control de tu sentencias, Solo quiza para manipulacion de datos (IUD) pero nunca para recuperar datos. Ademas hacerlo por reflection, consume mas procesador, prefiero la programacion mas tipada
Giancarlo Huarcaya Pero si cambiar la bd es transparente gracias a usar un orm
@@FiliusDeiPatris Es la teÃģria, pero en la prÃĄctica depende mucho... si es necesaria esa potencial facilidad para cambiar de db.
Por otro lado la base de datos deberÃa estar desacoplada, tanto en interfaz de consulta como de modificaciones
Âŋque opinÃĄis de usar MongoId en lugar de UUID como identificador Único?
Yo me refiero a la unicidad que te da MongoId vs UUID. Mediante el driver de mongo en PHP puedes hacer un new \MongoId() i persistir despuÃĐs en base de datos usando ese objeto, sin necesidad de flushear para saber que MongoId te ha generado la base de datos.
eso es cierto...tal vez ese es el motivo que hace que no sea aconsejable usar \MongoId como identificador Único. gracias!
Realmente el principal beneficio que se busca aquà es poder generar los identificadores desde el exterior de nuestra aplicaciÃģn, y no desde la infraestructura como serÃa el caso de IDs autoincrementales. Buscamos este beneficio principalmente por testing tal y como se explica en el vÃdeo :)
@Dani va bien encaminado, pero aÚn asÃ, podrÃamos pensar en usar la implementaciÃģn de \MongoId como adaptador de esos identificadores en vez de una librerÃa de UUIDs. Aquà el voto personalmente seguirÃa yendo para UUIDs. Es un formato mÃĄs estÃĄndar que incluso algunas bases de datos y lenguajes ya reconocen como tipo primitivo. AdemÃĄs, se hace mÃĄs fÃĄcil encontrar soporte en otros lenguajes como por ejemplo JavaScript, en vez de MongoIds :)
Hola,
He estado estudiando vuestro proyecto (github.com/CodelyTV/cqrs-ddd-example/) y me surgen las siguientes dudas:
Por cada entidad creÃĄis un bundle (CodelyTv\Context\Video\Infrastructure\Symfony\Bundle) que puede contener diferente conexiÃģn a bd?
Gracias por vuestros vÃdeos!
esta muy bajo el audio :(
estos conceptos me parecen tan confusos :(
Estos quienes son? Vuestros hijos?
hablen mÃĄs duro pls
Buen programa chicos. Si me lo permitÃs, para los programadores .NET he creado unos vÃdeos explicando cÃģmo implementar Event Sourcing desde cero sin utilizar ningÚn framework ni librerÃa.
Event sourcing complementa a CQRS a la perfecciÃģn hasta el punto en el que como bien decÃs se puede usar CQRS sin event sourcing pero no se puede usar Event Sourcing sin CQRS (o digamos que no serÃa prÃĄctico)
Aquà dejo informaciÃģn de lo que es event sourcing y de lo sencillo que es su implementaciÃģn.
A vuestra disposiciÃģn si le veis utilidad!
Parte 1 de 3 (teorÃa): th-cam.com/video/dw6TLp2wDgs/w-d-xo.html
Parte 2 de 3 (implementaciÃģn de componentes de event sourcing): th-cam.com/video/EIJTg3NLH_Y/w-d-xo.html
Parte 3 de 3 (implementaciÃģn de demo): th-cam.com/video/qNZ-_cBACk8/w-d-xo.html
ÐŧŅŅŅÐĩ Ðą Ð―Ð° ŅŅŅŅКÐūО ÐēÐĩŅаÐŧÐļ