Às vezes, as funções de ação na classe do controlador podem se tornar enormes e desagradáveis, com muitas linhas de código para simplesmente controlar o fluxo de dados do Model para o View. Em algum momento, essas enormes funções perdem completamente os princípios básicos de um bom código, ou seja, apenas fazem uma coisa, sendo pequenas, legíveis e gerenciáveis etc.
Seria uma boa prática dividir essas enormes funções de ação em funções privadas menores na classe do controlador ou a necessidade dessa otimização significa que devemos adicioná-las ao modelo?
Eu votaria por ter as funções menores como privadas no controlador para que elas sejam relativas à ação, mas ouvi argumentos de que o controlador deve preferencialmente ser simples enquanto o modelo pode ficar enorme e desajeitado; e estava imaginando qual seria o método mais preferido.
fonte
A melhor resposta que posso dar é citar o grande livro de Robert Martin, "Código Limpo", que eu recomendo para qualquer pessoa interessada no assunto:
Não posso dizer melhor. Outra grande citação do mesmo livro se aplica:
Ao dividir seu código em mais funções, você é forçado a atribuir nomes significativos a essas funções que podem melhorar muito a legibilidade do seu código. Desnecessário dizer que todas as funções não destinadas a serem usadas fora da classe devem ser privadas, para que você possa reutilizar facilmente seu código por herança.
Se o seu controlador agora possui muitas funções, é um sinal de que provavelmente faz muito. Em seguida, você pode dividi-lo em várias partes independentes ou tentar mover algumas funções para os modelos, conforme mencionado na outra resposta. Além disso, se você seguir o estilo MVC não clássico, em que o Views tem lógica, você poderá colocar algumas de suas funções sempre que caber.
fonte
No MVC, tento garantir que meu controlador seja o mais "fino" possível e também que meus modelos sejam o mais burros possível.
As funções lógicas e auxiliares necessárias são colocadas em classes auxiliares separadas e independentes. Isso torna meus testes muito mais fáceis também (você está testando ... certo?: D) Testar controladores é notoriamente difícil, sempre que você tenta criar uma instância de um controlador para testar, você precisa pensar no contexto HTTP e na falsificação http isto e aquilo, e é uma dor, mas é uma dor de propósito. Você precisa de tudo isso porque um controlador está intimamente ligado ao HTTP e à Web. É o ponto de entrada para o seu aplicativo da web.
As funções de lógica e auxiliar não têm nada a ver com a web. Eles são totalmente independentes do ambiente (ou deveriam ser). Só isso deve lhe dizer que eles não pertencem um ao outro no mesmo lugar. Além disso, se você vincular todas as lógicas de seus aplicativos tão intimamente à Web ou a uma implementação específica da Web, nunca poderá levá-la consigo.
Desenvolvemos nosso site MVC com todas as nossas entidades de banco de dados (não nossos modelos mvc, nossas entidades db reais), nosso armazenamento, nossas classes auxiliares e nossa lógica em dlls independentes e independentes. Todos nós possuímos apenas um site, mas fizemos assim de qualquer maneira.
Alguns meses atrás, fomos solicitados a criar alguns aplicativos de desktop relacionados a alguns de nossos sistemas adicionais. Isso foi feito facilmente, pois todo o nosso código testado poderia ser facilmente reutilizado. Se tivéssemos introduzido nosso código em nosso projeto da Web ou colocado em nossos controladores, nunca conseguiríamos fazer isso.
fonte
Ao lado de Dmitri Zaitsev e ótimas respostas do astronauta, não sei se o seguinte também é válido para o PHP: Você deve tentar evitar métodos privados devido à falta de possibilidades de teste automatizado.
Sim, você pode usar a metaprogramação ou injeção de dependência para testar métodos privados, mas não deve fazê-lo, pois isso tem um enorme impacto na legibilidade do seu código.
Lembre-se sempre do princípio do KISS: Seja simples, estúpido.
fonte