Model-View-Controller: O usuário interage com a View ou com o Controller? [fechadas]

14

Eu aprendi recentemente sobre o padrão de design do MVC. Estou aprendendo com o livro Head First Design Pattern.

De acordo com este livro (se bem entendi):

O modelo é a maior parte da lógica e dos dados do aplicativo.

A visualização é basicamente a GUI que representa o modelo visualmente para o usuário.

O Controlador é responsável por 'mediar' e agir como um 'intermediário' entre a Visão e o Modelo. A Visualização relata ao Controlador que o usuário fez uma ação e o Controlador o converte em chamadas de método no Modelo.

No entanto, muitos lugares na web contradizem o que eu entendo desse livro. Eles alegam que geralmente o usuário interage com o Controlador, não com a Visualização.

Qual deles é verdadeiro ou mais comum? O usuário interage diretamente com o Controller ou diretamente com o View? Ambas as abordagens são aceitáveis? Qual é o mais comum?

Aviv Cohn
fonte
4
Esta pergunta não tem uma resposta significativa da maneira que você a escreveu. Dê um exemplo de um dos lugares na web que contradiz o livro e tentaremos explicá-lo. Seja específico com o seu exemplo.
Robert Harvey
1
2 respostas, ambas votadas, uma diz "interaja com a visualização" e a outra diz "interaja com o controlador" .... me faz pensar que o MVC não é uma arquitetura tão boa se é confusa em um nível tão fundamental!
Gbjbaanb 29/03
Você clica nos controles do aplicativo ou nas consultas ao banco de dados? A interação é diretamente com a interface do usuário, que é uma visão em si. A exibição geralmente chama solicitações para o servidor (no caso de aplicativos da web) ou chama os ganchos registrados neles (no caso de aplicativos clientes). Além disso, todo o MVC é apenas uma porcaria.
luke1985
@spectre Não é útil descartar o MVC sem fornecer uma explicação e, idealmente, uma alternativa. Caso contrário, essa demissão não contribui em nada e deveria ter sido deixada de fora do seu comentário. Além disso, mesmo com isso, ainda estaria fora de tópico.
Sublinhada_d

Respostas:

18

O usuário interage com a View , mas a View deve comunicar as ações ao Controller . O controlador pode atualizar o modelo , mas não é necessário em todas / quaisquer alterações.

A descrição que estou fornecendo é baseada na minha experiência pessoal com a implementação do MVC em .NET. Sua implementação pode ser diferente.

O Controller é onde as ações são processadas, basicamente uma camada de negócios. Um controlador simples não fará nada além de obter os dados do Modelo para alimentar a Visualização. Um Controlador complicado realizará todo tipo de ações, até gerenciamento de segurança, autenticação, autorização, registro e, possivelmente, muitas outras coisas.

A exibição deve ser responsável apenas por exibir as informações de uma maneira que o usuário possa entender. Pode haver algum problema aqui com o Controller e o Model, pois coisas como SPAs (Aplicativos de Página Única) terão feedback de validação de dados para o usuário. Qualquer outro cruzamento é muito mal visto.

O modelo lida com dados. Isso inclui validação de dados (onde aplicável). O armazenamento e recuperação de dados também são tratados nessa camada.


ATUALIZAR

Parece haver alguma confusão em torno de quem faz o quê e quando. Incluí duas visões gerais diferentes das arquiteturas MVC porque são semelhantes, mas não são as mesmas. Há espaço para qualquer interpretação. Possivelmente, muito mais. As descrições acima são minha interpretação do MVC de várias fontes, incluindo minha própria experiência na criação de aplicativos usando essa metodologia. Felizmente, esta atualização ajudará a esclarecer algumas dessas confusões.

O MVC é uma tentativa de criar um padrão de design de Separação de Preocupações para o desenvolvimento de software. Ele foi implementado principalmente em aplicativos baseados na Web (que eu saiba).

O modo de exibição lida com toda a interação do usuário. Se o usuário clicar em um botão, a Visualização determina se o clique é uma interação da interface do usuário ou algo que está além de sua preocupação (uma interação do Controlador). Se o botão executar algo como copiar valores de um campo para outro, sua implementação determinará se isso é uma preocupação de Visualização ou de Controlador. Provavelmente, você só terá essa confusão de preocupações ao lidar com um SPA (aplicativo de página única).

O Controller é o local onde suas ações são processadas. A Visualização comunicou que o usuário decidiu alterar valores para alguns campos. O Controlador pode executar a validação desses dados ou pode ser tratado pelo Modelo. Novamente, isso depende da implementação. Se o Controlador tiver recursos de segurança, poderá determinar que o usuário não tenha privilégios suficientes para executar a ação. Rejeitaria as alterações e atualizaria a Visualização. O Controlador também determina quais dados recuperar do Modelo, como empacotá-lo e atualiza a Visualização com esses dados.

O modelo determina como e onde armazenar dados. Ele também pode executar a validação desses dados antes de armazená-los (isso deve ser feito porque as pessoas ignoram a Visualização ocasionalmente).


A Wikipedia tem um artigo sobre MVC .

  • Um modelo notifica suas visualizações / visualizações e controladores associados quando houver uma alteração em seu estado. Essa notificação permite que os modos de exibição atualizem sua apresentação e os controladores alterem o conjunto de comandos disponíveis. Em alguns casos, uma implementação MVC pode ser "passiva", de modo que outros componentes devem pesquisar o modelo em busca de atualizações, em vez de serem notificadas.
  • Uma visão é informada pelo controlador de todas as informações necessárias para gerar uma representação de saída para o usuário. Também pode fornecer mecanismos genéricos para informar o controlador da entrada do usuário.
  • Um controlador pode enviar comandos para o modelo para atualizar o estado do modelo (por exemplo, editar um documento). Também pode enviar comandos para a visualização associada para alterar a apresentação da visualização do modelo (por exemplo, rolando um documento).

