SlideShare una empresa de Scribd logo
SIMPLIFICANDO CONTROLADORES:
Una introducción a Action-Domain-
Responder
Miguel Ángel Sánchez Chordi @slaimer
Valencia, 2 de junio de 2018
UN POCO SOBRE MÍ
● PHP Developer desde 2005.
● Miembro de PHP Valencia (anteriormente
SymfonyVLC) desde 2013.
● Senior Backend Developer en Wossom.
Anteriormente en Beroomers.com y Origo.by
● Tengo un blog sobre Clean Code!
○ https://medium.com/all-you-need-is-clean-code
● Podcaster en “Leyendo Ciencia Ficción”!
UN POCO SOBRE MÍ
Anteriormente me habrás visto en otras charlas en PHP Valencia como:
● Servicios Web REST (Breve introducción a REST)
○ http://www.slideshare.net/slaimer/introduccin-a-rest-symfonyvlc
○ https://www.youtube.com/watch?v=dWLuTVSMMfs
● ¿Qué es OAuth y cómo se implementa?
○ http://www.slideshare.net/slaimer/qu-es-eso-de-oauth
○ https://www.youtube.com/watch?v=KONIDG1wp4g
CONTROLADORES
CONTROLADORES
El cajón de sastre de todo proyecto web
Patrón MVC - Introducción
● Los controladores son una de las 3 patas del patrón MVC
● MVC fue propuesto en 1979
● Tuvo un gran auge en los 90 y a principios de 2000
● Está pensado para su uso en aplicaciones de interfaz gráfica, donde cada
componente (botón, input, menú…) tiene asociada su triada MVC.
Patrón MVC - Introducción
● Los controladores son una de las 3 patas del patrón MVC
● MVC fue propuesto en 1979
● Tuvo un gran auge en los 90 y a principios de 2000
● Está pensado para su uso en aplicaciones de interfaz gráfica, donde cada
componente (botón, input, menú…) tiene asociada su triada MVC.
Patrón MVC - Componentes
● El Modelo es el actor principal, el que aglutina la lógica y actualiza el estado.
● La Vista es la parte visual de la aplicación, la representación final de los datos
y de las acciones del usuario.
● La misión del Controlador es ser un canal de comunicación entre la vista y el
modelo.
Patrón MVC - Componentes
Patrón MVC - Componentes
Patrón MVC - Componentes
Patrón MVC - Componentes
MVC en detalle
● En realidad, no es considerado un patrón arquitectónico, sino un patrón de
interfaz de usuario.
● Si revisamos la literatura disponible en el momento de su concepción,
siempre se hacen referencias a interacciones de usuario, elementos en
pantalla, dispositivos de entrada…
● No se plantea como un patrón global para gobernar toda la aplicación, cada
elemento en pantalla tiene su triada MVC
● Mediante un sistema de mensajería event/subscriber todos los elementos se
mantienen comunicados.
MVC en aplicaciones web server-side
● Una aplicación web server-side (monolítica) no sigue este flujo, ya que se
basa en peticiones HTTP.
● A cada petición que se hace se destruye y crea la interfaz gráfica
● No mantienen una interfaz “viva”.
SUN Microsystems y MODEL 2
● La primera referencia a MVC y server-side viene de mano de SUN
Microsystems, que se apropió del nombre de sus componentes para su
patrón MODEL 2.
● SUN reinterpretó a su manera cada una de las partes de MVC, y gracias a el
auge de Apache Struts, en el mundillo del desarrollo backend se asimilaron
los componentes MVC tal cual los había planteado MODEL 2
SUN Microsystems y Model 2
En 1999 se podía leer en JavaWorld un artículo introductorio de MODEL 2 la
siguiente recomendación:
Properly applied, the Model 2 architecture should result in the concentration of all of the processing logic in the hands
of the controller servlet, with the JSP pages responsible only for the view or presentation.
Esta recomendación cuajó bastante entre los desarrolladores, quedando así para
siempre confundido el concepto y el propósito de controlador MVC.
¿QUÉ ASPECTO TIENE UN CONTROLADOR
A DÍA DE HOY?
¿QUÉ ASPECTO TIENE UN CONTROLADOR
A DÍA DE HOY?
Ejemplos de la Vida Real™
Control de “Daños”
● 618 líneas de código
● 30 imports
● 16 métodos
○ 12 públicos
○ 4 private/protected
● 106 líneas de comentarios
Control de “Daños”
● 618 líneas de código
● 30 imports
● 16 métodos
○ 12 públicos
○ 4 private/protected
● 106 líneas de comentarios
Cuando intentas explicar cómo está organizado el proyecto
...cuando acabas de explicarlo...
...cuando el P.O asigna una tarea a alguien nuevo...
...cuando alguien se cansa y abandona el proyecto.
Problemas conocidos
● Contienen lógica de dominio.
Problemas conocidos
● Contienen lógica de dominio.
● Difícilmente testeables, y si contienen lógica de dominio, la situación se
agrava (alta probabilidad de código duplicado).
Problemas conocidos
● Contienen lógica de dominio.
● Difícilmente testeables, y si contienen lógica de dominio, la situación se
agrava (alta probabilidad de código duplicado).
● Archivos enormes
Problemas conocidos
● Contienen lógica de dominio.
● Difícilmente testeables, y si contienen lógica de dominio, la situación se
agrava (alta probabilidad de código duplicado).
● Archivos enormes
● Configuraciones incrustadas (anotaciones)
Problemas conocidos
● Contienen lógica de dominio.
● Difícilmente testeables, y si contienen lógica de dominio, la situación se
agrava (alta probabilidad de código duplicado).
● Archivos enormes
● Configuraciones incrustadas (anotaciones)
● Difícil mantenimiento y peor crecimiento del proyecto
Problemas conocidos
● Contienen lógica de dominio.
● Difícilmente testeables, y si contienen lógica de dominio, la situación se
agrava (alta probabilidad de código duplicado).
● Archivos enormes
● Configuraciones incrustadas (anotaciones)
● Difícil mantenimiento y peor crecimiento del proyecto
● Curva de aprendizaje para nuevas incorporaciones
Problemas conocidos
● Contienen lógica de dominio.
● Difícilmente testeables, y si contienen lógica de dominio, la situación se
agrava (alta probabilidad de código duplicado).
● Archivos enormes
● Configuraciones incrustadas (anotaciones)
● Difícil mantenimiento y peor crecimiento del proyecto
● Curva de aprendizaje para nuevas incorporaciones
● No es SOLID
ACTION-DOMAIN-RESPONDER
ACTION-DOMAIN-RESPONDER
La alternativa
Breve Introducción
Propuesto por Paul M. Jones, ADR nace como una alternativa server-side “real” a
MVC, siendo un patrón pensado para aplicaciones de red en un entorno
Request/Response.
Esto es una ventaja considerable, teniendo en cuenta que la mayoría de
frameworks web actuales implementan este flujo Request/Response
Breve Introducción
No es complejo pasar de comprender MVC o MODEL 2 a comprender ADR, las
bases son las misma, pero con pequeñas adaptaciones que hacen que sea más
cómodo de mantener y de modelar nuestro sistema.
Veamos una comparación de los distintos componentes a continuación.
Model VS Domain
Model VS Domain
● Poca diferencia respecto al Modelo original
Model VS Domain
● Poca diferencia respecto al Modelo original
● Responder y Domain no interactúan nunca, a pesar de ello, el Responder
puede usar elementos de dominio como entidades o colecciones con fines de
presentación.
Model VS Domain
● Poca diferencia respecto al Modelo original
● Responder y Domain no interactúan nunca, a pesar de ello, el Responder
puede usar elementos de dominio como entidades o colecciones con fines de
presentación.
● El Domain no está concebido como una única clase que gestione la lógica.
Model VS Domain
● Poca diferencia respecto al Modelo original
● Responder y Domain no interactúan nunca, a pesar de ello, el Responder
puede usar elementos de dominio como entidades o colecciones con fines de
presentación.
● El Domain no está concebido como una única clase que gestione la lógica.
● La elección de nombre no es casual. Se pretende “forzar” al programador a
pensar en patrones propios de DDD como Application Service o Use Case
para modelar el dominio de la aplicación.
Model VS Domain
● Poca diferencia respecto al Modelo original
● Responder y Domain no interactúan nunca, a pesar de ello, el Responder
puede usar elementos de dominio como entidades o colecciones con fines de
presentación.
● El Domain no está concebido como una única clase que gestione la lógica.
● La elección de nombre no es casual. Se pretende “forzar” al programador a
pensar en patrones propios de DDD como Application Service o Use Case
para modelar el dominio de la aplicación.
● Cualquier acción que el sistema pueda ejecutar, pertenece a la capa de
dominio
View VS Responder
View VS Responder
● En MVC clásico, el controlador es el encargado de generar el cuerpo de la
respuesta (bien serializando el contenido o renderizando una plantilla) y de
inyectarlo en la respuesta, manejando status code, cabeceras, cookies… etc.
View VS Responder
● En MVC clásico, el controlador es el encargado de generar el cuerpo de la
respuesta (bien serializando el contenido o renderizando una plantilla) y de
inyectarlo en la respuesta, manejando status code, cabeceras, cookies… etc.
● Para separar por completo lógica de presentación, ADR introduce el
Responder, el componente encargado de gestionar toda la creación de la
respuesta, quitándole dicha responsabilidad al controlador.
View VS Responder
● En MVC clásico, el controlador es el encargado de generar el cuerpo de la
respuesta (bien serializando el contenido o renderizando una plantilla) y de
inyectarlo en la respuesta, manejando status code, cabeceras, cookies… etc.
● Para separar por completo lógica de presentación, ADR introduce el
Responder, el componente encargado de gestionar toda la creación de la
respuesta, quitándole dicha responsabilidad al controlador.
● Un mismo responder debe de poder ser utilizado por más de un Action, no
consiste necesariamente en que haya una Responder por cada Action, sino en
que sea el Responder quien manipule la respuesta.
Controller VS Action
Controller VS Action
● Los controladores “MODEL 2/MVC” suelen tener varios métodos públicos que
corresponden a varias rutas/acciones.
Controller VS Action
● Los controladores “MODEL 2/MVC” suelen tener varios métodos públicos que
corresponden a varias rutas/acciones.
● Esto hace que la clase tenga dependencias muy variadas, que el constructor
reciba demasiadas dependencias o que el controlador requiera tener
directamente tener el container de dependencias.
Controller VS Action
● Los controladores “MODEL 2/MVC” suelen tener varios métodos públicos que
corresponden a varias rutas/acciones.
● Esto hace que la clase tenga dependencias muy variadas, que el constructor
reciba demasiadas dependencias o que el controlador requiera tener
directamente tener el container de dependencias.
● En ocasiones un mismo controlador hay acciones que devuelven contenido
en HTML y otras en XML/JSON o cualquier otro tipo de serializado.
Provocando que el controlador tenga aún más dependencias.
Controller VS Action
● Los actions de ADR en cambio, corresponden cada uno a una única acción.
Controller VS Action
● Los actions de ADR en cambio, corresponden cada uno a una única acción.
● Esto ya sucede en microframeworks como Slim, Silex, Hanami, Flask… donde
cada ruta se corresponde directamente con una closure o una clase
individual.
Controller VS Action
● Los actions de ADR en cambio, corresponden cada uno a una única acción.
● Esto ya sucede en microframeworks como Slim, Silex, Hanami, Flask… donde
cada ruta se corresponde directamente con una closure o una clase
individual.
● Un action interactúa con el dominio de la misma forma que un controlador
interactúa con el modelo, pero no interactúa con la vista: envía la información
al responder para que este sea el que haga su trabajo
Controller VS Action
● Los actions de ADR en cambio, corresponden cada uno a una única acción.
● Esto ya sucede en microframeworks como Slim, Silex, Hanami, Flask… donde
cada ruta se corresponde directamente con una closure o una clase
individual.
● Un action interactúa con el dominio de la misma forma que un controlador
interactúa con el modelo, pero no interactúa con la vista: envía la información
al responder para que este sea el que haga su trabajo
● Más allá de validar la request (método, cabeceras, parámetros, cookies o
autenticación), el resto queda delegado a domain y responder.
Ventajas de su uso
Ventajas de ADR frente a MVC
● Fuerte separación de responsabilidades
Ventajas de ADR frente a MVC
● Fuerte separación de responsabilidades
● Clases muy pequeñas
Ventajas de ADR frente a MVC
● Fuerte separación de responsabilidades
● Clases muy pequeñas
● Fácilmente testeable
Ventajas de ADR frente a MVC
● Fuerte separación de responsabilidades
● Clases muy pequeñas
● Fácilmente testeable
● Favorece al uso de patrones de comportamiento para modelar el dominio
Ventajas de ADR frente a MVC
● Fuerte separación de responsabilidades
● Clases muy pequeñas
● Fácilmente testeable
● Favorece al uso de patrones de comportamiento para modelar el dominio
● Contribuye al naming de clases, simplificando la comprensión del proyecto
Ventajas de ADR frente a MVC
● Fuerte separación de responsabilidades
● Clases muy pequeñas
● Fácilmente testeable
● Favorece al uso de patrones de comportamiento para modelar el dominio
● Contribuye al naming de clases, simplificando la comprensión del proyecto
Ventajas de ADR frente a MVC
● Fuerte separación de responsabilidades
● Clases muy pequeñas
● Fácilmente testeable
● Favorece al uso de patrones de comportamiento para modelar el dominio
● Contribuye al naming de clases, simplificando la comprensión del proyecto
● El añadir nuevos casos de uso es casi mecánico
Ventajas de ADR frente a MVC
● Fuerte separación de responsabilidades
● Clases muy pequeñas
● Fácilmente testeable
● Favorece al uso de patrones de comportamiento para modelar el dominio
● Contribuye al naming de clases, simplificando la comprensión del proyecto
● El añadir nuevos casos de uso es casi mecánico
● Anima a seguir principios SOLID y Clean Code
Show me the code!
https://github.com/mangelsnc/adr-blog
Preguntas???
GRACIAS POR VENIR!

