O que é um framework
Um framework é um conjunto de bibliotecas, estruturas e regras que oferece uma base pronta para o desenvolvimento de aplicações dentro de um mesmo domínio de problema. Em vez de começar do zero, você parte de um esqueleto já validado e preenche apenas o que é específico do seu sistema.
Um dos temas mais discutidos no desenvolvimento de software é a otimização de tempo e de recursos. Afinal, toda equipe busca eficiência, qualidade e segurança no menor prazo possível.
Isso nos leva a um dos maiores recursos da programação moderna. Neste artigo, você vai entender o que é, como funciona, quais são as características e os fundamentos de um framework.
O que é um framework
Um framework reúne funcionalidades e estruturas para o desenvolvimento de aplicações, com o objetivo de resolver problemas de um mesmo domínio e permitir a reutilização de código. Assim, cada linguagem de programação ganha frameworks identificados por suas metodologias, propósitos e implementações.
Na maioria dos casos, esse conjunto é formado por classes escritas em uma linguagem específica. Essas classes fornecem recursos comuns já prontos, validados e testados, que aceleram o desenvolvimento e ajudam na detecção de erros.
Além disso, ele fornece um modelo para resolver um problema específico. Dessa forma, o framework abstrai parte do código da solução e deixa você focar nas regras de negócio.
Na programação orientada a objetos, um framework é um conjunto de classes e interfaces voltado à reutilização de arquitetura de software. Ele define objetos, mapeia suas responsabilidades e estabelece um fluxo de controle, ou seja, é ele quem guia a solução de um domínio específico.
Hot spots e frozen spots
Um framework possui duas partes fundamentais. Essa divisão explica por que ele é, ao mesmo tempo, rígido em alguns pontos e flexível em outros.
Os hot spots são as partes projetadas para serem genéricas, que você adapta às necessidades da aplicação. Por exemplo, um controller ou um handler de rota que você escreve para atender a uma regra de negócio.
Já os frozen spots definem a arquitetura geral do sistema, seus componentes básicos e os relacionamentos entre eles. Essas partes permanecem imutáveis em todas as instanciações do framework.
Qual a diferença entre framework e biblioteca
Para entender melhor um framework, vale esclarecer o que é uma biblioteca, ou library. Essa comparação evita confusões muito comuns entre iniciantes.
Uma biblioteca é uma coleção de implementações escritas em uma linguagem, que fornece recursos independentes para executar um comportamento. Nesse caso, o seu programa invoca a biblioteca e mantém o controle sobre quando e como usar cada recurso.
O framework, por outro lado, impõe um modelo colaborativo e um padrão de interação ao qual o seu programa precisa se adaptar. As dependências entre as classes já vêm embutidas, com a comunicação entre os objetos previamente definida.
Então, é o framework que chama o código da sua aplicação e controla o fluxo de execução. Esse conceito recebe o nome de inversão de controle, também conhecido como princípio de Hollywood: "não nos chame, nós chamamos você".
Inversão de controle na prática
Veja a diferença em código. No primeiro trecho, você chama uma biblioteca de serialização quando quiser.
using System.Text.Json;
// Você decide quando chamar a biblioteca
var json = JsonSerializer.Serialize(new { Name = "balta.io" });
Console.WriteLine(json);
No segundo trecho, com ASP.NET Core, você apenas registra uma função. Quem decide quando executá-la é o framework, ao receber uma requisição HTTP.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
// O framework chama esta função quando chegar um GET em /hello
app.MapGet("/hello", () => "Hello, world!");
app.Run();
Repare que, no segundo caso, você não escreve o laço que escuta a porta, lê os bytes e monta a resposta. Tudo isso faz parte dos frozen spots, enquanto a função passada ao MapGet é um hot spot.
Se quiser ir além nesse exemplo, o artigo sobre Minimal APIs no ASP.NET mostra o modelo em detalhes.
Tipos de framework
A literatura acadêmica costuma classificar os frameworks em três tipos, de acordo com o escopo do problema que resolvem.
O framework de suporte disponibiliza serviços de nível de sistema, como acesso a arquivos ou drivers de dispositivos. Como o foco deste artigo é o desenvolvimento de aplicações, não vamos detalhá-lo.
O framework de aplicação, também chamado de framework horizontal, encapsula conhecimentos aplicáveis a vários tipos de aplicações. Ele resolve apenas uma parte da solução, como a construção de interfaces gráficas, e serve a domínios diferentes sem depender deles.
O framework de domínio, também chamado de framework vertical ou especialista, encapsula conhecimentos de um domínio particular. Ele resolve boa parte da aplicação, como um framework para sistemas de controle financeiro.
Maneiras de utilizar um framework
Além do tipo, os frameworks variam na forma como você estende o comportamento deles. Essa escolha afeta diretamente a curva de aprendizado e a flexibilidade.
Framework white box, black box e gray box
No modelo inheritance-focused, também chamado de white box ou architecture-driven, o reuso acontece por herança e associação dinâmica. Você estende ou modifica a funcionalidade criando subclasses e sobrescrevendo métodos, por isso precisa entender o funcionamento interno.
No modelo composition-focused, também chamado de black box ou data-driven, você usa a funcionalidade já presente sem alterar o código interno. Nesse caso, o comportamento nasce das instanciações e composições dos componentes, por meio das interfaces fornecidas.
O modelo hybrid, ou gray box, combina os dois anteriores. Ele permite reuso por herança e por composição, com boa flexibilidade e extensibilidade, enquanto esconde informações desnecessárias.
Injeção de dependência
A injeção de dependência é um padrão que mantém baixo o acoplamento entre os módulos de um sistema. Em vez de codificar as dependências, você as configura em um container, que as entrega a cada componente.
Ela se relaciona diretamente com a inversão de controle presente nos frameworks. Afinal, o container decide quem cria cada objeto e conecta os diferentes elementos da aplicação.
No ASP.NET Core, por exemplo, o container de DI faz parte do próprio framework. O artigo dependency injection no ASP.NET Core mostra como ele funciona na prática.
5 frameworks backend
A seguir, você conhece cinco frameworks populares para o lado do servidor, cada um em uma linguagem diferente.
Spring
O Spring é um framework open source para a plataforma Java, criado por Rod Johnson. Ele se baseia nos padrões de inversão de controle e injeção de dependência, com um container que instancia as classes e resolve suas dependências.
Originalmente, as dependências eram declaradas em arquivos XML, e hoje também é comum configurar tudo com anotações e classes Java. O ecossistema traz módulos para web, persistência, acesso remoto e programação orientada a aspectos.
Django
O Django é um framework web escrito em Python, que segue o padrão model-template-view (MTV). Ele nasceu para gerenciar o site de um jornal na cidade de Lawrence, no Kansas, e depois virou projeto de código aberto.
Além disso, o Django adota o princípio DRY (Don't Repeat Yourself), que evita repetição de código. Ele oferece uma linguagem de templates extensível e um ORM que mapeia classes Python para tabelas do banco de dados.
Express.js
O Express é um framework web minimalista para Node.js, escrito em JavaScript e criado por TJ Holowaychuk. Em 2015, a StrongLoop, empresa que mantinha o projeto, foi adquirida pela IBM, e o Express passou depois aos cuidados da Fundação Node.js, hoje parte da OpenJS Foundation.
Como roda sobre o Node.js, ele se apoia no motor V8 do Chrome. Com isso, oferece métodos utilitários HTTP, middlewares e suporte a template engines, muito usados na criação de APIs.
ASP.NET
O ASP.NET é o framework da Microsoft para aplicações web, que aceita C#, F# e Visual Basic. Na versão clássica, ele integra o .NET Framework, roda no Windows e costuma usar o servidor IIS.
Ele permite reutilizar código de outros projetos .NET, mesmo escritos em linguagens diferentes. Segundo a documentação oficial do ASP.NET, a versão clássica oferece três estruturas para aplicações web: Web Forms, ASP.NET MVC e ASP.NET Web Pages, além do Web API para serviços HTTP.
Vale destacar que o ASP.NET Core é o redesenho moderno dessa plataforma. Ele é multiplataforma, open source e mais modular, e hoje concentra a evolução do framework, com recursos como Razor Pages, Minimal APIs e Blazor.
Laravel
O Laravel é um framework PHP open source, criado por Taylor Otwell, para sistemas web baseados no padrão MVC (model, view, controller). Ele surgiu como uma alternativa mais completa ao CodeIgniter, com suporte integrado a autenticação e autorização.
Além disso, ele possui uma sintaxe simples e concisa, um sistema modular com gerenciador de dependências e várias formas de acesso a bancos relacionais. Também traz utilitários que ajudam no desenvolvimento e na manutenção dos sistemas.
5 frameworks frontend
Do lado do cliente, os frameworks tratam de renderização, componentes e estado da interface. Veja cinco exemplos conhecidos.
AngularJS
O AngularJS é um framework JavaScript de código aberto, desenvolvido em 2009 por Miško Hevery e Adam Abrons. Inicialmente, ele fazia parte de um serviço de armazenamento JSON online e, depois, passou a ser mantido pelo Google.
O AngularJS facilita a criação de single page applications com uma arquitetura próxima do model-view-viewmodel (MVVM). Ele lê atributos especiais no HTML, as diretivas, e liga a apresentação ao modelo por meio de data binding.
Atualmente, o Google encerrou o suporte ao AngularJS, e o sucessor é o Angular, reescrito em TypeScript. Por isso, novos projetos devem considerar o Angular moderno.
Vue.js
O Vue.js é um framework JavaScript de código aberto criado por Evan You, que começou o projeto em 2013 após trabalhar com AngularJS. A ideia era aproveitar as partes que ele mais gostava do Angular em algo muito mais leve.
Ele foca em interfaces de usuário e single page applications, com uma arquitetura adotável de forma incremental. Além disso, combina renderização declarativa, composição de componentes e re-renderização otimizada, com recursos avançados como gestão de estado.
Svelte
O Svelte é um framework de código aberto criado por Rich Harris em 2016. Diferente dos anteriores, ele trabalha como um compilador, que transforma os componentes em JavaScript enxuto durante o build.
Dessa forma, o código gerado atualiza o DOM diretamente quando o estado da aplicação muda. Com isso, os arquivos transferidos ficam menores e o desempenho no cliente melhora.
Bootstrap
O Bootstrap é um framework de código aberto desenvolvido por Mark Otto e Jacob Thornton, lançado em 2011 e criado originalmente dentro do Twitter. Ele fornece componentes de front-end com HTML, CSS e JavaScript.
O foco do Bootstrap está em sites responsivos, que ajustam o layout de acordo com o dispositivo. Para isso, ele oferece variáveis e mixins Sass, um sistema de grid responsivo, componentes prontos e plugins JavaScript.
Ember.js
O Ember.js é um framework JavaScript de código aberto, desenvolvido por Yehuda Katz e lançado em 2011. Ele segue uma arquitetura próxima do MVVM e também permite criar aplicações para dispositivos móveis e desktop.
Além disso, o Ember possui o Ember CLI, que gera código automaticamente e organiza os arquivos do projeto. O ambiente traz reconstrução rápida, recarregamento automático e recursos para execução de testes.
Como escolher um framework
Com tantas opções, a escolha raramente depende só de gosto pessoal. Primeiro, considere a linguagem que o time domina e o tipo de aplicação que você vai construir.
Em seguida, avalie a maturidade do projeto, o tamanho da comunidade e a qualidade da documentação. Um framework sem manutenção ativa vira um risco técnico com o passar dos anos, como mostra o fim do suporte ao AngularJS.
Também vale observar o grau de opinião de cada ferramenta. Frameworks mais opinativos aceleram o início do projeto, enquanto opções minimalistas, como o Express, dão mais liberdade e exigem mais decisões.
Por fim, lembre que todo framework cobra um preço em aprendizado e acoplamento. Portanto, entenda os fundamentos da linguagem antes, para não depender da ferramenta para tudo.
Conclusão
Um framework é uma base reutilizável que define a arquitetura, o fluxo de controle e os pontos de extensão de uma aplicação. Ele economiza tempo porque entrega prontas as partes que se repetem em todo projeto do mesmo domínio.
A principal diferença para uma biblioteca está na inversão de controle: você chama a biblioteca, mas o framework chama o seu código. Além disso, conceitos como hot spots, frozen spots e injeção de dependência ajudam a entender como ele se organiza por dentro.
Se você está começando, invista primeiro nos fundamentos da linguagem. No caso do C#, o curso Fundamentos do C# prepara a base antes de você mergulhar em qualquer framework do ecossistema .NET.
FAQ
Qual a diferença entre framework e biblioteca?
Na biblioteca, o seu código chama os recursos quando precisa. No framework, ocorre a inversão de controle e é ele quem chama o seu código.
O que são hot spots e frozen spots?
Hot spots são os pontos genéricos que você adapta à aplicação. Frozen spots são a arquitetura fixa, igual em todas as aplicações que usam o framework.
React é um framework ou uma biblioteca?
O próprio projeto React se define como uma biblioteca para interfaces de usuário. Na prática, ele costuma compor stacks junto com frameworks como o Next.js.
O ASP.NET ainda depende do Windows?
O ASP.NET clássico depende do .NET Framework e do Windows. Já o ASP.NET Core é multiplataforma e roda em Windows, Linux e macOS.
Preciso aprender um framework para conseguir emprego?
Na maioria das vagas, sim, mas os fundamentos da linguagem vêm antes. Um bom domínio da base torna o aprendizado de qualquer framework mais rápido.