¿Cuál es el patrón HMVC?

130

Leyendo la documentación de Kohana, descubrí que la principal diferencia en la versión 3.0 es que sigue el patrón HMVC en lugar de MVC como lo hace la versión 2.x. La página sobre esto en los documentos de Kohana y la de Wikipedia no me dio una idea clara.

Entonces pregunta: ¿cuál es el patrón HMVC y en qué se diferencia de MVC?

Matteo Riva
fuente
30
Una discusión sobre este mismo tema tuvo lugar dentro de los foros de Kohana. Puede resultarle útil: forum.kohanaframework.org/discussion/1681
Sampson

Respuestas:

86

Sam de Freyssinet (uno de los desarrolladores de Kohana) escribió un artículo bastante profundo sobre HMVC , qué es y cómo se puede usar.

Link is dead: New Link - https://web.archive.org/web/20160214073806/http://techportal.inviqa.com/2010/02/22/scaling-web-applications-with-hmvc/

mano sombra
fuente
gracias por un buen enlace, también revise
Owais Qureshi
¡Los enlaces siempre morirán! publicar contenido en lugar de enlace.
Loki
58

Actualmente estoy en el proceso de desarrollar mi propio framework PHP 5.3 HMVC llamado Alloy . Dado que estoy fuertemente invertido y vendido en HMVC, pensé que podría ofrecer un punto de vista diferente, y tal vez una mejor explicación de por qué debería usarse HMVC y los beneficios que trae.

El mayor beneficio práctico de usar una arquitectura HMVC es la "widgetización" de las estructuras de contenido. Un ejemplo podría ser comentarios, calificaciones, pantallas de feed RSS de Twitter o blog, o la visualización del contenido del carrito de compras para un sitio web de comercio electrónico. Es esencialmente un contenido que debe mostrarse en varias páginas, y posiblemente incluso en diferentes lugares, según el contexto de la solicitud HTTP principal.

Los marcos tradicionales de MVC generalmente no proporcionan una respuesta directa para este tipo de estructuras de contenido, por lo que las personas generalmente terminan duplicando y cambiando diseños, utilizando ayudantes personalizados, creando sus propias estructuras de widgets o archivos de biblioteca, o extrayendo datos no relacionados de los principales solicitados Controlador para pasar a la Vista y renderizar de forma parcial. Ninguna de estas opciones es particularmente buena, porque la responsabilidad de presentar un contenido particular o cargar los datos requeridos termina por filtrarse en múltiples áreas y duplicarse en los lugares donde se usa.