Más contenido relacionado

La actualidad más candente

Como ser mas productivo en el desarrollo de aplicaciones
Como ser mas productivo en el desarrollo de aplicacionesComo ser mas productivo en el desarrollo de aplicaciones
Como ser mas productivo en el desarrollo de aplicaciones
Micael Gallego
 
Codemotion 2015 crash y youdebug
Codemotion 2015   crash y youdebugCodemotion 2015   crash y youdebug
Codemotion 2015 crash y youdebug
jmiguel rodriguez
 
Desarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agilesDesarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agiles
Jobsket
 
Lenguaje de-programacion-java script-1
Lenguaje de-programacion-java script-1Lenguaje de-programacion-java script-1
Lenguaje de-programacion-java script-1
Oscar Correa
 
JAVA3.0
JAVA3.0JAVA3.0
JAVA3.0
josemanuel2
 
JavaScript para Javeros. ¿Cómo ser moderno y no morir en el intento?
JavaScript para Javeros. ¿Cómo ser moderno y no morir en el intento?JavaScript para Javeros. ¿Cómo ser moderno y no morir en el intento?
JavaScript para Javeros. ¿Cómo ser moderno y no morir en el intento?
Micael Gallego
 
Javascript: Particularidades del Lenguaje, DOM, Eventos y AJAX
Javascript: Particularidades del Lenguaje, DOM, Eventos y AJAXJavascript: Particularidades del Lenguaje, DOM, Eventos y AJAX
Javascript: Particularidades del Lenguaje, DOM, Eventos y AJAX
Irontec
 
