A veces, las funciones de acción en la clase de controlador pueden volverse enormes y desagradables, con muchas líneas de código para controlar simplemente el flujo de datos del Modelo a la Vista. En algún momento, estas enormes funciones pierden por completo los principios básicos del buen código, es decir, solo hacen una cosa, son pequeñas, legibles y manejables, etc.
¿Se consideraría una buena práctica dividir estas enormes funciones de acción en funciones privadas más pequeñas en la clase de controlador o la necesidad de dicha optimización significa que deberíamos agregarlas en el modelo?
Votaría por tener las funciones más pequeñas como privadas en el controlador para que sean relativas a la acción, pero he escuchado argumentos de que el controlador debería ser preferiblemente simple mientras el modelo puede volverse enorme y desgreñado; y me preguntaba cuál sería el método más preferido.
fuente
La mejor respuesta que puedo dar es citar el gran libro de Robert Martin, "Código limpio" que recomiendo encarecidamente a cualquier persona interesada en el tema:
No puedo decirlo mejor. Se aplica otra gran cita del mismo libro:
Al dividir su código en más funciones, se ve obligado a dar a esas funciones nombres significativos que puedan mejorar enormemente la legibilidad de su código. No es necesario decir que todas las funciones que no están destinadas a usarse fuera de la clase, deben ser privadas, para que pueda reutilizar fácilmente su código a través de la herencia.
Si su controlador ahora tiene demasiadas funciones, es una señal de que probablemente hace demasiado. Luego, puede dividirlo en varias partes independientes o tratar de mover algunas funciones a modelos como se menciona en la otra respuesta. Además, si sigue el estilo MVC no clásico, donde se permite que las Vistas tengan algo de lógica, puede poner algunas de sus funciones allí cuando le convenga.
fuente
En MVC trato de asegurarme de que mi controlador sea lo más "delgado" posible y también de que mis modelos sean lo más tontos posible.
Las funciones lógicas y de ayuda que se necesitan se colocan en clases de ayuda independientes. También hace que mis pruebas sean mucho más fáciles (estás probando ... ¿verdad?: D) Probar controladores es notoriamente difícil, cada vez que intentas crear una instancia de un controlador para probar tienes que pensar en el contexto HTTP y la falsificación http this and that, y es un dolor, pero es un dolor a propósito. Necesita todas esas cosas porque un controlador está muy relacionado con HTTP y la web. Es el punto de entrada a su aplicación web.
Las funciones lógicas y de ayuda no tienen nada que ver con la web. Son completamente independientes del medio ambiente (o deberían serlo). Eso solo debería decirte que no pertenecen juntos en el mismo lugar. Además, si vincula toda la lógica de sus aplicaciones a la web o a una implementación web en particular, nunca podrá llevarla consigo.
Desarrollamos nuestro sitio MVC con todas nuestras entidades de bases de datos (no nuestros modelos mvc, nuestras entidades db reales), nuestro almacenamiento, nuestras clases auxiliares y nuestra lógica en dll independientes independientes. Solo hemos tenido un sitio web, pero lo hicimos así de todos modos.
Hace unos meses, se nos pidió que creáramos algunas aplicaciones de escritorio relacionadas con algunos de nuestros sistemas marginales. Esto se hizo fácilmente ya que todo nuestro código probado podría reutilizarse fácilmente. Si hubiéramos introducido nuestro código en nuestro proyecto web, o lo hubiéramos incluido en nuestros controladores, nunca hubiéramos podido hacerlo.
fuente
Además de Dmitri Zaitsev y spaceman, excelentes respuestas, no sé si lo siguiente también es válido para PHP: debe intentar evitar métodos privados debido a la falta de posibilidades de pruebas automatizadas.
Sí, también puede usar metaprogramación o inyección de dependencia para probar métodos privados, pero no debe hacerlo, ya que tiene un gran impacto en la legibilidad de su código.
Recuerda siempre el principio de KISS: Hazlo simple, estúpido.
fuente