SlideShare une entreprise Scribd logo
1  sur  16
II - Vitaminando nuestros casos de uso
Maikel González Baile
Software Engineer @Ontruck
@mgonzalezbaile
Luis Matesanz Barroso
CTO @Gstock
@sitocasla
#phpmadusecases
¿Por qué no una charla al uso?
● Charlas teóricas pero poco debate en posibles implementaciones.
● Mob programming, live coding, kata ...
● Serie de workshops para intentar llegar desde una aplicación con código
legacy a una aplicación distribuida y escalable.
Code Review Marketplace
Hemos creado un Marketplace en el que un
usuario puede crear una Pull Request y solicitar
su revisión a cualquier revisor registrado en la
plataforma.
El sistema calculará la cuota que el creador de
la PR debe pagar para ver las revisiones.
Casos de uso:
● Crear Pull Request:
○ Código, Revisores, Fecha de Revisión
● Calcular cuota
○ #LOC, Fecha de Revisión, #Revisores
● Enviar notificación a revisores
● Aprobar Pull Request
Caso de Uso - ¿Qué es?
“In software and systems engineering, a
use case is a list of actions or event
steps typically defining the interactions
between a role (known in the Unified
Modeling Language (UML) as an actor)
and a system to achieve a goal. The actor
can be a human or other external
system.” - Wikipedia
Action: Edit an article
Actor: Member
Preconditions:
● The article has editing flag enabled.
● The article exists.
● The member exists.
Postconditions
● Success:
○ The article is edited.
● Failure:
○ Editing the article failed due to editing flag
was disabled.
Conceptos explícitos en el código
● Action (intención de hacer algo) == Command
● Pre-conditions (reglas de negocio, invariantes, …) == Use Case
● Post-conditions (qué ha ocurrido) == Eventos de Dominio
● Policy (acción-reacción) == Pub/Sub + SAGAs
CreateUserCommand
● name
● address
● ...
CreateUserUseCase
if name < 5: ...
if userAlreadyExist: ...
CreateUserFailed
“Because user already
exists”
UserCreated
● name
● address
● ...
Policy
When: UserCreated
Then: SendEmailCommand
Ejemplos
● Approve Pull Request (Happy Path):
○ Given a Pull Request with some reviewers assigned.
○ When an assigned reviewer attempts to approve the Pull Request
○ Then the Pull Request should be approved.
● Approve Pull Request (Failure):
○ Given a Pull Request with some reviewers assigned.
○ When an unassigned reviewer attempts to approve the Pull Request
○ Then the approval should fail.
● Approve Pull Request (Failure):
○ Given a Pull Request already approved.
○ When an assigned reviewer attempts to approve the Pull Request
○ Then the approval should fail.
WTF?
● Pero... ¿y ésto cómo se testea?
● Sí, muy bien, retornamos un evento… ¿pero y la BBDD? No
hemos guardado nada!
● Genial! Ya tengo mi caso de uso! ¿Y ahora cómo lo ejecuto?
● Bueno, ¿y todo esto para qué?
● ¿Y ésto de dónde os lo habéis sacado?
¿Ésto cómo se testea?
● Approve Pull Request (Happy Path):
○ Given a Pull Request with some reviewers assigned.
○ When an assigned reviewer attempts to approve the Pull Request
○ Then the Pull Request should be approved.
● Approve Pull Request (Failure):
○ Given a Pull Request with some reviewers assigned.
○ When an unassigned reviewer attempts to approve the Pull Request
○ Then the approval should fail.
● Approve Pull Request (Failure):
○ Given a Pull Request already approved.
○ When an assigned reviewer attempts to approve the Pull Request
○ Then the approval should fail.
CreatePrCommand
● code
● creator
● ...
¿Y la BDD?
CreatePrUseCase
if code < 5: ...
PrCreated
● code
● creator
● ...
PullRequest
● code
● creator
● ...
● Nos aseguramos que todos los datos que queramos tener en nuestra tabla deben
estar en el evento, creando un log de eventos consistente con el estado de nuestras
tablas.
● Separación total de Dominio e Infraestructura a la hora de lidiar con un problema u
otro.
● Aislamiento de la lógica de negocio y persistencia a la hora de testear nuestro
código.
● Modificar y/o extender nuestro esquema de BBDD no tiene porqué impactar nuestro
PullRequestCreated
PullRequestApproved
PullRequestMerged
CollectMoneyFailed
EVENT STORE
Test de Integración
● Approve Pull Request (Happy Path):
○ Given a Pull Request with some reviewers assigned.
○ When an assigned reviewer attempts to approve the Pull Request
○ Then the Pull Request should be approved.
○ And the projection should be XXX.
¿Y ahora cómo lo ejecuto?
● Ports & Adapters:
○ Port: HTTP. Adapters:
■ Restful
■ gRPC
■ SOAP
○ Port: Messaging. Adapters:
■ RabbitMQ
■ Kafka
○ Port: Persistence. Adapters:
■ MySQL
■ SQLite
■ Postgres
Vitaminando nuestros Casos de Uso
Decorator PatternCommand Bus Pattern Chain of Responsibility Pattern
¿Y todo ésto para qué?
● Legibilidad del código:
○ Given/When/Then
○ Conceptos de dominio explícitos
● Eventos:
○ Métricas de negocio
○ Audit log
○ Errores => Excepciones => Bugs
○ Pub/Sub
■ Desacoplamiento
■ OCP & SRP (SOLID)
● Divide y Vencerás:
○ Foco en negocio o infraestructura
○ Paralelismo de tareas: caso de uso,
persistencia, API (+ doc)
● Robustez for free:
○ Transacción
○ DB Locks acotados
○ Consistencia estado + eventos
○ Trazabilidad
○ Tests dependientes de
comportamiento y no de estructura
● Homogeneidad de código cross
language
● Framework de negocio
¿Y ésto de dónde lo habéis sacado?
Cuándo aplicar lo aprendido
SOLID
Casos de
Uso
Eventos
¿Tú has entendido
algo?
Tests Desacoplado
Si mi padre sólo
me pidió una
web…
GRACIAS!!
#phpmadusecases