Jobsket Spring 2GX Madrid
Jobsket Spring 2GX MadridJobsket Spring 2GX Madrid
Jobsket Spring 2GX Madrid
Jobsket
 
T3chFest 2016 - De Java a Groovy: ¡Hora de Aventuras!
T3chFest 2016 - De Java a Groovy: ¡Hora de Aventuras!T3chFest 2016 - De Java a Groovy: ¡Hora de Aventuras!
T3chFest 2016 - De Java a Groovy: ¡Hora de Aventuras!
Iván López Martín
 
Javascript en proyectos reales: jQuery
Javascript en proyectos reales: jQueryJavascript en proyectos reales: jQuery
Javascript en proyectos reales: jQuery
David Arango
 
El proceso de desarrollo con herramientas Open Source
El proceso de desarrollo con herramientas Open SourceEl proceso de desarrollo con herramientas Open Source
El proceso de desarrollo con herramientas Open Source
Jose Juan R. Zuñiga
 
Creación de Plataformas
Creación de PlataformasCreación de Plataformas
Creación de Plataformas
Jose Juan R. Zuñiga
 
Dev Tools para Kubernetes - Codemotion 2019
Dev Tools para Kubernetes - Codemotion 2019Dev Tools para Kubernetes - Codemotion 2019
Dev Tools para Kubernetes - Codemotion 2019
Micael Gallego
 
Swift migration. the true history
Swift migration. the true historySwift migration. the true history
Swift migration. the true history
idealistacreamcode
 
jQuery - 01 Conceptos básicos de java script
jQuery - 01 Conceptos básicos de java scriptjQuery - 01 Conceptos básicos de java script
jQuery - 01 Conceptos básicos de java scriptJacob Flores
 
Best Practices
Best PracticesBest Practices
Best Practices
Luis Miguel De Bello
 
TypeScript - Angular 2 - ionic 2
TypeScript - Angular 2 - ionic 2TypeScript - Angular 2 - ionic 2
TypeScript - Angular 2 - ionic 2
Micael Gallego
 

La actualidad más candente (20)

Javascript
JavascriptJavascript
Javascript
 
Manual de Java
Manual de JavaManual de Java
Manual de Java
 
Como ser mas productivo en el desarrollo de aplicaciones
Como ser mas productivo en el desarrollo de aplicacionesComo ser mas productivo en el desarrollo de aplicaciones
Como ser mas productivo en el desarrollo de aplicaciones
 
Codemotion 2015 crash y youdebug
Codemotion 2015   crash y youdebugCodemotion 2015   crash y youdebug
Codemotion 2015 crash y youdebug
 
Desarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agilesDesarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agiles
 
Lenguaje de-programacion-java script-1
Lenguaje de-programacion-java script-1Lenguaje de-programacion-java script-1
Lenguaje de-programacion-java script-1
 
Turbogears
TurbogearsTurbogears
Turbogears
 
JAVA3.0
JAVA3.0JAVA3.0
JAVA3.0
 
JavaScript para Javeros. ¿Cómo ser moderno y no morir en el intento?
JavaScript para Javeros. ¿Cómo ser moderno y no morir en el intento?JavaScript para Javeros. ¿Cómo ser moderno y no morir en el intento?
JavaScript para Javeros. ¿Cómo ser moderno y no morir en el intento?
 
