Ejemplo de replanteamiento de diseño de Software en Uvinum.
Introducir conceptos como Clean Code, Code Smells, Refactoring, Arquitectura Hexagonal, testing, Domain-Driven Design, etc.
29. #scbcn15 // #PhpirstAid
Síntomas
■ Falta de test
■ Código altamente acoplado
■ Al framework (clases Controller y Model)
■ A librerías externas
■ A implementaciones concretas
■ Falta de modelado del dominio
■ “Modelos” obesos
■ Controladores obesos
■ Código de difícil lectura
30. #scbcn15 // #PhpirstAid
■ Falta de test => Reticencia al cambio/descontrol
■ Alto acoplamiento => Poca cambiabilidad
Síntomas
40. #scbcn15 // #PhpirstAid
Arquitectura Hexagonal
■ Ports & Adapters
■ Programación contra contratos / DIP FTW
■ Separación en capas
■ Cambiabilidad
■ Regla de dependencia de fuera hacia dentro
■ Bajo acoplamiento
41. #scbcn15 // #PhpirstAid
■ Hexagonal Architecture, @fideloper
■ Hexagonal Architecture with PHP, @buenosvinos
■ Repo
■ Application Services vs. Infrastructure Services vs. Domain
Services, @BenNadel
Takeaways
49. #scbcn15 // #PhpirstAid
DDD - Read Model
■ Ataca a la misma BBDD (progresivo)
■ Permite violar restricciones del Write Model (WM)
para optimizar rendimiento
■ No usa el dominio del WM para evitar pervertirlo
■ Basado en DTOs
52. #scbcn15 // #PhpirstAid
Read Model Composer
■ Finalidad: Agilizar desarrollo Read Model
■ Reutilizar DTOs y “repositorios dependientes”
■ Tradeoff que decidimos asumir :)
68. #scbcn15 // #PhpirstAid
Takeaways
■ The SOLID Principles, @Tutsplus
■ Code Smells & Refactorings, @RefactoringGuru
■ Design Patterns, SourceMaking
■ Screencasts de SOLID, @CodelyTV
■ Ejemplos de código propio (involucrar, motivación)
69. #scbcn15 // #PhpirstAid
Sesiones Rethinking Code - Diseño “a alto nivel” (1/2)
7. Teoría Hexagonal Architecture
8. Workshop Hexagonal Architecture
9. DDD Building Blocks - Value Objects
10. DDD Building Blocks - Values Objects Workshop
11. DDD Building Blocks - Entities & Aggregates
12. DDD Building Blocks - Entities & Aggregates Workshop
70. #scbcn15 // #PhpirstAid
■ The Two Sides of Domain-Driven Design (DDD), @eulerfx
■ Repo Symfony MPWAR Edition, @Eloipoch y @SergiGP
■ Domain-Driven Design in PHP, @buenosvinos @theUniC y @KeyvanAkbary
■ Implementing Domain-Driven Design, @VaughnVernon
■ Ejercicios con contexto propio (acercar)
Takeaways
71. #scbcn15 // #PhpirstAid
13. Dominio vs. Aplicación vs. Infraestructura y DI
14. Use Read Model, stay legen...dary, y lo otro ya tal
15. Read Model Workshop
16. Pedidos conjuntos
17. Event Driven Development
Sesiones Rethinking Code - Diseño “a alto nivel” (2/2)
72. #scbcn15 // #PhpirstAid
Sesiones Rethinking Code - Testing
18. First tests exercises
19. TDD with legos
20. Setting up phpunit,
asserts and testing types
21. …
75. #scbcn15 // #PhpirstAid
■ Equipo arquitectura
■ Composer
■ SOLID
■ Dependency Injector Container
■ Arquitectura Hexagonal
■ Lógica desacoplada del framework
■ Eventos
Puntos de inflexión
76. #scbcn15 // #PhpirstAid
Errores cometidos
■ Gestión inicial del equipo de arquitectura
■ Cuello de botella a la hora de resolver dudas
■ Intentar encajar Write Model en Read Model
■ Subestimar impacto
■ Subestimar Bounded Contexts
77. “
#scbcn15 // #PhpirstAid
Si tu aplicación no es compleja, no te líes con DDD.
Tira por CRUD y no hay problema.
-Dicho popular