Contenu connexe

Similaire à II - Vitaminando nuestros casos de uso

Kubernetes technical overview and our experience at Restorando :: Buenos Aire...
Kubernetes technical overview and our experience at Restorando :: Buenos Aire...Kubernetes technical overview and our experience at Restorando :: Buenos Aire...
Kubernetes technical overview and our experience at Restorando :: Buenos Aire...Restorando
 
Entrega contínua en la práctica
Entrega contínua en la prácticaEntrega contínua en la práctica
Entrega contínua en la prácticaCarlos Fuentes
 
Automatizar o no desde el principio? ese es el dilema...
Automatizar o no desde el principio? ese es el dilema...Automatizar o no desde el principio? ese es el dilema...
Automatizar o no desde el principio? ese es el dilema...Enrique Carbonell
 
VLCTechFest - Simplificando Controladores: Una introducción a Action-Domain ...
VLCTechFest -  Simplificando Controladores: Una introducción a Action-Domain ...VLCTechFest -  Simplificando Controladores: Una introducción a Action-Domain ...
VLCTechFest - Simplificando Controladores: Una introducción a Action-Domain ...Miguel Ángel Sánchez Chordi
 
SEOnderground 2022 | Migraciones web: el verdadero viernes 13
SEOnderground 2022 | Migraciones web: el verdadero viernes 13SEOnderground 2022 | Migraciones web: el verdadero viernes 13
SEOnderground 2022 | Migraciones web: el verdadero viernes 13Paula Alvarez
 
Ponele el TURBO al Dev Team de tu Startup
Ponele el TURBO al Dev Team de tu StartupPonele el TURBO al Dev Team de tu Startup
Ponele el TURBO al Dev Team de tu StartupMartin Siniawski
 
Meetup TestingUy 2019 - Contribuir con la definición de requerimientos para e...
Meetup TestingUy 2019 - Contribuir con la definición de requerimientos para e...Meetup TestingUy 2019 - Contribuir con la definición de requerimientos para e...
Meetup TestingUy 2019 - Contribuir con la definición de requerimientos para e...TestingUy
 
Introduccion meteor.js
Introduccion meteor.jsIntroduccion meteor.js
Introduccion meteor.jsIcalia Labs
 
Webinar: Migrar el testing a open source
Webinar: Migrar el testing a open sourceWebinar: Migrar el testing a open source
Webinar: Migrar el testing a open sourceFederico Toledo
 
