Pode não ser a melhor ideia olhar para Rails como um grampo do padrão de design MVC. Essa estrutura foi feita com algumas deficiências inerentes (eu meio que elaborei isso em um post diferente ) e a comunidade apenas agora começou a abordar as consequências. Você pode considerar o desenvolvimento do DataMapper2 como a primeira etapa principal.
Alguma teoria
As pessoas que dão esse conselho parecem ser afetadas por um equívoco bastante comum. Então, deixe-me começar esclarecendo isso: Model, no padrão de design MVC moderno, NÃO é uma classe ou objeto. O modelo é uma camada.
A ideia central por trás do padrão MVC é Separation of Concerns e a primeira etapa é a divisão entre a camada de apresentação e as camadas do modelo. Assim como a camada de apresentação se divide em controladores (instâncias, responsáveis por lidar com a entrada do usuário), visualizações (instâncias, responsáveis pela lógica da IU) e modelos / layouts, o mesmo ocorre com a camada de modelo.
As principais partes em que consiste a camada do modelo são:
Objetos de Domínio
Também conhecidos como entidades de domínio, objetos de negócios ou objetos de modelo (não gosto desse último nome porque só aumenta a confusão). Essas estruturas são o que as pessoas costumam chamar erroneamente de "modelos". Eles são responsáveis por conter as regras de negócio (toda a matemática e validação para unidade específica de lógica de domínio).
Abstrações de armazenamento:
Normalmente implementado usando o padrão de mapeador de dados (não confunda com ORMs , que abusaram desse nome). Essas instâncias geralmente têm a tarefa de armazenar e recuperar informações nos objetos do domínio. Cada objeto de domínio pode ter vários mapeadores, assim como existem várias formas de armazenamento (banco de dados, cache, sessão, cookies, / dev / null).
Serviços:
Estruturas responsáveis pela lógica da aplicação (ou seja, interação entre objetos de domínio e interação entre objetos de domínio e abstrações de armazenamento). Eles devem agir como a "interface" por meio da qual a camada de apresentação interage com a camada do modelo. Isso geralmente é o que no código do tipo Rails termina nos controladores.
Existem também várias estruturas que podem estar nos espaços entre esses grupos: DAOs , unidades de trabalho e repositórios .
Ah ... e quando falamos (no contexto da web) de um usuário que interage com a aplicação MVC, não é um ser humano. O "usuário" é, na verdade, seu navegador da web.
E quanto às divindades?
Em vez de ter algum modelo assustador e monolítico para trabalhar, os controladores devem interagir com os serviços. Você passa dados da entrada do usuário para um serviço específico (por exemplo MailService
ou RecognitionService
). Desta forma, o controlador muda o estado da camada do modelo, mas é feito usando uma API clara e sem mexer com as estruturas internas (o que causaria uma abstração com vazamento).
Essas mudanças podem causar alguma reação imediata ou afetar apenas os dados que a instância de visualização solicita da camada de modelo, ou ambos.
Cada serviço pode interagir com qualquer número (embora, geralmente, seja apenas um punhado) de objetos de domínio e abstrações de armazenamento. Por exemplo, o RecogitionService
não poderia se importar menos com abstrações de armazenamento para os artigos.
Notas de encerramento
Dessa forma, você obtém um aplicativo que pode ser testado por unidade em qualquer nível, tem baixo acoplamento (se implementado corretamente) e tem uma arquitetura claramente compreensível.
Porém, tenha em mente: MVC não se destina a aplicativos pequenos. Se você está escrevendo uma página de livro de visitas usando o padrão MVC, está fazendo isso errado. Esse padrão se destina a fazer cumprir a lei e a ordem em aplicações de grande escala.
Para pessoas que estão usando PHP como linguagem primária, esta postagem pode ser relevante. É uma descrição um pouco mais longa da camada do modelo com alguns trechos de código.