Olá, nessa aula eu vou contar para vocês o que são arcabouços ou, inglês, frameworks. E é assunto bem interessante, primeiro porque arcabouços, frameworks é conceito bem avançado de orientação a objetos que inclui basicamente tudo que a gente viu até agora único conceito. outra coisa que é interessante é porque essa palavra framework é utilizada aí no mundo do desenvolvimento de software muito frequentemente. Então, no Brasil por exemplo desenvolvedor fala essa palavra framework muitas vezes, e boa parte desses desenvolvedores nem sabem o significado da palavra. E por isso também não traduzem porque não sabem que tem uma tradução pro português de arcabouço. Essa palavra framework ou arcabouço existe vários áreas do conhecimento, por exemplo, na questão jurídica se fala arcabouço jurídico inglês seria "legal framework" "legal framework" inglês os advogados falam arcabouço jurídico. Advogados no Brasil falam nisso rotineiramente. Nas ciencias sociais, por exemplo, se fala de "conceptual framework" arcabouço conceitual. E desenvolvimento de software se fala Object Oriented Frameworks ou Arcabouços Orientados a Objetos, é que português muitas vezes o desenvolvedores não tem conhecimento tão bom da Língua Portuguesa, e acaba usando o termo inglês mesmo framework, mas é o que a gente de qualquer forma é a mesma coisa é o que a gente vai ver e aprender hoje. Antes de falar exatamente o que são arcabouços vamos recapitular pouco. Então, o que não padrões no contexto de software, padrões de software. É uma forma de documentar conhecimento, geral conhecimento de grandes especialistas desenvolvimento de software. E desta forma geral tem uma certa regrinha que é você descreve o contexto no qual você está tentando resolver determinado problema e daí a solução para esse problema e quais são as consequências da gente adotar esta solução para resolver este problema neste contexto. Então, é texto que descreve este conhecimento nesta forma estruturada. E a ideia é promover o reuso de ideias. Têm ideias que especialistas de desenvolvimento de software têm sobre o como construir software, e a gente codifica essas ideias nesse padrão, nesses padrões. Também padrão normalmente define uma determinada arquitetura. Então, padrão de projeto define uma micro arquitetura, uma pequena arquitetura envolvendo duas três ou quatro classes alí e as relações entre as classes. Já padrão arquitetural por exemplo MVC define eventualmente a arquitetura de sistema inteiro. Então, é uma coisa mais de grande porte, mas o padrão é uma forma de reutilizar então essas ideias essas arquiteturas desenvolvimento de software. Já o que são então componentes? Uma componente de software geral é arquivo, a gente distribui componentes por meio de arquivos e esse arquivo contém dentro dele código executável. Ou código que a gente executa ou código que a gente pode ligar numa nossa aplicação pode conter uma biblioteca lá dentro, ou pode ter outras coisas, mas no geral é conjunto de código, no caso de linguagem orientada a objeto são classes e a definição das classes lá dentro. E diferentes tecnologias diferentes linguagens, têm diferentes formatos para guardar. Então, por exemplo Java é comum ter uns arquivos .jar que significa "ava archive" ou .war que é "web archive." No sistema operacional Windows tem os arquivos .dll que são bibliotecas de 'iii' dinâmica que nada mais é do que são componentes de software que eu posso ligar nas minhas aplicações. no sistema Unix têm arquivos .so shared object. Na linguagem Ruby tem as gemas de ruby, na linguagem Python tem os os wheels de python. No sistema operacional Linux a gente instala novas componentes no sistema operacional com pacotes .deb ou .rp que na verdade são componentes de software que a gente consegue plugar no nosso sistema. Então, esses componentes na verdade é uma forma da gente reusar código. É software que eu posso usar diferentes contextos as vezes diferentes aplicações usam o mesmo código que é importado por meio de uma determinada componente. Tá bom? Então, isso são as componentes. Agora, o que são frameworks, arcabouços? Eu gosto muito deste arquivo do Ralph Jonhson, que é professor da Universidade de Illinois Urbana Champagne nos Estados Unidos que ele diz que frameworks é o conjunto de dois conceitos, os componentes que é o reuso de código, e os patterns que são o reuso de ideias e arquiteturas. Então, é uma forma de você reutilizar código mas também reutilizar arquiteturas de software, reutilizar ideias, reutilizar o design do seu sistema. Como que funciona isso? Como que a gente consegue reutilizar arquiteturas e o design? Vou explicar o arcabouço agora de diferentes formas. A primeira forma é termos da funcionalidade que arcabouço oferece. A gente pode pensar que arcabouço é software que é uma aplicação semi pronta para determinado domínio. Então, é como se fosse, é uma aplicação mas ela não está completa. Falta escrever pedaço dela. Essa parte que vem pronta é a parte que é igual para todas as aplicações daquele domínio. O que é o domínio? Por exemplo, é uma área, pode ser o domínio de jogos Então, a gente pode ter arcabouço para jogos. Ou pode ser domínio de aplicações para fazer folhas de pagamentos de empresas. Esse é segundo domínio. Terceiro domínio pode ser simulações físicas, utilizando mecânica clássica. Esse é terceiro domínio. Quarto domínio pode ser aplicações financeiras na bolsa de valores. É uma área de aplicação. E o arcabouço, o que que ele faz? A parte que já vem pronta nesse arcabouço, vamos pensar num arcabouço que é para fazer folhas de pagamentos para empresas. Dentro do arcabouço já vem pronto tudo que é comum a todas as empresas do mundo, ou todas as empresas de determinado país por exemplo. Todas as empresas do Brasil que tem que fazer uma folha de pagamentos tem certas regras que tem que seguir tem as regras de imposto de renda de INSS as regras de como faz a contabilidade, tudo isso serve para todas as empresas então, o código do arcabouço pode vir já com essas regras que servem para todas as empresas. Mas daí tem uma parte que varia de empresas para empresa, porque cada empresa vai ser pouco diferente, não é? Daí essa essa parte não vem pronta no arcabouço. Essa parte deve ser implementada pelo usuário do arcabouço. O usuário do arcabouço é programador é desenvolvedor que vai pegar aquele arcabouço de folha de pagamento e vai escrever o pedaço que falta sobre as especificidades daquela empresa. O bônus que a empresa dá, as regras de salários daquela empresa. Isso varia de empresa para empresa, então cada desenvolvedor vai ter que implementar esse pedaço para cada empresa. Então, o arcabouço têm muito essa parte. Aquilo que é geral para o domínio já vem pronto no arcabouço e aquilo que é específico para uma aplicação específica aí o desenvolvedor tem que desenvolver. E a ideia é facilitar o trabalho do desenvolvedor. Ele consegue usando bom arcabouço desenvolver muito mais rápido. Desenvolver novas aplicações muito mais rápido, porque? Porque ela já vem semipronta. Então, essa é uma forma da gente ver os arcabouços. Outra forma é olhando mais termos de arquitetura. Arcabouço orientado a objetos, na verdade, ele vêm, ele é conjunto de classes na sua linguagem orientada a objetos. Classes concretas que tem essa parte do código que já vem implementado, já vem pronto. E classes abstratas que não vem pronto, só define-se qual é a interface dessas classes ou você pode se a sua linguagem de programação tem o conceito de interface, vez de classes abstratas pode ser interfaces mesmo. Mas isso já define uma arquitetura da sua aplicação porque ele define quais são as classes principais e como que elas se interrelacionam entre si. Que classe que usa qual, quem que vai chamar quem. Então já vem essa arquitetura meio pré definida algumas classes, já prontas essas classes concretas que tem o código já vem pronto e são reutilizadas pelo programador. Automaticamente usará o arcabouço mas ainda tem essas classes abstratas ou interfaces que define o que precisa ser escrito pelo desenvolvedor que vai usar o arcabouço. Então o arcabouço define o modos operadi assim, define o ambiente ou arquitetura que o desenvolvedor vai ter que seguir. Tem outra questão aí de arcabouço tem dois tipos de arcabouço que a gente pode dizer. Que a gente chama de caixa branca. O arcabouço caixa branca é quando o desenvolvedor ele vê quais são as classes que já vem prontas as classes concretas, eventualmente ele vai criar subclasses dessas classes concretas. Ele vê as classes abstratas ele tem que entender como essa classe abstrata funciona, e ele vai fazer implementações concretas dessas classes abstratas fazendo alí a questão de subclasse. Então, se usa a extensão desse arcabouço via herança. Então, chama caixa branca porque é como se fosse uma caixa transparente seria nome melhor até. O programador tem que olhar dentro do que vem lá do arcabouço entender como funciona o arcabouço e daí escrever as duas classes. Esse é o caixa branca, ou de componentes transparentes que o programador tem que entender. E tem os arcabouços caixa preta. Aí a ideia é que o usuário não olha dentro das classes. Ele simplesmente vê quais são as interfaces que faltam implementar, quais são os pedaços que faltam implementar. E esses pedaços que faltam implementar, muitas vezes nesses arcabouços caixa preta já vem com componentes prontas, que daí o usuário simplesmente escolhe: Para essa coisa aqui eu quero usar esta componente; para essa outra coisa aqui eu uso essa outra componente. Então o arcabouço vem, na verdade, com uma biblioteca de componentes e o usuário pode ir escolhendo qual componente que ele vai usar e daí ele vai escrever muito pouco código. Talvez o código era só o código para escolher qual componente, o código que instancia qual componente para cada uma das interfaces ali que faltam implementar no arcabouço. Esses pedaços que falta implementar às vezes me chama de hotspot, que é tipo pedaço quente ali do arcabouço que eu preciso implementar. Na verdade a gente pode até pensar num caso extremo de arcabouço caixa preta, que seria tipo gerador de aplicações onde o usuário não precisa escrever código nenhum. Podia ter uma interface gráfica onde simplesmente ele vai escolhendo os componentes e clica e arrasta lá as componentes plugando nos lugares certos. Então você podia ter tipo uma programação visual assim usando black blocks framework, arcabouço de caixa preta onde você programa com o mouse vez de digitar código. Isso é caso extremo ali de arcabouço caixa preta. Então o desenvolvedor simplesmente escolhe as componentes que ele quer usar. Não precisa implementar nada. Voltando aqui. Na verdade muitas vezes você vai ter caixa branca, caixa preta, mas muitas vezes você vai ter uma combinação, que às vezes se chama de caixa cinza. É arcabouço que alguns componentes já vem pronto, é só plugar, mas outros você precisa escrever. Então tem todos os tipos possíveis aí de arcabouço dependendo caso. Qual a vantagem de eu usar arcabouço então? Primeira vantagem, o código do arcabouço ele já é super otimizado. Ele já foi muito bem pensado, ele foi escrito por especialistas naquele domínio. Então voltando àquele meu exemplo de folha de pagamento, alguém que estudou muito como funciona a folha de pagamento é quem descreveu aquele código e aquele código provavelmente já foi testado várias empresas. Então provavelmente já está bem feito. Então você tem toda essa vantagem de escrever a sua aplicação usando pedaço que já está pronto e já está muito bem feito. Outra vantagem é que ele define uma arquitetura básica que é seguida por todo o time. Então se você tem uma equipe de dez pessoas trabalhando lá no sistema, o arcabouço já define essa arquitetura básica que essas dez pessoas vão trabalhar. Particular, ao longo dos anos pode ser que pessoas saiam da equipe, pessoas voltem para a equipe e a arquitetura básica continua a mesma, porque é o arcabouço que define. Particular a gente vai ver exemplos, tem vários arcabouços usados aí na indústria, arcabouços de software livre, por exemplo, que milhares de empresas no mundo usam aquilo. Então você pode contratar uma pessoa que já sabe trabalhar muito bem dentro daquele arcabouço. Então ele já chega na empresa, talvez no primeiro dia da empresa ele já está escrevendo o código ali porque ele já está confortável com aquele ambiente de programação. Uma outra grande vantagem é que é muito menos código para escrever, porque boa parte já vem pronto ali, você não precisa ficar reinventando a roda e a gente consegue reutilizar as arquiteturas, como eu já citei. Agora tem desvantagens do uso de arcabouços. A curva de aprendizado é complicada. Aprender a usar arcabouço novo é complicado, não é algo geral, que você faz numa tarde, não. Você precisa ler muita documentação, você precisa ver muito exemplo de código, precisa praticar bastante. Então arcabouços mais complexos, às vezes você precisa de meses de experiência para ficar excelente desenvolvedor naquilo. Então é difícil de aprender. Então se você precisar fazer uma coisa para amanhã não vale a pena você aprender arcabouço novo para fazer uma coisa para amanhã. Mas se é uma coisa mais de longo prazo, aí pode valer a pena. Outra desvantagem. Às vezes para fazer sistema a gente quer usar diferentes arcabouços para fazer diferentes coisas. Por exemplo, para gerar interface web, outro para fazer a persistência no banco de dados, outro para fazer a segurança e criptografia, porque tem arcabouço para todas as coisas e às vezes tem conflito entre eles. Tem uma coisa que eu já vou explicar para vocês que o arcabouço ele gosta de ter controle das coisas e às vezes quando você coloca dois no mesmo sistema e os dois querem ter controle das coisas fica complicado Esse é o princípio de Hollywood que eu já vou falar daqui a pouco, que é algo que pode atrapalhar. Outra coisa é sobrecarregar o sistema sem necessidade. Alguns desses arcabouços contém centenas de milhares de linhas de código. São megabytes e megabytes de código que vão ser executados ali. Então às vezes você precisa fazer uma coisa super simplesinha, e uma arcabouço facilitaria, mas não sei se é uma boa ideia porque você vai estar colocando ali centenas de megabytes na sua aplicação para fazer uma coisinha que é simples, talvez não vale a pena. Aí você vai ter que avaliar. Cada caso você vai ter que tomar essa decisão, se vale a pena ou não vale a pena usar. Sempre tem vantagens e desvantagens. O que é esse tal de Princípio de Hollywood? Por que que chama assim? É uma coisa engraçada, porque dizem que quando você vai lá Hollywood e você vai prestar concurso para ser ator determinado filme de Hollywood, para fazer parte do casting daquele filme, eles às vezes fazem testes, fazem entrevistas com centenas de potenciais atores e o pessoal de Hollywood, eles não querem que todos os atores fiquem telefonando lá, perguntando " você vai me chamar? Você vai me selecionar? Eu vou poder participar do filme?" Então eles falam "Don't call me. I will call you. Não liga para mim. Eu vou te chamar. Se você for selecionado eu vou te chamar. Não me telefona que eu não quero nem saber." Então dizem que os frameworks usam também esse princípio de Hollywood. Como que é isso? É uma coisa que software a gente chama de inversão de controle. Se você pensar bem, quando a gente está usando programação normal e usando uma biblioteca de classes, por exemplo o Java já vem com aquelas várias classes da biblioteca de classes de Java, ao usar a biblioteca o programador escreve o código que chama as funções da biblioteca. Então o Java tem a classe math que tem uma série de funções matemáticas. Se eu quero saber o seno de número X, eu chamo a função Seno de X. Então aí os programadores chamam a função. E ao definir o meu jogo, se é videogame, por exemplo, eu que vou chamando as funções ali no meu código. Então esse é o uso normal eu diria de programação normal usando bibliotecas. A gente chama as funções da biblioteca. Já frameworks tem uma inversão de controle. Normalmente é o framework que chama nosso código. Então ao usar o arcabouço, o programador escreve o código que é chamado pelo arcabouço é algo meio o inverso. Então, por exemplo, os arcabouços para produzir jogos, videogames, geral são chamados de game engine, que é como se fosse uma engenhoca, motor de jogos. E na verdade esse motor de jogos tem o que a gente chama de loop principal, game loop, que é uma coisa assim, se é jogo que tem 30 quadros por segundo, jogo de ação, de tempo real com uma animação, 30 vezes por segundo o arcabouço do jogo, o game in, chama o nosso código falando "calcule as ações que vão acontecer no próximo momento. Calcule os sons que vão acontecer agora, ou, calcule as regras de economia do jogo que vão definir os próximos passos do jogo." E o arcabouço que vai controlando isso vai chamando o nosso código. Então ele chama nossa função que desenha, ele chama nossa função que calcula as mudanças no jogo, ele chama a função que calcula as regras da economia. O arcabouço que vai chamando os nossos códigos e a gente simplesmente escreve algumas classes que a gente pluga no arcabouço e o arcabouço vai chamar nosso código. Então essa é a inversão de controle. Por isso que às vezes dá problema se você usa vários arcabouços aos mesmo tempo. É o arcabouço que fica querendo chamar todo mundo e pode ter conflito entre arcabouço e o outro. Às vezes acontece isso. Pensando pouco, a gente já viu nesse curso aqui o MVC, o padrão Model View Controller. Será que é padrão, ou será que é arcabouço? Eu ensinei ele, se não me engano, como padrão, mas vocês estão desenvolvendo software aí, vocês usam o software que implementam o MVC. Por exemplo, o Spring MVC. Será que é padrão ou arcabouço? Provavelmente como surgiu o MVC na história? Surgiu na comunidade de small talk no final da década de 70. Provavelmente ele emergiu como uma arquitetura de uma aplicação específica. Surgiu no contexto de interfaces gráficas de aplicativos para desktop do pessoal programando small talk e acabou depois de tempo desenvolvendo as aplicações, dividindo o código de uma aplicação no modelo, na visão e no controlador. Mas depois de tempo provavelmente aquilo virou arcabouço, porque eles viram que era uma coisa tão útil e poderosa e genérica que servia para diferentes aplicações, que eles acabaram extraindo a parte comum que era dessas diferentes aplicações e colocaram no que eles chamam de MVC phramework que foi apresentado no smalltalk 80, no ano de 1980. E nesse MVC phramework lá tinha uma classe model que era uma classe não lembro se é concreta ou abstrata mas era uma classe que já vinha com certo código que contém tudo o que modelo faz, e os novos programadores, querendo usar isto tinham que implementar subclasses smalltalk não tinha interface, então é subclasse mesmo. Implementar subclasses do modelo, a mesma coisa pro view e pro controler. Smalltak traz a classe model, traz a classe viewer, traz a classe controller e os programadores tem que implementar subclasses destas três classes para implementar a sua aplicação. Então, é arcabouço, tem código, não é só arquitetura é o código associado a arquitetura tem a classe model, tem a classe viewer e tem a classe controller. Depois de uns anos quando o pessoal quis documentar aqui, eles documentaram na forma de padrão arquitetural daí virou padrão MVC, então por isso que a gente pode falar de padrão MVC mas também pode falar arcabouço MVC para linguagem Java, para linguagem C++, linguagem Smalltalk e assim por diante. Então, padrão pode ser uma forma de documentar arcabouço. Alguns exemplos de arcabouços úteis no mundo Java, se usa muito arcabouço no mundo da indústria, no mundo do software livre. Acho que o mais comum, o mais usado é o JUnit que é arcabouço para testes automatizados ele já define alí o que é teste case, já define uma série de coisas e basta a gente implementar uma nova classe que seja alí do tipo teste case que automaticamente vai rodar todos os testes, o arcabouço JUnit vai chamar a nossa classe de testes. Então é o arcabouço que chama a gente, a gente não faz uma chamada JUnit, a JUnit que faz chamada com a gente. Tem o selenium que é o outro arcabouço de testes mas aí é teste de interfaces web. Ele roda dentro do navegador web e ele testa os elementos, então tem comandos para clicar botões para se fazer seleções menus, é bem interessante para testar aplicações web pela interface gráfica da aplicação web, o Springboot a gente viu aqui neste curso, é arcabouço que tem várias funcionalidades, mas é usado bastante para injeção de dependencias. Tem o Spring MVC que implementa o padrão model view controler =, Java usando o Spring. Hibernate é que era muito usado no passado que é para persistir banco de dados relacional objetos Java, então a gente simplesmente escrevia objeto Java comuns e usando Hibernate ele grava o estado dos objetos Java banco de dados relacional. [INAUDÍVEL] dos vários bancos de dados aí que existem e o HIbernate funciona bem até hj. Tem vários aí outros lançados mais modernamente, então a google recentemente lançou esse GWT, que é a Google Web Toolkit que é arcabouço para fazer aplicações pra web e outras no mundo não Java tem monte de arcabouço bastante interessantes, o Ruby on Rails é que eu adoro, que é jeito na linguagem ruby de você produzir aplicações Web, sistemas Web de uma forma muito fácil, muito ágil e que tem mapeamento até o banco de dados, então você define tudo uma forma aumentada objetos pra baixo pro banco de dados ele gera automaticamente toda sua estrutura de banco de dados e pra cima pra interface web gráfica ele também gera automaticamente o html, ele gera interface de serviço web, então bem rico, bem útil. O Jungle é uma coisa mais ou menos similar para Python, no mundo de Java script tem outras ferramentas super interessantes para quem trabalha com isso que são ferramentas do tipo reactangular, mais recentemente para aplicações móveis que automaticamente se redimensionam para diferentes tipos tem Flutter. Tem [INAUDÍVEL] de jogos que é o Unity, que é muito famoso muito utilizado para construir jogos, que a gente pode ver como arcabouço também. Tem o cactus para computação científica C++, então várias áreas do conhecimento, vários domínios diferentes tem bons arcabouços aí que ajudam bastante no desenvolvimento, facilitam no desenvolvimento dá trabalhinho inicial para aprender como usar, mas uma vez que você se torna conhecedor daquela ferramenta a sua produtividade aumenta muito. Então resumindo, para terminar aqui Arcabouço ele define uma arquitetura reutilizável de sistema ou de uma parte de sistema que é representada por conjunto de classes abstratas e a forma como essas classes interagem entre si. Elas também podem ter pouco de código já pronto que é reutilizado pelo desenvolvedor e está usando esse arcabouço, a gente pode ver arcabouço como se fosse esqueleto semi-pronto de uma aplicação que deve ser completada pelo desenvolvedor para gerar uma aplicação completa. Então, isso tem várias vantagens, não só fica muito mais fácil desenvolver uma aplicação como ele jpa define uma arquitetura e é uma arquitetura já feita por especialista naquele domínio. Acho que vocês vão usar muitos arcabouços ainda na sua vida, vão aprender muitos phrameworks diferentes, divirtam-se com eles, só tomem cuidado para não abusar, particular construir novo arcabouço é algo bem complicado. Você só deve tentar construir arcabouço se você está trabalhando uma área domínio que você já tem bastante experiência, você já fez várias aplicações naquele domínio e aí sim, você já tem o gabarito, a tarimba para construir novo arcabouço naquele domínio futuras implementações. Então é isso, esperam que vocês tenham gostado, este é conceito importante não se esqueçam então o que é o phramework, arcabouço. Abraços!