La solución obvia es HMVC, o específicamente la capacidad de enviar solicitudes secundarias a un controlador para que se encargue de estas responsabilidades. Si piensa en lo que está haciendo, se ajusta exactamente a la estructura del controlador. Debe cargar algunos datos sobre los comentarios y mostrarlos en formato HTML. Por lo tanto, envía una solicitud al controlador de comentarios con algunos parámetros, interactúa con el modelo, selecciona una vista y la vista muestra el contenido. La única diferencia es que desea que los comentarios se muestren en línea, debajo del artículo del blog que está viendo el usuario en lugar de una página de comentarios completa completamente separada (aunque con un enfoque HMVC, en realidad puede atender tanto las solicitudes internas como las externas con el mismo controlador y "kill" dos pájaros de un tiro ", como dice el refrán). A este respecto, HMVC es realmente un subproducto natural de luchar por una mayor modularidad del código, reutilización y mantener una mejor separación de las preocupaciones. ESTE es el punto de venta de HMVC.

Entonces, si bien es interesante pensar en el artículo TechPortal de Sam de Freyssinet sobre el escalamiento horizontal con HMVC, no es donde más del 90% de las personas que usan marcos HMVC obtendrán beneficios reales, prácticos y cotidianos.

Vance Lucas
fuente
55
Sí, así es como lo imaginé en el uso en el mundo real, pero desde este punto de vista, el nombre no es del todo adecuado ya que la H en HMVC es engañosa (no hay una jerarquía real).
Matteo Riva el
2
Sí, haces un buen punto. De hecho, comparto este punto de vista y le di otro nombre, "MVC anidado", en una presentación que hice sobre Alloy en Confoo 2011. Está en Slideshare, diapositiva # 20: slideshare.net/vlucas/alloy-hmvc-php- framework
Vance Lucas el
¿Cómo manejaría HMVC la necesidad de retornos múltiples del árbol de módulos? Por ejemplo, cotejar contenido de encabezado / cuerpo / pie de página, dependencias JS / Css e interrelaciones entre módulos. ¿Eventos? ¿Manos? ¿Un marco de página singleton? Objetos de retorno estructurados?
scipilot
1
Esta respuesta es una copia de wikipedia: / en.wikipedia.org/wiki/…
EricG
3
@EricG parece que alguien copió la respuesta que di aquí, y luego la agregó a Wikipedia (no fui yo). Consulte la sección "Referencias" en la parte inferior del artículo de Wikipedia: se vincula a este comentario.
Vance Lucas
7

HMVC está estrechamente relacionado con el enfoque "basado en componentes" para el despacho. Básicamente, en lugar de tener un único despachador, que delega en un controlador, cada controlador puede actuar como un despachador. Esto le da una jerarquía de controladores. El diseño es más flexible y provoca una mejor encapsulación del código, pero a un precio de mayor abstracción. Konstrukt está diseñado en torno a este patrón.

Consulte también esta respuesta: /programming/115629/simplest-php-routing-framework/120411#120411

Troelskn
fuente
7

En Kohana, al menos, una solicitud HMVC es una solicitud HTTP que se atiende "internamente": en lugar de emitirse a través de la red, es enrutada, despachada y manejada por el propio marco. La similitud de los nombres "HMVC" y "MVC" es confusa, ya que sugiere una conexión subyacente entre los términos que de hecho no existe: uno no es una variante menor o una modificación del otro, son cosas completamente diferentes. (HMVC también se describe como Ajax sin la solicitud HTTP del lado del cliente). El énfasis de Kohana y el soporte para "HMVC" significa que el marco tiene un fuerte soporte para una arquitectura orientada a servicios basada en HTTP.

La ventaja de este patrón arquitectónico es que, dado que se utiliza la misma "convención de llamada" para solicitudes internas y externas, es trivial convertir las solicitudes de servicio "internas" en solicitudes "externas" o viceversa, según sea necesario.

Si bien este es un patrón arquitectónico sensible, darle su propio nombre parece innecesario (Symfony2 describe el mismo concepto " sub-solicitudes "), y de hecho el nombre parece ser un nombre inapropiado: no hay ningún requisito particular o necesidad de que las solicitudes formen un jerarquía (que no sea el gráfico de llamadas estándar de cada programa imperativo); las solicitudes podrían ser fácilmente recursivas, por ejemplo.

[ Actualización de abril de 2011, marzo de 2012: se amplió la respuesta en respuesta a los comentarios.]

mjs
fuente
2
Al poder convertir las solicitudes de servicio 'internas' en menús de solicitudes 'externas', puede escalar más fácilmente si es necesario, es decir, mover algunos módulos de aplicación a su propio servidor.
Kim Prince
1
sí, intente implementar un servicio web interno con él y sin él, solo para ver si realmente "realmente no importa tanto".
Kemo
@ Kemo Creo que es una buena arquitectura, solo creo que el nombre es confuso, e implica que Kohana está haciendo algo particularmente inusual.
mjs
No estoy seguro de cómo su respuesta es útil. No estás respondiendo la pregunta solo quejándote del nombre y que es innecesario (lo cual está bien).
Dave
4

HMVC es un controlador jerárquico de vista de modelo. En MVC normal, cada objeto GUI tiene su MVC, pero no hay ninguna relación entre el objeto GUI principal y el objeto GUI secundario a diferencia de HMVC. En HMVC, cada objeto GUI tiene acceso a sus objetos secundarios y cada objeto secundario puede acceder a su objeto primario.

Entonces, en cada vista hay una vista primaria, a través de la cual puede acceder a ella. En cada controlador hay un controlador principal a través del cual puede pasar el evento al controlador principal (si el evento no está dentro de su alcance).

Para una descripción detallada, haga clic aquí

Nuevo enlace es esta dirección

Sanjay Jain
fuente
1
la marca de una buena respuesta no es solo un enlace sin otra información o contexto. ¿Puede gastar su respuesta y resumir la parte relevante de la publicación vinculada?
Kev
1
@Sanjay, ¿hay alguna razón por la que haya cambiado el destino del enlace del artículo HMVC a uno sobre el estado de gwt para dispositivos móviles?
Brad Koch
@ Koch ... No he cambiado el enlace ... ni siquiera sé quién lo cambió ... por cierto, lo vinculé al enlace original.
Sanjay Jain