gyoandjoe / ReadingDomainDrivenDesignQuickly

Lecture of DomainDrivenDesignQuickly Book
1 stars 0 forks source link

Second week #3

Open gyoandjoe opened 9 years ago

gyoandjoe commented 9 years ago

Temas de esta semana: The Building Blocks Of A Model-Driven Design Layered Architecture Entities Value Objects Services Modules Aggregates Factories Repositories

gyoandjoe commented 9 years ago

Creo que esta parte de la lectura estuvo muy interesante porque se abarcaron los artefactos que nos permiten hacer DDD, tengo una duda: los repositorios nos permiten tener acceso a persistencia de una manera limpia, pero:

  1. ¿en que parte del dominio se deben usar un repositorio y en que partes no (se podría usar en un agregado, en un servicio de dominio, etc)?
  2. En la pagina 39 en el ejemplo antes de entities, dice que el servicio de aplicación puede persistir un objeto de dominio, pero que no debería esta capa ser agnóstica al dominio, porque persistir es una operación del dominio no de la capa de aplicación, ¿que piensan?
  3. en la pagina 53 el párrafo que comienza con "If objects of an Aggregate..." a que se refiere que los otros objetos (entiendo correspondientes al agregado) deben ser accedidos a través de "traversal associations" ?
MontealegreLuis commented 9 years ago

Hola @gyoandjoe trataré de contestar tus preguntas aunque algunas respuestas tal vez las tenga que corregir @sparra

  1. Generalmente no se usan dentro de los agregados. Los agregados son entidades que están compuestas por value objects y otras entidades, generalmente expresan una relación de composición, por ejemplo un playlist de videos y los videos que lo componen. Generalmente se usan dentro de servicios de domino o de aplicación.
  2. En el ejemplo de la página 39, no estoy muy seguro de entender, creo que de lo que debe ser agnóstico es de la implementación del mecanismo de persistencia. El servicio puede tener conocimiento de la persistencia, no de su implementación. Checa este ejemplo: https://github.com/MontealegreLuis/php-testing-tools/blob/master/src/Ewallet/Wallet/TransferFunds.php#L47 El servicio sabe que se actualizarán los datos de la entidad más no como, por lo que la implementación la puedes reemplazar. Puedes usar una implementación fake para testing, guardando los datos en memoria, por ejemplo: https://github.com/MontealegreLuis/php-testing-tools/blob/master/src/Ewallet/Wallet/Accounts/InMemoryMembers.php O puedes guardar en una BD relacional https://github.com/MontealegreLuis/php-testing-tools/blob/master/src/Ewallet/Bridges/Doctrine2/Accounts/MembersRepository.php Puedes agregar más implementaciones, piensa en otras implementaciones para guardar en Mongo o Redis, por ejemplo, o incluso mandar la información a una API REST.
  3. En esa parte, si regresamos al objeto del playlist de videos, se refiere a que la forma correcta de acceder a los videos de un playlist es a través del mismo playlist, que viene siendo la raíz de tu agregado. Por ejemplo, supon que quieres recuperar solamente los videos que has marcado como favoritos de un playlist, una forma sería:
$playlist = $playlists->mostPlayed($forLuis);
$favorites = $playlist->favoritedVideos();

En lugar de usar el repositorio para ir por los videos, recuperas el playlist, y el se encarga de recorrer y filtrarte los videos.

gyoandjoe commented 9 years ago
  1. gracias poro tu respuesta, quedo mas claro
  2. gracias por tus ejemplos, quedo mas clara esa parte que explicas de que el servicio debe ser agnóstico del mecanismo de persistencia, y hablando de servicios pienso que un servicio de aplicación no debe persistir porque esa operación corresponde al dominio, ya que al persistir estas alterando el estado del dominio y solo el dominio puede alterar el estado del dominio, y la capa de aplicación no es parte del dominio según entiendo, por otro lado la capa de aplicación puede tener acceso al repositorio para lectura ¿Qué piensas?
  3. Me gusta el ejemplo, y en ese caso como seria la recuperación de la persistencia de los videos favoritos a través de su agregado playlist? es decir yo puedo recuperar de persistencia directamente al playlist y después el como le hace para recuperar los favoritos? no lo logro visualizar en código, no se si podrias ayudarme con eso

gracias @MontealegreLuis :)

quowtf commented 9 years ago

Concuerdo con Gyo, esta parte tiene las descripciones para los conceptos fundamentales de DDD, aun así leeré otra vez Repositories.

Por otra parte... increíble pero cierto, sobre la pregunta 3 de @gyoandjoe, encontre esto en yahoo groups: https://groups.yahoo.com/neo/groups/domaindrivendesign/conversations/topics/14494

En mi caso empece con DDD a la brava, y cosas como: traversal associations, eran normales o inherente, pero bueno, ahora me siento iluminado por la divin...........

gyoandjoe commented 9 years ago

ho si, esa parte de Yahoo si queda clara, pero para recuperar datos de la persistencia del libro dice que se hace a través de traversal associtations, pero no se como un agregado puede tener acceso a la persistencia para recuperar sus objetos, para después ser este agregado el que controle su acceso a sus objetos, se me hace confusa esa parte