Neste vídeo vamos falar sobre o padrão MVC que é dos padrões mais antigos que existem. O MVC ele é padrão arquitetural, ele não é padrão de projeto de software. Padrão de projeto, normalmente diz respeito a pedaço relativamente pequeno do sistema,. Já padrão arquitetural descreve toda uma arquitetura de sistema muito completo e grande e abrangente. Então, às vezes a gente tem centenas de milhares de linhas de código, que estão dentro de único padrão e o MVC é desses padrões desse tipo. MVC são as iniciais de Model View Controller, a gente vai ver já porquê. Qual é que é o contexto? O contexto, a gente usa o padrão MVC, quando a gente quer desenvolver uma aplicação interativa que requer a interface humano computador flexíveis. Então, ela vai ter uma interface, normalmente uma interface gráfica e tem ser humano interagindo com essa interface gráfica. Cada vez que ele interage, alguma coisa acontece no sistema. Então esse é o comtexto. O objetivo é permitir que sistema possa visualizar dados de diferentes formas e permitir que sistema possa receber a interação do usuário também de diferentes formas. E que seja bastante flexível o jeito de se fazer isso. Qual é que é o problema com que ele lida? Interfaces com o usuário, são particularmente sensíveis às mudanças. Então ao longo do desenvolvimento de sistema, que isso às vezes pode demorar vários anos, é muito comum o cliente solicitar modificações com frequência e se o sistema não comporta essas mudanças de uma forma fácil, a gente pode ter muita dor de cabeça para implementar isso. A aplicação às vezes pode ter que ser implementada uma outra plataforma, por exemplo, foi feita para computador e tem que se agora rodar num telemóvel celular, ou pode ter que utilizar uma outra aparência diferente. Às vezes a mesma aplicação possui diferente requisitos dependendo do usuário, pode ter operador do sistema que prefere digitar as coisas, porque ele consegue digitar a coisa muito rápida. Por outro lado, às vezes gerente não quer digitar nada, ele só quer ver uma interface visual e com mouse e com alguns menus, ele vai lidando com o sistema. Então é o mesmo sistema, os mesmos dados que têm tipos diferentes de interação. Se o código da interface gráfica é muito acoplado ao código da aplicação, você fica misturando comandos de interação gráfica com comandos da lógica do negócio, o desenvolvimento pode-se tornar trabalhoso e o sistema fica muito amarrado e pouco flexível. Esse é o problema. Então a solução é o MVC, ela foi proposta inicialmente ali no Smalltalk na década de 80 e o que o MVC propõe é que se divida a aplicação interativa três partes. Uma parte que vai lidar com a entrada, do usuário, a interação do usuário. Outra parte que vai lidar com os dados, as regras de negócio e outra parte que diz respeito à saída, ou seja, visualização dos dados do sistema. E daí tem essas três partes. O modelo do M encapsula os dados e funcionalidades principais da aplicação. A saída é feita através de visões, o V das visões, Views e a entrada é feita através do controladores, do C dos Controllers. Esse padrão, ele foi proposto como eu falei, lá na década de 80 e tem´um artigo aí muito bom desse pessoal aqui, do Krasner, do Pope dessa empresa ParcPlace, que é uma empresa que surgiu da Xerox. Xerox é uma empresa famosa, lá do Vale do Silício dos Estados Unidos que foi a empresa que desenvolveu o primeiro sistema computacional com janelas, com interface gráfica. Particular, muita coisa boa saiu desse laboratório da Xerox, o laboratório Parc da Xerox. Particular alguns meninos visitaram o laboratório, lá na década de 80. Meninos de 20 e poucos anos, o Steve Jobs e o Bill Gates, que você já deve ter ouvido falar. Eles viram o que o pessoal na Xerox estava fazendo e se inspiraram para fazer os seus sistemas depois. Mas nesse artigo aqui, que ele descreve o Model View Controller, desenvolvido lá na Xerox tem uma figura aqui que é interessante de a gente ver. Então tem esses três componentes. O controlador recebe a entrada do usuário. Pode ser teclado, pode ser mouse, pode ser sensores, qualquer tipo de entrada fisíca do usuário. E ele vai tomar ações a partir dessas entradas. Normalmente a ação é o quê? É mudar o estado do sistema, o que a gente chama de modelo. O modelo do sistema vai conter então os dados, o estado do sistema e pode ter ali regras de negócio. Então o usuário vai usar esses dispositivos que vão mandar a mensagem para o controlador, que vão mudar o modelo. Quando mudo o modelo mudo o estado do sistema. Tipicamente a gente vai precisar atualizar a visão da interface gráfica. E daí a gente vai ter esse componente chamado View que é quem é responsável por atualizar a visão para fora. Então a boa parte da comunicação acontece aqui nesse pedaço. Aqui a parte de cima aqui não acontece muita coisa, boa parte acontece aqui. Vamos voltar aqui para os slides, que a gente vai ver mais detalhes como isso funciona. É assim. Vamos começar com exemplo. Vamos supor que você tem uma eleição para deputado federal e esse aqui é sistema de apuração tempo real que você quer poder alimentar dados nesse sistema, como os votos que estão chegando, mas também visualizar os dados de diferentes formas. Então o modelo aqui, é o resultado parcial da apuração dos votos do partido até ao momento. Então vai ter para cada partido, para cada candidato o número de votos e isso vai ficar armazenado no modelo. As visões podem ser diferentes interfaces gráficas com as quais eu quero apresentar esses dados. Pode ser gráfico de torta, gráfico de barras, a divisão do parlamento por partidos ou por bloco de posição versus situação. Pode uma tabela números de deputados, tabela com número de votos. Então são diferentes formas de visualizar e a gente pode ter paralelamente, no MVC, vários V, várias visões mostrando paralelo esses diferentes formatos. E daí a gente tem o controlador, o controlador vai ser algo que permite mudar, por exemplo, o número de votos na tabela com o número de votos. Pode tanto ser uma interface que operador vai lá e digita o número de votos, ou uma interface que ele pode submeter arquivo com os dados de uma urna e dessa forma, submetendo esse arquivo, o sistema contabiliza os dados daquela nova urna. No próprio livro do GoF, embora ele não descreve o padrão detalhes, ele tem fala pouquinho sobre padrão e tem esse exemplo aqui, que o GoF apresenta. Então tem modelo ali com determinados por exemplo, percentual de votação de três partidos diferentes e daí você pode mostrar isso aí de diferentes formas, ou gráfico de barras, gráfico de torta, gráfico de uma tabela. Esse aqui são exemplos de sistema implementado Smaltalk que tinha realmente essa aparência, sistema antigo da década, início da década de 90. Tem essa aparência vintage. Qual é que é a dinâmica? A dinâmica é o seguinte, esse aqui é diagrama de interação, UML que descreve a dinâmica do sistema. Aqui está o controlador, num sistema você pode ter ou mais, e chega evento ali que o usuário gerou,pode ser ele apertou tecla, ele clicou com o mouse algum lugar. O que o controlador faz, ele vê qual é o tipo de evento, evento diz respeito ao quê? E daí ele manda para o modelo correspondente uma mensagem que falou, modelo, se atualiza de determinada forma porque o usuário fez esta coisa. Daí o modelo atualiza os dados e o modelo ele tem esquema, que usando outro padrão, que se chama padrão Observer, ele notifica todos os outros componentes que dependem do modelo. Então particular no MVC, você pode ter várias views que dependem de modelo. Então ele notifica todos os views, nesse caso só tem exemplo aqui com view, ele fala para o view, view atualize-se porque eu sei que você está visualizando os meus dados e mudar os meus dados. Daí o que é que o View faz? Ele vai lá e fala, então me manda os dados detalhados. Então esse query model, ele fala eu sou visualizador que precisa desses dados, me mande para mim esses dados e daí vêm os dados e daí ele atualiza aqui o display. Então esse aqui é exemplo bem simples, mas o modelo pode ter vários views que são dependentes desse modelo e na verdade até, você pode ter controlador que é dependente do modelo. Porque o controlador às vezes, quando você muda o modelo tem que mudar o jeito que o controlador recebe os dados do usuário. Então também pode ser que você precise atualizar o controlador quando você muda o modelo. A implementação, como é que isso funciona? Isso depende muito da linguagem de programação que você vai usar e do contexto se é uma aplicação para uma interface gráfica de desktop se é sistema Web se é quiosque interativo, para ficar lá num shopping center, aplicativo, dependendo do contexto pode mudar. Mas normalmente você vai ter uma classe abstrata para cada dos Três elementos principais, uma classe abstrata por modelo, uma por view e outra por controller, e daí o programador desenvolve as aplicações dele criando subclasses dessas classes abstratas, então cada aspecto do sistema vai ter modelo diferente e daí você vai ter várias views e vários controladores associados a esses modelos do sistema. Tipicamente, toda lógica do MVC si o programador não precisa implementar isso, por quê? Porque já está implementado nessas classes abstratas. O programador só precisa customizar o pedacinho que diz respeito a sua aplicação específica, isso a gente chama de arcabouço, ou seja, conjunto de classes abstratas que eu, simplesmente, crio as subclasses para customizar, para desenvolver a minha aplicação específica, isso é uma coisa que chama arcabouço orientado a objetos ou object-oriented framework. Normalmente, cada modelo, então, vai ter ou mais controladores, divisões, para visualizar os dados e para controlar, alterar os dados, então se o jeito que a gente implementa, eu não vou entrar muito detalhes, exemplos de códigos, porque cada contexto vai ser diferente. Usos conhecidos, inicialmente, apareceu lá na década de 80, inicialmente, dezenas de aplicações com interface gráfica interativa para computadores, para notebooks, desktops, foram desenvolvidos, primeiramente, na linguagem Smalltalk, porque surgiu na linguagem Smalltalk, que era o grande primeiro ambiente alí, com janelas. Depois, mais para frente, foram implementadas frameworks, arcabouços, MVC na linguagem C++, na linguagem Java, para fazer aplicações de desktop, aplicações que rodam, então, no computador. A partir da década passada, com a popularização da internet, sistemas web, começaram a aparecer os "web application frameworks", esses arcabouços específicos para aplicações web e, muitos deles, passaram a utilizar esse modelo do MVC, então coisas do tipo Java Struts, foi que apareceu alí inicialmente, depois apareceram outros, mais recentemente o Java Spring, que permite o desenvolvimento de aplicações MVC para web, daí é pouco diferente, porque a página web é a visão, as visões são páginas web, mas também são controladores, então você tem o código do controlador, o código da visão, os dois conjunto geram uma página web, então quando você aperta alguma coisa numa página web, submete uma nova página, tem código do controlador lá no servidor web, que é quem pega essa sua ação, faz alguma coisa, muda os dados e gera uma nova visão, que é uma nova página web que você visita. Mais recentemente, tem aplicações desse padrão MVC várias linguagens PHP, ASP.net, C#, Python, Javascript, praticamente quase toda linguagem que é usada na web tem algum arcabouço MVC disponível para facilitar o desenvolvimento de aplicações. Mais recentemente, por volta aí de 2019 e 2020 começaram a se popularizar outros tipos de arcabouço para desenvolvimento de aplicações web, tipo React, Vue e Angular e eles também são inspirados no MVC, mas aí é MVC estendido e às vezes pouco alterado, então às vezes o controlador é dividido dois ou três componentes diferentes. É sistema ainda mais complexo, mas tem como objetivo fazer essas aplicações que podem, facilmente, se adaptar a telefones celulares, desktops e diferentes contextos e, também, a ideia é facilitar o trabalho do desenvolvedor, então já tem muitas classes que já vêm prontas e o desenvolvedor faz o mínimo possível para conseguir desenvolver essas aplicações com maior produtividade. Desvantagens de usar o MVC? É uma arquitetura complexa, você vê que tem vários componentes, tem toda a interação entre elas, então a gente acaba, às vezes, tendo muitas classes no nosso sistema para implementar sistema que não é tão complexo acaba tendo dezenas de classes. Pode ser difícil de navegar pelo código, porque você tem o modelo, depois você vai buscar como esse modelo é visualizado, tem que ser uma outra classe, que são as visões, mas essas visões estão atreladas ao controlador, então você tem que ficar navegando por esses vários arquivos diferentes, pode ser uma coisa pouco difícil, particular, a curva de aprendizado é pouco difícil. Você não aprende o MVC com uma hora lendo texto, você precisa praticar pouco, você vai ler tutorial, você vai implementar, daí você vai errar, daí você vai tirar dúvida, então precisa de algum tempo, mas é uma coisa fundamental para cientista da computação, engenheiro da computação que vai trabalhar com software tem que conhecer o MVC, mesmo que não vá, futuramente, trabalhar a curto prazo, mas você ter esse conhecimento é uma coisa tão importante, que precisa conhecer. Outra desvantagem é que às vezes cada funcionalidade fica espalhada três partes diferentes, você quer implementar uma nova feature, uma nova funcionalidade no seu sistema, você tem que implementar três coisas, implementar o modelo, depois implementar a visão, implementar o controlador, então, dá certo trabalho extra, mas você ganha muita flexibilidade no seu sistema e, principalmente, se você usar esses arcabouços mais modernos, na verdade, não é tanto trabalho, são poucas linhas de código que você escreve no seu M, no seu V e no seu C e o sistema já faz, automaticamente, muita coisa, então acaba facilitando. Então, para concluir, é padrão arquitetural altamente utilizado há quatro décadas, por milhares de sistemas, para criação de aplicações que tenham uma interatividade rica e é jeito de você organizar bem essas aplicações. Há vários arcabouços prontos que implementam esse padrão, frameworks que ainda estão disponíveis, então não é você que vai implementar eles, você já vai usar uma implementação e se a sua aplicação é muito simples, talvez não vale a pena usar o MVC, talvez valha mais a pena usar uma coisa mais simples mesmo, porque você não vai querer matar uma formiga com canhão. Então é isso, espero que vocês tenham tido uma ideia inicial do que é o MVC, agora escolham aí sua implementação preferida do MVC na sua linguagem de programação preferida e experimentem fazer uma aplicaçãozinha. Vai ser legal.