MVC vs HMVC
A mi modo de ver los esquemas organizativos MVC -junto con muchos otros factores- han cambiado a mejor la organización y estructuración del código fuente de un proyecto. Separar en capas las distintas partes de un trabajo (datos, lógica y vista) se antoja un proceso crítico, laborioso pero divertido a la vez.
Por otro lado a veces nos encontramos con situaciones en las que el MVC se convierte en un híbrido entre lo que es y lo que debería haber sido, en este punto hay una clara diferencia entre los desarrolladores que optan por la rama práctica y los que bajo ningún concepto intentan mezclar capas.
¿Qué hace el Modelo?
El modelo es la capa que conecta la aplicación con los datos de la misma. Normalmente los datos suelen estar almacenados en algún sistema gestor de bases de datos, en disco o en cualquier tipo de caché. Lo más común es consultar (agregar, editar, eliminar...) esos datos y devolver la respuesta de esa consulta al controlador para seguir el flujo del programa.
¿Qué hace la Vista?
La vista es la capa encargada de mostrar al usuario un interfaz con el que interactuar con los datos almacenados. Es lo que podemos llamar la parte visible de la aplicación, con la que el usuario ejecuta las acciones disponibles. En muchos casos es sinónimo de "frontend".
¿Qué hace el Controlador?
El controlador es la capa crucial de la aplicación, donde se aplica la lógica de la misma. Desde el controlador nos encargamos de preguntarle al Modelo por los datos que vamos a manufacturar, los recogemos y los preparamos para poder llamar a la vista y que ésta se encargue de representarlos.
¿Qué diferencia hay entre MVC y HMVC?
Según la Wikipedia HMVC significa Hierarchical-Model-View-Controller, es decir, un esquema MVC jerárquico. Tan solo se diferencia con MVC en la forma en que agrupamos el código, creo que se ve mejor con un ejemplo:


¿Cuándo usar uno u otro?
No creo que haya ninguna regla de oro para escoger, dependerá de si el framework (o la herramienta de desarrollo que se vaya a utilizar) soporta este tipo de organización, del tipo de proyecto, de la mentalidad del desarrollador, gustos personales, etc... De todas formas y como norma general podemos decir que un esquema HMVC podría ser más útil en aplicaciones modulares de tamaño mayor mientras que MVC se ajustaría mejor en aplicaciones más pequeñas o no necesariamente modulares (ojo, no tiene que ser así especialmente).
Opinión personal
Desde que he descubierto HMVC (en mi caso con alguna modificación de CodeIgniter) es muy raro que empiece algún proyecto php sin esta característica. Cierto es que para cosas pequeñas puede ser algo más complejo de organizar pero una vez le has cogido el punto es como un vicio que no puedes dejar.
Comentarios
Claro y conciso :)
Y lo mejor, no te metes en las menudencias sobre lo que debe -o no debe- hacer el modelo (que eso es una fuente de discusiones continuas entre desarrolladores).
No obstante, y en mi experiencia, la elección de HMVC ó MVC, va a depender, como bien dices, de gustos.. A nivel de rendimiento, escalabilidad, etc, debería de ser exactamente igual..
Como ya sabes, mi gran "amor", symfony, se basa en módulos, y cada módulo tiene su "controlador" (no es exactamente así, pero bueno, a efectos prácticos podríamos plantearlo así).
Y lo mejor es que ahora con Symfony2, te puedes montar la estructura _que_tu_quieras_ ;)
No obstante, si soy sincero, tengo ganas de hacer algo con Code Ignitier.. Allá por el 2012, creo que podré tener tiempo, jejejeje
(O paso a no dormir...)
Abrazotes :)
Para mi es mucho mas claro el modelo MVT (model-view-template) de django, donde tu tienes un proyecto, ese proyecto se compone de aplicaciones y cada aplicacion tiene un models (donde van los modelos) un views (donde van las vistas) y un directorio templates (donde van las plantillas).
Todo esto, imho siempre, claro ;D
@Wu: Por lo poco que he probado Django, su sistema MVT también es jerárquico porque agrupa los archivos en aplicaciones. Bien es cierto que puedes montar el esquema más o menos como tú quieras pero MVT == HMVC (aunque con distinta nomenclatura).
En Symfony2 el concepto de Bundle dará mucha flexibilidad a la estructura del proyecto.