User Stories - Cómo crearlas y cuándo usarlas. Con Sr. UX Manager Rodrigo Par...
User Stories - Cómo crearlas y cuándo usarlas. Con Sr. UX Manager Rodrigo Par...User Stories - Cómo crearlas y cuándo usarlas. Con Sr. UX Manager Rodrigo Par...
User Stories - Cómo crearlas y cuándo usarlas. Con Sr. UX Manager Rodrigo Par...Omar Corona
 
BBVA Arquitectura - Demo DevOps
BBVA Arquitectura - Demo DevOpsBBVA Arquitectura - Demo DevOps
BBVA Arquitectura - Demo DevOpsErnesto Anaya
 
¿Grails + DDD + Eventsourcing + CQRS?
¿Grails + DDD + Eventsourcing + CQRS?¿Grails + DDD + Eventsourcing + CQRS?
¿Grails + DDD + Eventsourcing + CQRS?Jorge Franco Leza
 

Similaire à II - Vitaminando nuestros casos de uso (20)

Kubernetes technical overview and our experience at Restorando :: Buenos Aire...
Kubernetes technical overview and our experience at Restorando :: Buenos Aire...Kubernetes technical overview and our experience at Restorando :: Buenos Aire...
Kubernetes technical overview and our experience at Restorando :: Buenos Aire...
 
Ajax: introducción
Ajax: introducciónAjax: introducción
Ajax: introducción
 
Entrega contínua en la práctica
Entrega contínua en la prácticaEntrega contínua en la práctica
Entrega contínua en la práctica
 
Automatizar o no desde el principio? ese es el dilema...
Automatizar o no desde el principio? ese es el dilema...Automatizar o no desde el principio? ese es el dilema...
Automatizar o no desde el principio? ese es el dilema...
 
VLCTechFest - Simplificando Controladores: Una introducción a Action-Domain ...
VLCTechFest -  Simplificando Controladores: Una introducción a Action-Domain ...VLCTechFest -  Simplificando Controladores: Una introducción a Action-Domain ...
VLCTechFest - Simplificando Controladores: Una introducción a Action-Domain ...
 
ASPgems 2018
ASPgems 2018 ASPgems 2018
ASPgems 2018
 
Las SinCuenta Sombras de Scrum
Las SinCuenta Sombras de ScrumLas SinCuenta Sombras de Scrum
Las SinCuenta Sombras de Scrum
 
Los retos de un tester ágil
Los retos de un tester ágilLos retos de un tester ágil
Los retos de un tester ágil
 
SEOnderground 2022 | Migraciones web: el verdadero viernes 13
SEOnderground 2022 | Migraciones web: el verdadero viernes 13SEOnderground 2022 | Migraciones web: el verdadero viernes 13
SEOnderground 2022 | Migraciones web: el verdadero viernes 13
 
Ponele el TURBO al Dev Team de tu Startup
Ponele el TURBO al Dev Team de tu StartupPonele el TURBO al Dev Team de tu Startup
Ponele el TURBO al Dev Team de tu Startup
 
Bootcamp Javascript Online
Bootcamp Javascript OnlineBootcamp Javascript Online
Bootcamp Javascript Online
 
Meetup TestingUy 2019 - Contribuir con la definición de requerimientos para e...
Meetup TestingUy 2019 - Contribuir con la definición de requerimientos para e...Meetup TestingUy 2019 - Contribuir con la definición de requerimientos para e...
Meetup TestingUy 2019 - Contribuir con la definición de requerimientos para e...
 
Introduccion meteor.js
Introduccion meteor.jsIntroduccion meteor.js
Introduccion meteor.js
 
Architectural katas - La Plata - 23-07-2015
Architectural katas - La Plata - 23-07-2015Architectural katas - La Plata - 23-07-2015
Architectural katas - La Plata - 23-07-2015
 
Webinar: Migrar el testing a open source
Webinar: Migrar el testing a open sourceWebinar: Migrar el testing a open source
Webinar: Migrar el testing a open source
 
User Stories - Cómo crearlas y cuándo usarlas. Con Sr. UX Manager Rodrigo Par...
User Stories - Cómo crearlas y cuándo usarlas. Con Sr. UX Manager Rodrigo Par...User Stories - Cómo crearlas y cuándo usarlas. Con Sr. UX Manager Rodrigo Par...
User Stories - Cómo crearlas y cuándo usarlas. Con Sr. UX Manager Rodrigo Par...
 
