Diferencias entre Model View Controller y Action Domain Responder

Action Domain Responder

Se recomienda leer el borrador de MVC a ADR.

 

La Acción (Action) es la lógica que conecta el Dominio y el Respondedor. Utiliza la entrada de solicitud para interactuar con el dominio y pasa el resultado del dominio al respondedor.

El dominio (Domain) es la lógica para manipular el dominio, la sesión, la aplicación y los datos del entorno, modificando el estado y la persistencia según sea necesario.

El respondedor (Responder) es la lógica para construir una respuesta HTTP o una descripción de respuesta. Se trata de contenido corporal, plantillas y vistas, encabezados y cookies, códigos de estado, etc.

Básicamente

El controlador web recibe una solicitud del cliente y la envía a una Acción.

La acción interactúa con el dominio.

La acción alimenta datos al respondedor. (N.b .: Esto puede incluir resultados de la interacción del Dominio, datos de la solicitud del cliente, etc.)

El Respondedor genera una respuesta utilizando los datos que le proporciona la Acción.

El manejador web envía la respuesta de vuelta al cliente.

Veamoslo a mejor detalle

Pero, ¿Cúales son las  diferencias entre MVC y ADR?

Action Domain Responder se ofrece como una alternativa a la apropiación indebida del "Modelo 2" (para interfaces de solicitud / respuesta del lado del servidor) del patrón de interfaz de usuario MVC original (para interfaces de usuario gráficas en memoria del lado del cliente). ADR es un patrón de interfaz de usuario diseñado específicamente para aplicaciones del lado del servidor que operan en un entorno de solicitud / respuesta fuera de la red.

Alinear las expectativas y las preocupaciones de factorización, lejos de las derivaciones modernas del MVC "Modelo 2" hacia el Respondedor de Dominio de Acción no es difícil. Aquí hay una forma de trabajar a través del cambio de enfoque.

Modelo vs Dominio
Aquí hay algunas pocas diferencias significativas, salvo que el Respondedor no interactúa con el Dominio. El Respondedor puede usar objetos de dominio como entidades y colecciones, tal vez envueltos en una Carga útil del Dominio, pero solo con fines de presentación. En sí mismo, no solicita nueva información del dominio ni envía información al dominio.

Por lo tanto, la principal diferencia está en el nombre. El uso de la palabra Dominio en lugar de Modelo pretende hacer que los implementadores piensen en patrones de Lógica de Dominio "POEAA" tales como Capa de Servicio y Guión de Transacción, o patrones de "Diseño Dirigido por Dominio" tales como Servicio de Aplicación o Caso de Uso.

Además, recuerde que en el MVC original, hay muchos modelos presentados continuamente. En MVC "Modelo 2", el Modelo está casi completamente indefinido. En ADR, el dominio se define como un punto de entrada en lo que sea que funcione el dominio (secuencia de comandos de transacción, capa de servicio, servicio de aplicación, etc.).

Vista vs Responder
En un sistema MVC "Modelo 2", un método de Controlador generalmente generará contenido del cuerpo a través de una Vista (por ejemplo, una Vista de Plantilla o una Vista de Dos Pasos). El Controlador luego inyecta el contenido del cuerpo generado en la respuesta. El método de acción del Controlador manipulará la respuesta directamente al código de estado, encabezados, cookies, etc.

Algunos métodos de acción del Controlador pueden presentar tipos de contenido alternativos para los mismos datos de dominio. Debido a que estas alternativas pueden no ser consistentes con todos los diferentes métodos, esto lleva a que la lógica de presentación sea algo diferente en cada método, cada uno con sus propias condiciones previas.

Sin embargo, en una aplicación web del lado del servidor, la presentación que se entrega como salida no es simplemente el cuerpo de la respuesta HTTP. La presentación es la Respuesta HTTP completa, incluido el estado HTTP, los encabezados, las cookies, etc. Como tal, hacer cualquier tipo de trabajo de construcción de Respuesta HTTP en un Controlador indica una mezcla de preocupaciones.

Para separar completamente la lógica de presentación, cada Acción en ADR invoca un Respondedor para construir la Respuesta HTTP. El Respondedor está totalmente a cargo de establecer encabezados, configurar el contenido del cuerpo, elegir tipos de contenido, plantillas de renderizado, etc.

Tenga en cuenta que un Respondedor puede incorporar una Vista de plantilla, Vista de dos pasos, Vista de transformación o cualquier otro tipo de sistema de creación de contenido corporal.

Tenga en cuenta también que un Respondedor particular puede ser utilizado por más de una Acción. El punto aquí es que la Acción deja todo el encabezado y el contenido al Respondedor, no que deba haber un Respondedor diferente para cada Acción diferente.

En casos triviales, puede ser razonable recopilar diferentes lógica de Responder, p. correspondiente a la lógica de presentación para diferentes Acciones, en una sola clase también. Hacerlo puede considerarse una implementación válida, pero degenerada o inferior, del patrón.

Controlador vs Acción
En el uso común, la mayoría de las clases de Controladores MVC "Modelo 2" contienen varios métodos correspondientes a diferentes acciones. Debido a que estos diferentes métodos de acción residen en el mismo Controlador, el Controlador termina necesitando una lógica de envoltura adicional para tratar cada método de acción correctamente, como los ganchos de pre y post acción. Además, los diferentes métodos de acción pueden tener dependencias diferentes, lo que lleva a constructores a largo plazo y / o intentos de "inyección de acción" 



Fuentes:

https://github.com/pmjones/adr

https://blog.ircmaxell.com/2014/11/alternatives-to-mvc.html

https://github.com/pmjones/adr/blob/master/ADR.md

https://github.com/pmjones/adr/blob/master/TRADEOFFS.md

http://auraphp.com/framework/2.x/en/adr/

https://www.slimframework.com/docs/cookbook/action-domain-responder.html

https://en.wikipedia.org/wiki/Action%E2%80%93domain%E2%80%93responder

http://martinbean.co.uk/blog/2016/10/20/implementing-adr-in-laravel/

http://koriym.github.io/blog/2014/06/08/action-domain-responder/

http://www.darrenmothersele.com/blog/2017/03/28/php-middleware/