Muito simples: MVC não é relacionado a separação em camadas.

Parece simples. É simples. Mas causa tremenda confusão. Por alguma razão que desconheço muitas pessoas acham que MVC e separação em camadas são sinônimos. Talvez porque estão habituados a trabalhar com 3 camadas acham que as três letras caem que nem uma luva. Mas os sistemas podem ter qualquer numero de camadas. Aplicações modernas têm normalmente cinco camadas.

A confusão começa com a palavra “camada”. Normalmente as pessoas se referem à separação do sistema em regiões que se montam umas em cima de outras. Cada região dessas seria uma camada. O nome menos ambíguo para essas regiões é andar.

As pessoa entendem que existe uma camada perto do usuário que media a interação com ele (gráfica ou não),  uma camada na outra ponta , perto dos dados que media a sua organização, transações, etc… e uma camada no meio que contém a lógica que responde aos comandos do usuário e produz alterações nos dados. O nome destas camadas são respetivamente : cliente, dominio e recursos. Hoje em dia esta simplicidade não mais se identifica com a estrutura de aplicações orientadas a objetos. Aplicações OO  focam nas entidades do domínio e  os bancos de dados são apenas repositórios burros. Além disso a tecnologia de repositórios ainda é a tecnologia usada pelas antigas aplicações orientadas a dados e como tal é preciso uma tradução entre os dois mundos. É ai que entra a camada de integração. Ela media entre o dominio e os recursos e entre o dominio em uma aplicação e o dominio de outras aplicações.  Por outro lado as interfaces com o usuário se tornaram mais especializadas e inteligentes fornecendo pistas audiovisuais ao usuário que interage com a aplicação. Esta riqueza leva à constante alteração e embelezamento destas interfaces por questões de gosto ou ergonômicas o que obriga a uma camada que traduz tudo isso para a interação com o dominio. Esta é a camada de apresentação. Aplicações modernas orientadas a objetos utilizam-se destas cinco camadas.

O design pattern Model-View-Controler , mais conhecido como MVC trata de uma solução para design de componentes que atuam dentro de uma mesma camada , normalmente na de Cliente e/ou na de Apresentação. As outras camadas usam outros padrões. A de domínio utiliza ~principalmente os padrões Entity e Service e o de integração os padrões Mediator e Bridge.

O MVC trata da separação de responsabilidade entre as classes da camada e não da separação da responsabilidade entre camadas.

camadasMVC

Por algum abuso de linguagem, desconhecimento ou falta de preocupação em verificar as fontes de informação as pessoas começaram a confundir MVC com separação em camadas. Já à partida deveria ser óbvio que 3 responsabilidades do M-V-C não dão conta das cinco ou mais responsabilidades atribuídas a camadas. Também deveria ser obvio que enquanto no MVC é necessária a presença das três partes, em separação de camadas não é obrigatória a presença de todas as camadas, apenas as necessárias. Além disso as camadas podem estar distribuídas em vários nodos enquanto que as classes que compõem uma implementação MVC têm que estar fisicamente associadas.

À partida seria óbvio supor que estas diferenças são óbvias e fortemente indicativas de que MVC e separação de camadas não são a mesma coisa, mas por alguma razão perdida no tempo muitas pessoas acham que é a mesma coisa. Pior que isso, ensinam a outros que é a mesma coisa. Espero que tenha deixado claro o absurdo que é misturar os dois conceitos.

Adendo (25/11/2009)

Parece que ainda não ficou claro que MVC não é sobre divisão em camadas (andares). Parece que 5 camadas podem caber em 3 letras.  Alguém duvida que 5 não cabe em 3 ? Matemática elementar. Certo ?  Pelos vistos não.

Ok, tem muito lixo pela internet confundindo as coisas. Mas tem muitas pessoas explicando direito [1,2]. Confundir as coisas é fácil. Não é preciso muito raciocínio para isso.  Alguns pontos para pensar:

  • MVC tem dependência triangular em que cada elemento faz e recebe chamadas do outro. Camadas são sobrepostas uma por cima da outra não havendo chamadas da camada baixa à camada alta.
  • Tendo dependência triangular MVC só suporta 3 elementos. Não mais, não menos. Camadas suporta quantas forem necessárias. Basta empilhar mais uma e pronto.
  • MVC é baseado em eventos (Padrão Observer). Comunicação entre camadas têm várias formas de ser feita.
  • MVC é um Design Pattern. Camadas é um Padrão de Arquitetura. Bom, também é complexo para as pessoas distinguirem Design de Arquitetura, mas tem que ser mencionado.