Javascript: Particularidades del Lenguaje, DOM, Eventos y AJAX
Javascript: Particularidades del Lenguaje, DOM, Eventos y AJAXJavascript: Particularidades del Lenguaje, DOM, Eventos y AJAX
Javascript: Particularidades del Lenguaje, DOM, Eventos y AJAX
 
Jobsket Spring 2GX Madrid
Jobsket Spring 2GX MadridJobsket Spring 2GX Madrid
Jobsket Spring 2GX Madrid
 
T3chFest 2016 - De Java a Groovy: ¡Hora de Aventuras!
T3chFest 2016 - De Java a Groovy: ¡Hora de Aventuras!T3chFest 2016 - De Java a Groovy: ¡Hora de Aventuras!
T3chFest 2016 - De Java a Groovy: ¡Hora de Aventuras!
 
Javascript en proyectos reales: jQuery
Javascript en proyectos reales: jQueryJavascript en proyectos reales: jQuery
Javascript en proyectos reales: jQuery
 
El proceso de desarrollo con herramientas Open Source
El proceso de desarrollo con herramientas Open SourceEl proceso de desarrollo con herramientas Open Source
El proceso de desarrollo con herramientas Open Source
 
Creación de Plataformas
Creación de PlataformasCreación de Plataformas
Creación de Plataformas
 
Dev Tools para Kubernetes - Codemotion 2019
Dev Tools para Kubernetes - Codemotion 2019Dev Tools para Kubernetes - Codemotion 2019
Dev Tools para Kubernetes - Codemotion 2019
 
Swift migration. the true history
Swift migration. the true historySwift migration. the true history
Swift migration. the true history
 
jQuery - 01 Conceptos básicos de java script
jQuery - 01 Conceptos básicos de java scriptjQuery - 01 Conceptos básicos de java script
jQuery - 01 Conceptos básicos de java script
 
Best Practices
Best PracticesBest Practices
Best Practices
 
TypeScript - Angular 2 - ionic 2
TypeScript - Angular 2 - ionic 2TypeScript - Angular 2 - ionic 2
TypeScript - Angular 2 - ionic 2
 

Similar a VLCTechFest - Simplificando Controladores: Una introducción a Action-Domain Responder

Patrones de diseño I
Patrones de diseño IPatrones de diseño I
Patrones de diseño I
jjegonzalezf
 
Grails barcamp 2013
Grails barcamp 2013Grails barcamp 2013
Grails barcamp 2013
Carlos Camacho
 
Grails 2013 - PUCMM - Santiago - Sistemas
Grails 2013 - PUCMM - Santiago - SistemasGrails 2013 - PUCMM - Santiago - Sistemas
Grails 2013 - PUCMM - Santiago - Sistemas
Carlos Camacho
 
Web framework ligeros y micros en java barcamp 2014
Web framework ligeros y micros en java   barcamp 2014Web framework ligeros y micros en java   barcamp 2014
Web framework ligeros y micros en java barcamp 2014
Carlos Camacho
 
CrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NETCrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NET
Alberto Diaz Martin
 
Cross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netCross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.net
Alberto Diaz Martin
 
Gwt IV -mvp
Gwt IV -mvpGwt IV -mvp
Django - Curso Básico - Principales Conceptos
Django - Curso Básico - Principales ConceptosDjango - Curso Básico - Principales Conceptos
Django - Curso Básico - Principales Conceptos
George Navarro Gomez
 
Django - Curso Básico - Principales Conceptos
Django - Curso Básico - Principales ConceptosDjango - Curso Básico - Principales Conceptos
Django - Curso Básico - Principales Conceptos
George Navarro Gomez
 
Introducción a la Nube Nativa - v1.0es (2021/03)
Introducción a la Nube Nativa - v1.0es (2021/03)Introducción a la Nube Nativa - v1.0es (2021/03)
Introducción a la Nube Nativa - v1.0es (2021/03)
Young Suk Ahn Park
 
Introducción a ASP.NET MVC
Introducción a ASP.NET MVCIntroducción a ASP.NET MVC
Introducción a ASP.NET MVC
Sebastián Rocco
 
Desarrollo rápido de apps web con laravel - DevAcademy
Desarrollo rápido de apps web con laravel - DevAcademyDesarrollo rápido de apps web con laravel - DevAcademy
Desarrollo rápido de apps web con laravel - DevAcademy
Jorge Antonio Linares Vera
 
Aspect Oriented Programming introduction
Aspect Oriented Programming introductionAspect Oriented Programming introduction
Aspect Oriented Programming introduction
Miguel Pastor
 
Seminario Spring Roo. Monitorización con Spring Insight
Seminario Spring Roo. Monitorización con Spring InsightSeminario Spring Roo. Monitorización con Spring Insight
Seminario Spring Roo. Monitorización con Spring Insight
Paradigma Digital
 
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez.NET UY Meetup
 
Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephpbetabeers
 
Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephp
Andy Dawson
 
DevOps+[Chef/Docker]
 DevOps+[Chef/Docker] DevOps+[Chef/Docker]
DevOps+[Chef/Docker]
Christian Rodriguez
 
Modelos del ciclo de vida del software
Modelos del ciclo de vida del softwareModelos del ciclo de vida del software
Modelos del ciclo de vida del softwareAbner Torres
 

Similar a VLCTechFest - Simplificando Controladores: Una introducción a Action-Domain Responder (20)

Patrones de diseño I
Patrones de diseño IPatrones de diseño I
Patrones de diseño I
 
Grails barcamp 2013
Grails barcamp 2013Grails barcamp 2013
Grails barcamp 2013
 
Grails 2013 - PUCMM - Santiago - Sistemas
Grails 2013 - PUCMM - Santiago - SistemasGrails 2013 - PUCMM - Santiago - Sistemas
Grails 2013 - PUCMM - Santiago - Sistemas
 
Web framework ligeros y micros en java barcamp 2014
Web framework ligeros y micros en java   barcamp 2014Web framework ligeros y micros en java   barcamp 2014
Web framework ligeros y micros en java barcamp 2014
 
CrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NETCrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NET
 
Cross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netCross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.net
 
Gwt IV -mvp
Gwt IV -mvpGwt IV -mvp
Gwt IV -mvp
 
Django - Curso Básico - Principales Conceptos
Django - Curso Básico - Principales ConceptosDjango - Curso Básico - Principales Conceptos
Django - Curso Básico - Principales Conceptos
 