Da visão geral da Microsoft sobre MVC .

  • Modelos. Objetos de modelo são as partes do aplicativo que implementam a lógica para o domínio de dados do aplicativo. Geralmente, os objetos de modelo recuperam e armazenam o estado do modelo em um banco de dados. Por exemplo, um objeto Produto pode recuperar informações de um banco de dados, operar nele e, em seguida, gravar informações atualizadas novamente em uma tabela Produtos em um banco de dados SQL Server.

    Em pequenas aplicações, o modelo geralmente é uma separação conceitual em vez de física. Por exemplo, se o aplicativo ler apenas um conjunto de dados e enviá-lo para a visualização, o aplicativo não terá uma camada de modelo físico e classes associadas. Nesse caso, o conjunto de dados assume a função de um objeto de modelo.

  • Visualizações. As visualizações são os componentes que exibem a interface do usuário (UI) do aplicativo. Normalmente, essa interface do usuário é criada a partir dos dados do modelo. Um exemplo seria uma visualização de edição de uma tabela Produtos que exibe caixas de texto, listas suspensas e caixas de seleção com base no estado atual de um objeto Produto.

  • Controladores. Controladores são os componentes que lidam com a interação do usuário, trabalham com o modelo e, finalmente, selecionam uma exibição para renderizar que exibe a interface do usuário. Em um aplicativo MVC, a exibição exibe apenas informações; o controlador lida e responde à entrada e interação do usuário. Por exemplo, o controlador lida com os valores da string de consulta e passa esses valores para o modelo, que por sua vez pode usar esses valores para consultar o banco de dados.

Adam Zuckerman
fonte
E se você não tiver GUI para todas as ações? E se você tiver apenas API implementada para algumas partes específicas? Isso significa que o usuário algumas vezes interage com o View e outras vezes com o Controller diretamente?
Mahdi
1
Da minha perspectiva, não. A API substitui o modo de exibição.
Adam Zuckerman
mas a API pode ser simples url-routes, colocada no Controller. Eu quero dizer que não há exibição ...
Mahdi
1
@AdamZuckerman Obrigado por responder. No próximo comentário, descreverei como acho que uma implementação comum do MVC funciona. Confirme se está correto ou não. Graças
Aviv Cohn
2
@ Mahdi Uma API, por definição, existe como uma interface de programação , não como uma interface de usuário . Os programas interagem com a API, os usuários interagem com a Visualização.
Eric King
4

O usuário interage com o Controlador . Do ponto de vista técnico, você não está interagindo com o View , apenas o está usando para interagir com o Controller .

Aparentemente, parece que o usuário está interagindo com a GUI - também para um não programador, isso faz mais sentido; no entanto, ao clicar em um botão, você basicamente está conversando com o Controller e não com o View .

Além disso, nem todos os aplicativos - mesmo os aplicativos da Web MVC, possuem uma GUI. Você pode interagir com o Controller por meio de uma API - simplesmente simples, url-routespor exemplo, colocado no próprio Controller .

O controlador deve ser o local que recebe e manipula os pedidos do usuário. Portanto, se você está acessando o Model diretamente do View - não importa como, então não é mais o MVC .

Mahdi
fonte
2
+1 Isso está correto. Coisas como menus e barras de ferramentas fazem parte da GUI, mas não fazem parte da visualização, e vão diretamente para o controlador. Pressionamentos de teclas da mesma forma.
David.pfx
1
A razão pela qual as visualizações existem como uma abstração é para que possamos substituí-las facilmente quando necessário. Um controlador para um aplicativo em várias plataformas pode ser o mesmo, mas as visualizações precisam reconhecer os gestos do usuário de maneira diferente e convertê-los em operações do controlador. Não concordo, portanto, que os usuários interajam diretamente com os controladores.
Fuhrmanator 29/03
1
@ Mahdi Eu diria que, nesse caso, não há interação do usuário, é a visão que se comunica com o controlador programaticamente. As únicas interações iniciadas pelo usuário são através da visualização.
Eric King
1
@ david.pfx As teclas digitadas não podem ir diretamente de uma janela do navegador para um Controlador.
Adam Zuckerman
1
@ Izkata "The View é a parte do código para o qual as solicitações são enviadas" - Desculpe, mas esta é a pior coisa que ouvi aqui. Como isso é possível? Você pode fazer o backup fornecendo uma referência em um artigo ou livro?
Mahdi
1

Vamos usar um exemplo concreto de por que os usuários interagem diretamente com visualizações e não com controladores.

No aplicativo de música no iPhone, um recurso de alto nível é reproduzir uma lista de reprodução. "Reproduzir uma lista de reprodução" é uma função de um controlador para o aplicativo.

Há mais de uma maneira de ativar essa função. Posso clicar na lista de reprodução dentro do aplicativo ou pedir à Siri (interface de voz) para executar a mesma função. Esses são dois gestos diferentes que são reconhecidos pelas várias visões.

O feedback em cada visualização também é diferente. A Siri lhe dirá que está tocando a música solicitada. O aplicativo de música mostrará um feedback visual de que ele está tocando na lista de reprodução.

Fuhrmanator
fonte