Para os desatentos : MVC e Camadas  não são conceitos de Java. São conceito de desenvolvimento de software. São válidos em qualquer linguagem.

Nunca vou entender como as pessoas conseguem dizer que um triângulo é uma pilha e uma pilha é um triângulo.

trianguloPilhaAdendo (06-01-2015)

Este assunto se mostrou muito mais debatido do que esperava o que me levou a escrever outros posts sobre o tema. Para entender melhor e mais profundamente este tema sugiro que leia estes outros posts : MVC-Onde e Como e Arquitetura ECB

 

 

 

58 comentários para “MVC e Camadas”

  1. Fora a parte que considera como um padrão arquitetural, o resto é mais ou menos a mesma lenga-lenga de sempre.
    Para mim padrões de arquitetura são coisas mais abstratas que MVC. Por exemplo, SOA ou Publish/Subscriber … mas pronto, como digo no texto, é dificil explicar a diferença entre design pattern e padrão de arquitetura.

    A confusão não sei de onde saiu ( no texto exploro algumas opções possíveis). Agora, eu sei como se alastrou : o cego ensinando o surdo. Pessoas que acham que sabem ensinando pessoas que acham que compreendem. E ai vira essa bagunça.
    Claro que, para a esmagadora maioria das pessoas é irrelevante o que MVC realmente é, mas para pessoa que fazem frameworks e trabalham com estrutura de sistemas é bastante importante ter os conceitos bem alicerçados. Alguns sites de renome e algumas revistas sem uma editorial forte deixam passar muita bobagem , igual ao professor do ensino médio que apenas repete o que sabe sem explicar o por quê.

  2. I admit, I have not been on sergiotaborda.javabuilding.com in a long time however it was another joy to see It is such an important topic and ignored by so many, even professionals. I thank you to help making people more aware of possible issues.

  3. Pra mim a lógica do sergiotaborda faz muito mais sentido que qualquer outra que eu tenha lido sobre MVC. Sempre percebi uma necessidade de ter “outra” camada que possua as regras de negócio, e que o model (do MVC) usaria essa “interface” que contém as regras. (essa seria a CAMADA de domínio).

    Outro ponto é que o Framework MVC 3 do .Net cria um projeto MVC onde o View, Controller e Model estão separados por pastas dentro do projeto. Aliás, cheguei nesse post justamente procurando como separar as camadas do MVC. O que agora sei que é um conceito errado.

    Apesar das “trocas de farpas”. Muito boa a discussão.

    Obrigado.

  4. […] Ha algum tempo atrás discuti neste blog sobre com o MVC não representa separação em camadas. […]

  5. […] está seguindo deve saber da conversa que estava acontecendo no post sobre MVC e Camadas onde se falava sobre a “localização” , ou melhor, se o Modelo pertence na camada de […]

  6. […] posts anteriores que remontam a 4 anos atrás falei sobre como as pessoas confundem o padrão MVC com o conceito de Separação de Camadas e o padrão ECB. E embora esta confusão ainda continue (como mostras posts recentes no GUJ) me […]

  7. Olá Sergio, só quero agradecer-lhe por este artigo de qualidade, ainda não tenho experiência na área (nunca trabalhei), mas me interesso por esse tema e tento aprender cada vez mais, e melhor que o artigo só os comentários/discussões no artigo, que esclareceram e muito a diferença entre MVC e Camadas, antes do artigo acreditava que o MVC era três camadas, acredito fazer parte do 10% que se convencem com argumentações (boas). Sou fã do seu Blog, espero que continue compartilhando suas experiências.

  8. Eu estaria certo se separasse o conceito do modelo 3 camadas do MVC assim?

    3 Camadas: são três grupos de objetos onde a apresentação enxerga a de negócios que por sua vez enxerga a de dados, porém a de dados não enxerga a de negócios que por sua vez não enxerga a apresentação.
    MVC: são três grupos de objetos onde a view enxerga a model e a control, a control só enxerga a model e a model só enxerga a view.

Comente

Scroll to Top