Django - Curso Básico - Principales Conceptos
Django - Curso Básico - Principales ConceptosDjango - Curso Básico - Principales Conceptos
Django - Curso Básico - Principales Conceptos
 
Introducción a la Nube Nativa - v1.0es (2021/03)
Introducción a la Nube Nativa - v1.0es (2021/03)Introducción a la Nube Nativa - v1.0es (2021/03)
Introducción a la Nube Nativa - v1.0es (2021/03)
 
Introducción a ASP.NET MVC
Introducción a ASP.NET MVCIntroducción a ASP.NET MVC
Introducción a ASP.NET MVC
 
Desarrollo rápido de apps web con laravel - DevAcademy
Desarrollo rápido de apps web con laravel - DevAcademyDesarrollo rápido de apps web con laravel - DevAcademy
Desarrollo rápido de apps web con laravel - DevAcademy
 
Aspect Oriented Programming introduction
Aspect Oriented Programming introductionAspect Oriented Programming introduction
Aspect Oriented Programming introduction
 
Seminario Spring Roo. Monitorización con Spring Insight
Seminario Spring Roo. Monitorización con Spring InsightSeminario Spring Roo. Monitorización con Spring Insight
Seminario Spring Roo. Monitorización con Spring Insight
 
Mvc
MvcMvc
Mvc
 
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
 
Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephp
 
Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephp
 
DevOps+[Chef/Docker]
 DevOps+[Chef/Docker] DevOps+[Chef/Docker]
DevOps+[Chef/Docker]
 
Modelos del ciclo de vida del software
Modelos del ciclo de vida del softwareModelos del ciclo de vida del software
Modelos del ciclo de vida del software
 

Último

Caso de exito Cirrus - Hospital La Salle
Caso de exito Cirrus - Hospital La SalleCaso de exito Cirrus - Hospital La Salle
Caso de exito Cirrus - Hospital La Salle
Ecaresoft Inc.
 
Escaneo y eliminación de malware en el equipo
Escaneo y eliminación de malware en el equipoEscaneo y eliminación de malware en el equipo
Escaneo y eliminación de malware en el equipo
nicromante2000
 
CONCEPTOS DE PROGRAMACION CUALQUIER LENGUAJE
CONCEPTOS DE PROGRAMACION CUALQUIER LENGUAJECONCEPTOS DE PROGRAMACION CUALQUIER LENGUAJE
CONCEPTOS DE PROGRAMACION CUALQUIER LENGUAJE
SamuelGampley
 
Maquina de Dibujo y Escritura Automática.pdf
Maquina de Dibujo y Escritura Automática.pdfMaquina de Dibujo y Escritura Automática.pdf
Maquina de Dibujo y Escritura Automática.pdf
juanjosebarreiro704
 
PitchCollabART uniendo talentos, creando maravillas digitales
PitchCollabART uniendo talentos, creando maravillas digitalesPitchCollabART uniendo talentos, creando maravillas digitales
PitchCollabART uniendo talentos, creando maravillas digitales
juanorejuela499
 
Introducción_a_las_APIs_y_Desarrollo_Back-end-Abbie Dominguez Girondo.pdf
Introducción_a_las_APIs_y_Desarrollo_Back-end-Abbie Dominguez Girondo.pdfIntroducción_a_las_APIs_y_Desarrollo_Back-end-Abbie Dominguez Girondo.pdf
Introducción_a_las_APIs_y_Desarrollo_Back-end-Abbie Dominguez Girondo.pdf
AbbieDominguezGirond
 

Último (6)

Caso de exito Cirrus - Hospital La Salle
Caso de exito Cirrus - Hospital La SalleCaso de exito Cirrus - Hospital La Salle
Caso de exito Cirrus - Hospital La Salle
 
Escaneo y eliminación de malware en el equipo
Escaneo y eliminación de malware en el equipoEscaneo y eliminación de malware en el equipo
Escaneo y eliminación de malware en el equipo
 
CONCEPTOS DE PROGRAMACION CUALQUIER LENGUAJE
CONCEPTOS DE PROGRAMACION CUALQUIER LENGUAJECONCEPTOS DE PROGRAMACION CUALQUIER LENGUAJE
CONCEPTOS DE PROGRAMACION CUALQUIER LENGUAJE
 
Maquina de Dibujo y Escritura Automática.pdf
Maquina de Dibujo y Escritura Automática.pdfMaquina de Dibujo y Escritura Automática.pdf
Maquina de Dibujo y Escritura Automática.pdf
 
PitchCollabART uniendo talentos, creando maravillas digitales
PitchCollabART uniendo talentos, creando maravillas digitalesPitchCollabART uniendo talentos, creando maravillas digitales
PitchCollabART uniendo talentos, creando maravillas digitales
 
Introducción_a_las_APIs_y_Desarrollo_Back-end-Abbie Dominguez Girondo.pdf
Introducción_a_las_APIs_y_Desarrollo_Back-end-Abbie Dominguez Girondo.pdfIntroducción_a_las_APIs_y_Desarrollo_Back-end-Abbie Dominguez Girondo.pdf
Introducción_a_las_APIs_y_Desarrollo_Back-end-Abbie Dominguez Girondo.pdf
 

