Eu sempre pensei que a lógica de negócios deve estar no controlador e que o controlador, uma vez que é a parte do "meio", permanece estático e que o modelo / exibição deve ser selado através de interfaces. Dessa forma, você pode alterar a lógica de negócios sem afetar mais nada, programar vários modelos (um para cada banco de dados / tipo de armazenamento) e dezenas de visualizações (para diferentes plataformas, por exemplo).
Agora, li nesta pergunta que você deve sempre colocar a lógica de negócios no modelo e que o controlador está profundamente conectado à visão.
Para mim, isso realmente não faz sentido e implica que cada vez que eu quero ter meios de suportar outro banco de dados / tipo de armazenamento, preciso reescrever todo o meu modelo, incluindo a lógica de negócios.
E se eu quiser outra visão, tenho que reescrever a visão e o controlador.
Alguém pode explicar por que isso é ou se eu errei em algum lugar?
fonte
Você e grandes partes do mundo da programação parecem entender mal quais são os papéis das partes do MVC. Em suma, são eles:
Modelo = lógica do domínio
Ver = lógica de saída
Controlador = lógica de entrada
Isso significa que o modelo é responsável por toda a lógica comercial: tudo relacionado a desenhar widgets em uma tela, dirigir uma impressora, gerar dados como HTML, analisar solicitações HTTP etc. etc. não pertence ao modelo.
No entanto, muitas das modernas estruturas chamadas "MVC" realmente não fazem MVC, ou identificam incorretamente suas partes. Muitas vezes, o que é chamado de "modelo" é a camada de persistência do modelo, enquanto a lógica de negócios fica no que eles chamam de "controlador"; o controlador real geralmente é apenas um ponto de entrada central com uma tabela de roteamento e um pouco de código nos "controladores" individuais para despachar a entrada que eles recebem para os processos de negócios corretos. O que essas estruturas chamam de "visualização" é realmente um pouco de tudo: alguma lógica de apresentação (Visualização), um pouco de manipulação e validação de entradas (Controlador) e algumas outras lógicas de negócios (Modelo). A maior parte da visão atual é geralmente chamada de "modelos".
Você também pode querer ler sobre a arquitetura multicamada; onde o MVC é meio unidirecional (o fluxo é Controller -> Model -> View), a multicamada é uma via bidirecional (Apresentação -> Lógica -> Dados -> Lógica -> Apresentação) e várias estruturas que pretendem fazer MVC realmente executam três camadas, renomeando Presentation to View, Logic to Controller e Data to Model.
fonte
Para realmente isolar a lógica de negócios e separá-la da infraestrutura da camada de apresentação, ela deve ser encapsulada pelos serviços de aplicativo. A arquitetura MVC é uma maneira de implementar a camada de apresentação e deve permanecer nesse escopo, delegando toda a lógica de negócios a esses serviços de aplicativos. Pense nos modelos de visualização como adaptadores entre a visualização e os dados que precisam ser exibidos e / ou lidos. O controlador medeia a interação entre modelos de visualização, visualizações e serviços de aplicativos que hospedam a lógica de negócios.
Os serviços de aplicativo implementam casos de uso de negócios e são dissociados da camada de apresentação, seja MVC ou outra coisa. Por sua vez, os serviços de aplicativos podem hospedar scripts de transação ou um design controlado por domínio .
Para armazenamento, o serviço de aplicativo pode fazer referência a um repositório ou a qualquer abstração de um mecanismo de persistência. Diferentes implementações podem ser suportadas abstraindo o acesso aos dados em uma interface. Normalmente, essas abstrações são vazadas e são apenas parcialmente portáveis nas implementações e geralmente é uma tentativa fútil de atingir a portabilidade total.
ATUALIZAR
Minha sugestão é baseada na arquitetura hexagonal . Em uma arquitetura hexagonal, seu modelo de domínio (lógica de negócios) está no centro. Esse núcleo é encapsulado por serviços de aplicativos que atuam como fachada . Os serviços de aplicativo são classes simples que possuem métodos correspondentes aos casos de uso em seu domínio. Para uma discussão aprofundada sobre serviços de aplicativos, consulte Serviços em Design Orientado a Domínio . O exemplo de código contém um
PurchaseOrderService
serviço de aplicativo para um domínio de compra. (Observe que um serviço de aplicativo não implica o uso de design controlado por domínio.)Em uma arquitetura hexagonal, uma camada de apresentação MVC é um adaptador entre o modelo de domínio (lógica de negócios) e uma GUI. O modelo de domínio não está ciente da camada de apresentação, mas a camada de apresentação está ciente do modelo de domínio.
Essa solução certamente possui partes móveis do que uma solução que coloca a lógica de negócios no controlador e você deve considerar os inconvenientes e os benefícios. A razão pela qual sugiro é porque prefiro manter a lógica de negócios dissociada da camada de apresentação para combater a complexidade. Isso se torna mais importante à medida que o aplicativo cresce.
fonte
Depende do que você entende por lógica de negócios. Qualquer "lógica" que dê significado ao conteúdo do modelo deve estar no modelo. Na questão vinculada, a resposta mais votada parece definir "lógica de negócios" como algo relacionado a dados; isso faz sentido do ponto de vista de que os dados de uma empresa são seus!
Certa vez, vi um exemplo do criador do Rails (eu acho) que estava falando exatamente sobre isso - não colocando "lógica de negócios" no modelo. Seu exemplo foi uma classe de controlador e método para registro e login de aplicativos - uma senha fornecida em texto sem formatação foi criptografada antes de ser inserida ou consultada no modelo (um banco de dados).
Não consigo pensar em um exemplo melhor de algo que não seja da lógica do controlador e que pertença diretamente ao modelo.
O modelo pode ser uma interface para inúmeros repositórios de dados, aliviando as preocupações de portabilidade. É aqui que se pode encontrar confusão sobre se a interface do modelo é realmente o "controlador".
De um modo geral, o controlador vincula o modelo e a visualização (que são as principais características do aplicativo.) No desenvolvimento do Cocoa, pode ser simplista ao ponto em que o controlador é manipulado por meio da GUI do XCode (objetos e ligações do controlador).
A seção "Padrões de Design" do GoF no MVC, citada de maneira vaga:
MVC é tudo sobre UIs. O foco está no modelo e na visualização - definindo e exibindo dados. Observe o "protocolo de inscrição / notificação" - é aqui que o seu controlador entra. Você pode criar todas as visualizações que desejar; desde que sigam o protocolo, você nunca precisará tocar no modelo ou no controlador.
Se você está falando especificamente sobre desenvolvimento web, IMHO muitas estruturas populares da web são rápidas e flexíveis com o termo MVC e suas definições de componentes.
fonte
Por que você não introduz uma camada de serviço?
Então seu controlador ficará mais enxuto e legível, e todas as suas funções serão ações puras.
Você pode decompor a lógica de negócios o quanto for necessário na camada de serviço. A reutilização do código é melhor e não há impacto nos modelos e repositórios.
fonte