Por que desacoplar a visualização e o controlador (web)?

8

Por que não podemos colocá-los na mesma página, como cada ação combinada com sua visualização? Não está usando a ilha de código, mas o código do controlador na parte superior e o código na parte inferior? Quais são os problemas com essa abordagem?

Pelo MVC, estou me referindo a estruturas como ASP.NET MVC e Ruby on Rails, e tenho a impressão de que os V e C são realmente a camada da interface do usuário.

Andy
fonte

Respostas:

5

A razão pela qual eles geralmente são dissociados é porque você deseja que sua visualização use um controlador para obter seu modelo. Mas a arquitetura deve permitir que você substitua uma visualização por outra sem precisar alterar a lógica de negócios (por exemplo, modelo de objeto ou como esses objetos são recuperados).

Não vinculando seu controlador diretamente à visualização, mais tarde seria muito mais fácil adicionar outras funcionalidades, como importação / exportação, que podem usar o controlador / modelo diretamente, sem precisar depender de nenhuma interface do usuário.

Outra vantagem de extrair o máximo de código possível da interface do usuário é porque as interfaces do usuário são muito mais difíceis de testar na unidade do que a camada de negócios por trás delas. Ao separar o máximo possível da visão em si, você pode escrever muito mais testes de unidade para garantir que o controlador / modelo e a lógica do aplicativo estejam corretos.

DXM
fonte
Para importação / exportação, você não precisa de uma visualização, portanto não há nada com o que se desacoplar. Para o teste, você ainda pode executar o teste lógico na ação / exibição, o único problema que vejo é carregar o código da exibição que você não precisa testar, mas é possível contornar isso com facilidade.
Andy
Para importação / exportação, você não precisa da visualização, a menos que seu controlador esteja desacoplado da sua visualização, por que você deseja executar o código de visualização quando a importação / exportação pode nem mesmo ser baseada na Web. Além disso, mesmo com páginas da web, você pode ter mais de uma visualização no mesmo modelo (por exemplo, página asp diferente, classe diferente); se você não dissociar seu controlador, duplicará esse código em diferentes visualizações.
DXM
Se não houver visualização, não haverá visualização, independentemente de estar desacoplada ou não.
Andy
Eu pensei que sua pergunta era "por que desacoplar o controlador da exibição". Se a importação / exportação precisar acessar o controlador para obter o modelo de objeto, como ele pode ser feito sem instanciar sua exibição? Sem desacoplar, independentemente de alguém estar ou não renderizando HTML, você está instanciando o código de exibição. Ou você sugere duplicar o código do controlador dentro da funcionalidade de importação / exportação?
DXM
1
Sua postagem original: "Por que não podemos colocá-los na mesma página" - para que você tenha a página asp.net que renderiza HTML e apresenta os dados do seu modelo. Nesta página, você acoplou seu VC em uma classe. Agora você obtém um requisito de que seu aplicativo precisa oferecer suporte à importação / exportação (não desta página, apenas em geral). Se uma lógica de importação / exportação completamente separada precisar de acesso ao controlador, de onde ela está sendo obtida? Ou você está planejando colocar seu aplicativo inteiro na mesma classe de página? E se você quiser executar a exportação offline (ou seja, localmente na caixa do servidor fora do servidor da web)?
DXM
4
  • O controlador lida com a lógica comercial, que pode mudar de tempos em tempos, e a Visualização pode permanecer inalterada, conforme os requisitos.

  • O vice-versa acima também é verdadeiro.

  • Designers e desenvolvedores precisam poder trabalhar no mesmo projeto independentemente.

Um bom post: http://mashable.com/2011/11/12/designer-collaboration-strategies/

  • Todo o sistema se torna mais sustentável. A solução de erros fica mais fácil com a abordagem dissociada.

  • Os padrões da Web com tecnologias de front-end estão mudando rapidamente. Imagine uma empresa que decide migrar todas as tecnologias de front-end para HTML5, Dart, etc. Ter um View e Controller associado seria um pesadelo!

SHOUBHIK BOSE
fonte
Primeiro e para a maioria, a lógica de negócios deve estar no modelo. Em segundo lugar, a visualização é cheia de código, como foreach e helpers, um designer gráfico certamente não gostaria de lidar com isso. Se ele quiser lidar com isso, na verdade ele é um programador de interface do usuário, que o controlador faz parte de sua preocupação. Quanto ao HTML5, a maior parte do HTML é construída a partir de um mecanismo de layout, auxiliares de HTML e visualizações parciais (que são como auxiliares), portanto, não importa se a visualização está acoplada, você não está modificando a visualização em HTML5 .
Andy
@ Andy Youy pediu uma distinção entre C e V ... Nessa perspectiva, C lida com a lógica de negócios, como lida com os modelos.
precisa
3

Você não precisa separar os dois, é claro. Mas se view e controller forem independentes, qualquer interface de usuário poderá ser usada. Por exemplo, você pode usar o controlador através do console, soquetes, web ou interface da área de trabalho. Em outras palavras, você pode aumentar a reutilização do código.

perreal
fonte
Eu estava me referindo ao desenvolvimento da Web, onde a interface do usuário é realmente a visualização e o controlador combinados, então você não pode realmente trocar apenas a visualização com uma nova interface do usuário.
Andy
3
@ Andy - com certeza, você pode decidir que deseja ter um aplicativo iOS nativo e um aplicativo Android para o site que está desenvolvendo. Em vez de ter que fazer as coisas novamente, você pode simplesmente fazer chamadas para seus controladores e ter uma visualização separada no dispositivo iOS / Android, reutilizando o controlador.
Jetti
@ Jetti, esse é um bom argumento.
Andy