VLCTechFest - Simplificando Controladores: Una introducción a Action-Domain Responder

  • 1. SIMPLIFICANDO CONTROLADORES: Una introducción a Action-Domain- Responder Miguel Ángel Sánchez Chordi @slaimer Valencia, 2 de junio de 2018
  • 2. UN POCO SOBRE MÍ ● PHP Developer desde 2005. ● Miembro de PHP Valencia (anteriormente SymfonyVLC) desde 2013. ● Senior Backend Developer en Wossom. Anteriormente en Beroomers.com y Origo.by ● Tengo un blog sobre Clean Code! ○ https://medium.com/all-you-need-is-clean-code ● Podcaster en “Leyendo Ciencia Ficción”!
  • 3. UN POCO SOBRE MÍ Anteriormente me habrás visto en otras charlas en PHP Valencia como: ● Servicios Web REST (Breve introducción a REST) ○ http://www.slideshare.net/slaimer/introduccin-a-rest-symfonyvlc ○ https://www.youtube.com/watch?v=dWLuTVSMMfs ● ¿Qué es OAuth y cómo se implementa? ○ http://www.slideshare.net/slaimer/qu-es-eso-de-oauth ○ https://www.youtube.com/watch?v=KONIDG1wp4g
  • 5. CONTROLADORES El cajón de sastre de todo proyecto web
  • 6. Patrón MVC - Introducción ● Los controladores son una de las 3 patas del patrón MVC ● MVC fue propuesto en 1979 ● Tuvo un gran auge en los 90 y a principios de 2000 ● Está pensado para su uso en aplicaciones de interfaz gráfica, donde cada componente (botón, input, menú…) tiene asociada su triada MVC.
  • 7. Patrón MVC - Introducción ● Los controladores son una de las 3 patas del patrón MVC ● MVC fue propuesto en 1979 ● Tuvo un gran auge en los 90 y a principios de 2000 ● Está pensado para su uso en aplicaciones de interfaz gráfica, donde cada componente (botón, input, menú…) tiene asociada su triada MVC.
  • 8. Patrón MVC - Componentes ● El Modelo es el actor principal, el que aglutina la lógica y actualiza el estado. ● La Vista es la parte visual de la aplicación, la representación final de los datos y de las acciones del usuario. ● La misión del Controlador es ser un canal de comunicación entre la vista y el modelo.
  • 9. Patrón MVC - Componentes
  • 10. Patrón MVC - Componentes
  • 11. Patrón MVC - Componentes
  • 12. Patrón MVC - Componentes
  • 13. MVC en detalle ● En realidad, no es considerado un patrón arquitectónico, sino un patrón de interfaz de usuario. ● Si revisamos la literatura disponible en el momento de su concepción, siempre se hacen referencias a interacciones de usuario, elementos en pantalla, dispositivos de entrada… ● No se plantea como un patrón global para gobernar toda la aplicación, cada elemento en pantalla tiene su triada MVC ● Mediante un sistema de mensajería event/subscriber todos los elementos se mantienen comunicados.
  • 14. MVC en aplicaciones web server-side ● Una aplicación web server-side (monolítica) no sigue este flujo, ya que se basa en peticiones HTTP. ● A cada petición que se hace se destruye y crea la interfaz gráfica ● No mantienen una interfaz “viva”.
  • 15. SUN Microsystems y MODEL 2 ● La primera referencia a MVC y server-side viene de mano de SUN Microsystems, que se apropió del nombre de sus componentes para su patrón MODEL 2. ● SUN reinterpretó a su manera cada una de las partes de MVC, y gracias a el auge de Apache Struts, en el mundillo del desarrollo backend se asimilaron los componentes MVC tal cual los había planteado MODEL 2
  • 16. SUN Microsystems y Model 2 En 1999 se podía leer en JavaWorld un artículo introductorio de MODEL 2 la siguiente recomendación: Properly applied, the Model 2 architecture should result in the concentration of all of the processing logic in the hands of the controller servlet, with the JSP pages responsible only for the view or presentation. Esta recomendación cuajó bastante entre los desarrolladores, quedando así para siempre confundido el concepto y el propósito de controlador MVC.
  • 17.
  • 18. ¿QUÉ ASPECTO TIENE UN CONTROLADOR A DÍA DE HOY?
  • 19. ¿QUÉ ASPECTO TIENE UN CONTROLADOR A DÍA DE HOY? Ejemplos de la Vida Real™
  • 20.
  • 21. Control de “Daños” ● 618 líneas de código ● 30 imports ● 16 métodos ○ 12 públicos ○ 4 private/protected ● 106 líneas de comentarios
  • 22. Control de “Daños” ● 618 líneas de código ● 30 imports ● 16 métodos ○ 12 públicos ○ 4 private/protected ● 106 líneas de comentarios
  • 23. Cuando intentas explicar cómo está organizado el proyecto
  • 24.
  • 25. ...cuando acabas de explicarlo...
  • 26.
  • 27. ...cuando el P.O asigna una tarea a alguien nuevo...
  • 28.
  • 29. ...cuando alguien se cansa y abandona el proyecto.
  • 30.
  • 31. Problemas conocidos ● Contienen lógica de dominio.
  • 32. Problemas conocidos ● Contienen lógica de dominio. ● Difícilmente testeables, y si contienen lógica de dominio, la situación se agrava (alta probabilidad de código duplicado).
  • 33. Problemas conocidos ● Contienen lógica de dominio. ● Difícilmente testeables, y si contienen lógica de dominio, la situación se agrava (alta probabilidad de código duplicado). ● Archivos enormes
  • 34. Problemas conocidos ● Contienen lógica de dominio. ● Difícilmente testeables, y si contienen lógica de dominio, la situación se agrava (alta probabilidad de código duplicado). ● Archivos enormes ● Configuraciones incrustadas (anotaciones)
  • 35. Problemas conocidos ● Contienen lógica de dominio. ● Difícilmente testeables, y si contienen lógica de dominio, la situación se agrava (alta probabilidad de código duplicado). ● Archivos enormes ● Configuraciones incrustadas (anotaciones) ● Difícil mantenimiento y peor crecimiento del proyecto
  • 36. Problemas conocidos ● Contienen lógica de dominio. ● Difícilmente testeables, y si contienen lógica de dominio, la situación se agrava (alta probabilidad de código duplicado). ● Archivos enormes ● Configuraciones incrustadas (anotaciones) ● Difícil mantenimiento y peor crecimiento del proyecto ● Curva de aprendizaje para nuevas incorporaciones
  • 37. Problemas conocidos ● Contienen lógica de dominio. ● Difícilmente testeables, y si contienen lógica de dominio, la situación se agrava (alta probabilidad de código duplicado). ● Archivos enormes ● Configuraciones incrustadas (anotaciones) ● Difícil mantenimiento y peor crecimiento del proyecto ● Curva de aprendizaje para nuevas incorporaciones ● No es SOLID
  • 40. Breve Introducción Propuesto por Paul M. Jones, ADR nace como una alternativa server-side “real” a MVC, siendo un patrón pensado para aplicaciones de red en un entorno Request/Response. Esto es una ventaja considerable, teniendo en cuenta que la mayoría de frameworks web actuales implementan este flujo Request/Response
  • 41. Breve Introducción No es complejo pasar de comprender MVC o MODEL 2 a comprender ADR, las bases son las misma, pero con pequeñas adaptaciones que hacen que sea más cómodo de mantener y de modelar nuestro sistema. Veamos una comparación de los distintos componentes a continuación.
  • 43. Model VS Domain ● Poca diferencia respecto al Modelo original
  • 44. Model VS Domain ● Poca diferencia respecto al Modelo original ● Responder y Domain no interactúan nunca, a pesar de ello, el Responder puede usar elementos de dominio como entidades o colecciones con fines de presentación.
  • 45. Model VS Domain ● Poca diferencia respecto al Modelo original ● Responder y Domain no interactúan nunca, a pesar de ello, el Responder puede usar elementos de dominio como entidades o colecciones con fines de presentación. ● El Domain no está concebido como una única clase que gestione la lógica.
  • 46. Model VS Domain ● Poca diferencia respecto al Modelo original ● Responder y Domain no interactúan nunca, a pesar de ello, el Responder puede usar elementos de dominio como entidades o colecciones con fines de presentación. ● El Domain no está concebido como una única clase que gestione la lógica. ● La elección de nombre no es casual. Se pretende “forzar” al programador a pensar en patrones propios de DDD como Application Service o Use Case para modelar el dominio de la aplicación.
  • 47. Model VS Domain ● Poca diferencia respecto al Modelo original ● Responder y Domain no interactúan nunca, a pesar de ello, el Responder puede usar elementos de dominio como entidades o colecciones con fines de presentación. ● El Domain no está concebido como una única clase que gestione la lógica. ● La elección de nombre no es casual. Se pretende “forzar” al programador a pensar en patrones propios de DDD como Application Service o Use Case para modelar el dominio de la aplicación. ● Cualquier acción que el sistema pueda ejecutar, pertenece a la capa de dominio
  • 49. View VS Responder ● En MVC clásico, el controlador es el encargado de generar el cuerpo de la respuesta (bien serializando el contenido o renderizando una plantilla) y de inyectarlo en la respuesta, manejando status code, cabeceras, cookies… etc.
  • 50. View VS Responder ● En MVC clásico, el controlador es el encargado de generar el cuerpo de la respuesta (bien serializando el contenido o renderizando una plantilla) y de inyectarlo en la respuesta, manejando status code, cabeceras, cookies… etc. ● Para separar por completo lógica de presentación, ADR introduce el Responder, el componente encargado de gestionar toda la creación de la respuesta, quitándole dicha responsabilidad al controlador.
  • 51. View VS Responder ● En MVC clásico, el controlador es el encargado de generar el cuerpo de la respuesta (bien serializando el contenido o renderizando una plantilla) y de inyectarlo en la respuesta, manejando status code, cabeceras, cookies… etc. ● Para separar por completo lógica de presentación, ADR introduce el Responder, el componente encargado de gestionar toda la creación de la respuesta, quitándole dicha responsabilidad al controlador. ● Un mismo responder debe de poder ser utilizado por más de un Action, no consiste necesariamente en que haya una Responder por cada Action, sino en que sea el Responder quien manipule la respuesta.
  • 53. Controller VS Action ● Los controladores “MODEL 2/MVC” suelen tener varios métodos públicos que corresponden a varias rutas/acciones.
  • 54. Controller VS Action ● Los controladores “MODEL 2/MVC” suelen tener varios métodos públicos que corresponden a varias rutas/acciones. ● Esto hace que la clase tenga dependencias muy variadas, que el constructor reciba demasiadas dependencias o que el controlador requiera tener directamente tener el container de dependencias.
  • 55. Controller VS Action ● Los controladores “MODEL 2/MVC” suelen tener varios métodos públicos que corresponden a varias rutas/acciones. ● Esto hace que la clase tenga dependencias muy variadas, que el constructor reciba demasiadas dependencias o que el controlador requiera tener directamente tener el container de dependencias. ● En ocasiones un mismo controlador hay acciones que devuelven contenido en HTML y otras en XML/JSON o cualquier otro tipo de serializado. Provocando que el controlador tenga aún más dependencias.
  • 56. Controller VS Action ● Los actions de ADR en cambio, corresponden cada uno a una única acción.
  • 57. Controller VS Action ● Los actions de ADR en cambio, corresponden cada uno a una única acción. ● Esto ya sucede en microframeworks como Slim, Silex, Hanami, Flask… donde cada ruta se corresponde directamente con una closure o una clase individual.
  • 58. Controller VS Action ● Los actions de ADR en cambio, corresponden cada uno a una única acción. ● Esto ya sucede en microframeworks como Slim, Silex, Hanami, Flask… donde cada ruta se corresponde directamente con una closure o una clase individual. ● Un action interactúa con el dominio de la misma forma que un controlador interactúa con el modelo, pero no interactúa con la vista: envía la información al responder para que este sea el que haga su trabajo
  • 59. Controller VS Action ● Los actions de ADR en cambio, corresponden cada uno a una única acción. ● Esto ya sucede en microframeworks como Slim, Silex, Hanami, Flask… donde cada ruta se corresponde directamente con una closure o una clase individual. ● Un action interactúa con el dominio de la misma forma que un controlador interactúa con el modelo, pero no interactúa con la vista: envía la información al responder para que este sea el que haga su trabajo ● Más allá de validar la request (método, cabeceras, parámetros, cookies o autenticación), el resto queda delegado a domain y responder.
  • 61. Ventajas de ADR frente a MVC ● Fuerte separación de responsabilidades
  • 62. Ventajas de ADR frente a MVC ● Fuerte separación de responsabilidades ● Clases muy pequeñas
  • 63. Ventajas de ADR frente a MVC ● Fuerte separación de responsabilidades ● Clases muy pequeñas ● Fácilmente testeable
  • 64. Ventajas de ADR frente a MVC ● Fuerte separación de responsabilidades ● Clases muy pequeñas ● Fácilmente testeable ● Favorece al uso de patrones de comportamiento para modelar el dominio
  • 65. Ventajas de ADR frente a MVC ● Fuerte separación de responsabilidades ● Clases muy pequeñas ● Fácilmente testeable ● Favorece al uso de patrones de comportamiento para modelar el dominio ● Contribuye al naming de clases, simplificando la comprensión del proyecto
  • 66. Ventajas de ADR frente a MVC ● Fuerte separación de responsabilidades ● Clases muy pequeñas ● Fácilmente testeable ● Favorece al uso de patrones de comportamiento para modelar el dominio ● Contribuye al naming de clases, simplificando la comprensión del proyecto
  • 67. Ventajas de ADR frente a MVC ● Fuerte separación de responsabilidades ● Clases muy pequeñas ● Fácilmente testeable ● Favorece al uso de patrones de comportamiento para modelar el dominio ● Contribuye al naming de clases, simplificando la comprensión del proyecto ● El añadir nuevos casos de uso es casi mecánico
  • 68. Ventajas de ADR frente a MVC ● Fuerte separación de responsabilidades ● Clases muy pequeñas ● Fácilmente testeable ● Favorece al uso de patrones de comportamiento para modelar el dominio ● Contribuye al naming de clases, simplificando la comprensión del proyecto ● El añadir nuevos casos de uso es casi mecánico ● Anima a seguir principios SOLID y Clean Code
  • 69. Show me the code! https://github.com/mangelsnc/adr-blog