Caso de Éxito: Proyecto Agile en una compañia Cementera
Caso de Éxito: Proyecto Agile en una compañia CementeraCaso de Éxito: Proyecto Agile en una compañia Cementera
Caso de Éxito: Proyecto Agile en una compañia Cementera
 
BBVA Arquitectura - Demo DevOps
BBVA Arquitectura - Demo DevOpsBBVA Arquitectura - Demo DevOps
BBVA Arquitectura - Demo DevOps
 
Working with a design system
Working with a design systemWorking with a design system
Working with a design system
 
¿Grails + DDD + Eventsourcing + CQRS?
¿Grails + DDD + Eventsourcing + CQRS?¿Grails + DDD + Eventsourcing + CQRS?
¿Grails + DDD + Eventsourcing + CQRS?
 

II - Vitaminando nuestros casos de uso

  • 1. II - Vitaminando nuestros casos de uso Maikel González Baile Software Engineer @Ontruck @mgonzalezbaile Luis Matesanz Barroso CTO @Gstock @sitocasla #phpmadusecases
  • 2. ¿Por qué no una charla al uso? ● Charlas teóricas pero poco debate en posibles implementaciones. ● Mob programming, live coding, kata ... ● Serie de workshops para intentar llegar desde una aplicación con código legacy a una aplicación distribuida y escalable.
  • 3. Code Review Marketplace Hemos creado un Marketplace en el que un usuario puede crear una Pull Request y solicitar su revisión a cualquier revisor registrado en la plataforma. El sistema calculará la cuota que el creador de la PR debe pagar para ver las revisiones. Casos de uso: ● Crear Pull Request: ○ Código, Revisores, Fecha de Revisión ● Calcular cuota ○ #LOC, Fecha de Revisión, #Revisores ● Enviar notificación a revisores ● Aprobar Pull Request
  • 4. Caso de Uso - ¿Qué es? “In software and systems engineering, a use case is a list of actions or event steps typically defining the interactions between a role (known in the Unified Modeling Language (UML) as an actor) and a system to achieve a goal. The actor can be a human or other external system.” - Wikipedia Action: Edit an article Actor: Member Preconditions: ● The article has editing flag enabled. ● The article exists. ● The member exists. Postconditions ● Success: ○ The article is edited. ● Failure: ○ Editing the article failed due to editing flag was disabled.
  • 5. Conceptos explícitos en el código ● Action (intención de hacer algo) == Command ● Pre-conditions (reglas de negocio, invariantes, …) == Use Case ● Post-conditions (qué ha ocurrido) == Eventos de Dominio ● Policy (acción-reacción) == Pub/Sub + SAGAs CreateUserCommand ● name ● address ● ... CreateUserUseCase if name < 5: ... if userAlreadyExist: ... CreateUserFailed “Because user already exists” UserCreated ● name ● address ● ... Policy When: UserCreated Then: SendEmailCommand
  • 6. Ejemplos ● Approve Pull Request (Happy Path): ○ Given a Pull Request with some reviewers assigned. ○ When an assigned reviewer attempts to approve the Pull Request ○ Then the Pull Request should be approved. ● Approve Pull Request (Failure): ○ Given a Pull Request with some reviewers assigned. ○ When an unassigned reviewer attempts to approve the Pull Request ○ Then the approval should fail. ● Approve Pull Request (Failure): ○ Given a Pull Request already approved. ○ When an assigned reviewer attempts to approve the Pull Request ○ Then the approval should fail.
  • 7. WTF? ● Pero... ¿y ésto cómo se testea? ● Sí, muy bien, retornamos un evento… ¿pero y la BBDD? No hemos guardado nada! ● Genial! Ya tengo mi caso de uso! ¿Y ahora cómo lo ejecuto? ● Bueno, ¿y todo esto para qué? ● ¿Y ésto de dónde os lo habéis sacado?
  • 8. ¿Ésto cómo se testea? ● Approve Pull Request (Happy Path): ○ Given a Pull Request with some reviewers assigned. ○ When an assigned reviewer attempts to approve the Pull Request ○ Then the Pull Request should be approved. ● Approve Pull Request (Failure): ○ Given a Pull Request with some reviewers assigned. ○ When an unassigned reviewer attempts to approve the Pull Request ○ Then the approval should fail. ● Approve Pull Request (Failure): ○ Given a Pull Request already approved. ○ When an assigned reviewer attempts to approve the Pull Request ○ Then the approval should fail.
  • 9. CreatePrCommand ● code ● creator ● ... ¿Y la BDD? CreatePrUseCase if code < 5: ... PrCreated ● code ● creator ● ... PullRequest ● code ● creator ● ... ● Nos aseguramos que todos los datos que queramos tener en nuestra tabla deben estar en el evento, creando un log de eventos consistente con el estado de nuestras tablas. ● Separación total de Dominio e Infraestructura a la hora de lidiar con un problema u otro. ● Aislamiento de la lógica de negocio y persistencia a la hora de testear nuestro código. ● Modificar y/o extender nuestro esquema de BBDD no tiene porqué impactar nuestro PullRequestCreated PullRequestApproved PullRequestMerged CollectMoneyFailed EVENT STORE
  • 10. Test de Integración ● Approve Pull Request (Happy Path): ○ Given a Pull Request with some reviewers assigned. ○ When an assigned reviewer attempts to approve the Pull Request ○ Then the Pull Request should be approved. ○ And the projection should be XXX.
  • 11. ¿Y ahora cómo lo ejecuto? ● Ports & Adapters: ○ Port: HTTP. Adapters: ■ Restful ■ gRPC ■ SOAP ○ Port: Messaging. Adapters: ■ RabbitMQ ■ Kafka ○ Port: Persistence. Adapters: ■ MySQL ■ SQLite ■ Postgres
  • 12. Vitaminando nuestros Casos de Uso Decorator PatternCommand Bus Pattern Chain of Responsibility Pattern
  • 13. ¿Y todo ésto para qué? ● Legibilidad del código: ○ Given/When/Then ○ Conceptos de dominio explícitos ● Eventos: ○ Métricas de negocio ○ Audit log ○ Errores => Excepciones => Bugs ○ Pub/Sub ■ Desacoplamiento ■ OCP & SRP (SOLID) ● Divide y Vencerás: ○ Foco en negocio o infraestructura ○ Paralelismo de tareas: caso de uso, persistencia, API (+ doc) ● Robustez for free: ○ Transacción ○ DB Locks acotados ○ Consistencia estado + eventos ○ Trazabilidad ○ Tests dependientes de comportamiento y no de estructura ● Homogeneidad de código cross language ● Framework de negocio
  • 14. ¿Y ésto de dónde lo habéis sacado?
  • 15. Cuándo aplicar lo aprendido SOLID Casos de Uso Eventos ¿Tú has entendido algo? Tests Desacoplado Si mi padre sólo me pidió una web…

