Cuando diseñamos una aplicación, se nos crean en la mente un montón de objetos que vemos que deberán ser necesarios: usuarios, facturas, documentos,... por poner algunos típicos. Conforme empezamos a estudiar el dominio de la aplicación completamos más la foto mental, y empezamos a realizar esquemas escritos sobre las relaciones entre ellos, y averigüar además qué comportamiento debe tener cada uno. Esto me refiero a que lo hacemos, auqnue sea mentalmente, mientras hacemos la captura de requisitos. Yo por lo menos, no puedo evitarlo, ni quiero evitarlo.
Posteriormente, hay un momento en que nos decidimos a realizar en esquema entidad-relación, o un diagrama UML de las clases del sistema, o una presentación simple con las figuras que nos aparecen en la aplicación. Y antes o después, según los gustos de cada uno o la metodología utilizada, realizaremos el interfaz de usuario.
Vayamos al típico caso de aplicación compleja, para la web (por lo menos es típico para mi, claro ;) ), y que se desea realizar mediante una estructura de tres niveles. Aquí tienes muchas opciones, pero centrémonos en la capa del modelo. ¿o no hay capa de modelo?
He visto casos donde se define el modelo de base de datos, y se hacen clases que representan prácticamente de manera unívoca las tablas. Otros donde desde la interfaz se generan las acciones que se ejecutan en el controlador y ahí se hace lo que se puede para realizar la acción.
A mí me gusta tener claro primero el modelo abstracto, e implementar este. Luego puedes ir en dos direcciones. Hacia la base de datos y desde la interfaz al API expuesto por el modelo. Pero después está el tema de las sesiones WEB, ¿qué guardas en la sesión? Debes guardar la mínima información para asegurar que en la siguiente acción del usuario vas a tener el modelo exactamente igual a como lo dejó la acción anterior.
Luego "solo" hay que bajar de esta abstracta explicación a picar código...