Notas del editor

  1. Hola, bienvenidos a la charla “Simplificando Controladores: Una introducción a Actión-Domain-Responder”
  2. Mi nombre es Miguel Ángel Sánchez (@slaimer en Twitter). Para los que no me conozcáis, soy programador PHP desde 2005, y soy miembro de PHPValencia desde 2013, bueno, en realidad empecé siendo miembro de SymfonyVLC, antes de juntarnos todos los de Drupal y Symfony en PHPValencia. Me gusta considerarme programador backend, el front no me va mucho, prefiero la parte back, y a ello me dedico actualmente en Wossom. Wossom es una aventura que hemos comenzado unos compañeros y yo, somos una pequeña empresa de desarrollo a medida, trabajamos principalmente para startups, ayudándoles en el proceso de definición de producto e implementación del MVP. Ayudamos también en la contratación de personal, formación y organización del equipo en las primeras fases. ...y hablando de contratación… estamos buscando gente, así que si estáis interesados en uniros a nosotros, podéis buscarme luego o enviar un email a mangel@wossom.com Anteriormente he estado en otras startups, como Beroomers u Origo, y anteriormente he trabajado para empresas de proyectos. Si algún día os aburrís, podéis echar un ojo a mi blog, donde hablo sobre buenas prácticas. Ah! también participo en un podcast sobre literatura de ciencia ficción con unos colegas, aunque en realidad es una excusa para tomarnos unas cervezas ;) Si os apetece podéis oirnos despotricar en iTunes y en Ivoox.
  3. Si te suena mi cara quizá me hayas visto antes en otras charlas, como Servicios web rest o Qué es OAuth y cómo se implementa
  4. Controladores
  5. Me imagino que si estás en esta charla es porque has trabajado alguna vez con controladores, o con cualquier framework que simule una arquitectura MVC. También puedo suponer que sabéis perfectamente qué es y cómo funciona el patrón MVC. Y también puedo suponer, que como yo, y todo el mundo, has hecho controladores que preferirias que el mundo no viera. Si os parece, vamos a entrar en materia dando un pequeño repaso al patrón MVC y su evolución a lo largo del tiempo.
  6. Quedaos con esta frase, porque volveremos sobre ello
  7. Dicho esto os lanzo una pregunta: El modelo y la vista tienen interacción? Levanten manos los que creen que si Los que no La respuesta es SÍ, el modelo actualiza la vista, pero si buscamos en internet el esquema del patrón...
  8. La realidad es que, como habíamos visto antes, MVC no fue concebido como un patrón arquitectónico que gestione todo el flujo de una aplicación. MVC está concebido como un patrón para gestionar individualmente los componentes de una aplicación: botones, menús… etc. La intención es que cada elemento tuviese su propia la triada MVC, y que estos se comunicasen entre si mediante un sistema de mensajería tipo event-subscriber
  9. ¿Y cómo llegó este patrón entonces a ser el paradigma dominante en casi todas las aplicaciones? ¿Acaso no todos los frameworks que conocemos implementan MVC? Lo cierto es que en una aplicación web, encaja bastante mal, OJO, una aplicación típica: monolítica, con renderizado desde servidor, etc, no una SPA o aplicaciones con base Javascript. El modelo de app web consiste en peticiones que se ejecutan, se responden y mueren, no permanecen cargadas en memoria, simplemente ejecutan la petición y mueren. No mantienen una interfaz viva, como una aplicación de escritorio que hasta que no sales de ella sigue cargada. Una aplicación web, no se comporta así.
  10. Pero entonces llegó SUN Microsystems y diseño su patrón MODEL2 (en sustitución de MODEL1)...
  11. ¿Y qué decía MODEL2 que debían de hacer los controladores? “Debidamente implementada, la arquitectura MODEL 2 resulta en una concentración de la lógica de negocio en el controlador, siendo las páginas JSP responsables solo de la vista.” Por lo cual...
  12. Esto es una generalización, obviamente no todos los proyectos son iguales, ni todos los programadores.
  13. ¿CÓMO SE OS QUEDA EL CUERPO?
  14. Así me quedo yo, pero no es la única reacción que esto genera. Y no solo esto, sino que cuando he trabajado en proyectos en que todos los controladores eran así, me he visto en situaciones como:
  15. ¿POR QUÉ ES ESTO TAN DAÑINO? La presencia de método private o protected a veces indican que ahí probablemente haya lógica de dominio que no debería de estar. Por otra parte, esa lógica corre el riesgo de estar replicada en otras partes, como por ejemplo un controlador del gestor de contenido, un comando de consola, un controlador de API...
  16. Normalmente para testear un controlador tienes que utilizar las propias herramientas de testing de tu framework, suelen ser clases complejas, que heredan de una clase base, que requieren muchos parámetros en el constructor…. Añádele que tienen lógica de dominio y la cosa se complica más
  17. En muchas ocasiones, un mismo método tiene papeletas para estar en más de un controlador. Dónde está el registro del usuario? Controlador de Login? Controlador de usuario? …
  18. Por todo esto, surge una alternativa:
  19. Paul M. Jones es un experto en PHP reconocido internacionalmente. Autor del framework Aura Miembro votante de PHP-FIG Autor principal de la recomendación PSR-4 y director de PSR-1 y PSR-2 Contribuidor fundador de Zend Framework …
  20. En realidad los cambios son más a nivel concepto
  21. Al contrario que en MVC
  22. Aquí cada clase se encarga de su parte, además está muy definida cada responsabilidad
  23. ...y bueno pues esto es ADR, espero que os haya parecido interesante, y que le déis una oportunidad y lo implementeis aunque sea en un pet-project vuestro. GRACIAS