Notes de l'éditeur

  1. Mostrar cómo estaba el código y cómo quedó tras la refactorización: Lógica de negocio desperdigada por Entidad, Controller, DoctrineListener, …. => Casos de uso No tests: Tests para cada caso de uso y End2End
  2. Punto de vista de Backend, no UI. No estamos hablando de Infraestructura, BBDD, APIs, Cron jobs, ….
  3. Beneficios caso de uso: Al ser una única clase es difícil, a menos que estés modificando diferentes funcionalidades a la vez, tener conflictos. Te permite enfocarte en un determinado problema/funcionalidad, “olvidando el resto” Al estar separado el comando es fácilmente serializable para automatizar la llamada del caso de uso o ser persistido en BBDD. Mencionar la historia que tiene detrás el CommandHandler para ver cómo ha evolucionado del Command pattern, pasando por los Application Services hasta él. Command - Handler: https://jimmybogard.com/domain-command-patterns-handlers/ Evento en past tense
  4. Seguimos queriendo trasladar el lenguaje de negocio, humano, a nuestro código. Test de comportamiento, no de estructura -> mover lógica del caso de uso a la Entidad
  5. Dónde y cómo persistir el evento y la Entidad ES OTRO PROBLEMA.
  6. Mostrar ejemplo de endpoint
  7. Estos 3 patrones nos permiten extender la funcionalidad de nuestros casos de uso de manera transparente para ellos