Post on 14-Feb-2019
Projeto de Sistemas com
Frameworks
Vítor E. Silva Souza
(vitorsouza@inf.ufes.br) http://www.inf.ufes.br/~ vitorsouza
Departamento de Informática
Universidade Federal do Espírito Santo
O que vamos discu.r hoje • O que são frameworks?
– De mapeamento objeto/relacional? – De injeção de dependências? – Controladores Frontais/MVC? – Etc.?
• Por que u.lizá-‐los no desenvolvimento de uma aplicação? • Por que considerá-‐los já na fase de projeto? • FrameWeb.
Fevereiro 2012 Projeto de Sistemas com Frameworks 2
INTRODUÇÃO Projeto de Sistemas com Frameworks
Fevereiro 2012 Projeto de Sistemas com Frameworks 3
Funcionalidades de um sistema
• Cadastrar um usuário; • Pesquisar um livro pelo nome;
• Agendar uma reunião; • Calcular o valor de uma multa;
• Localizar um endereço em um mapa;
• Etc.
• Inserir/recuperar/alterar objetos em uma base de dados;
• Responder a requisições feitas por navegadores Web;
• Obter instâncias de objetos cujos serviços são necessários;
• Etc.
Fevereiro 2012 Projeto de Sistemas com Frameworks 4
Negócio Infraestrutura
• Inserir/recuperar/alterar objetos em uma base de dados;
• Responder a requisições feitas por navegadores Web;
• Obter instâncias de objetos cujos serviços são necessários;
• Etc.
Infraestrutura
Genéricas: se aplicam a
qualquer sistema
• Cadastrar um usuário; • Pesquisar um livro pelo nome;
• Agendar uma reunião; • Calcular o valor de uma multa;
• Localizar um endereço em um mapa;
• Etc.
Negócio
Específicas: dependem
da aplicação
Funcionalidades de um sistema
Fevereiro 2012 Projeto de Sistemas com Frameworks 5
Generalizando por meio de parâmetros
Fevereiro 2012 Projeto de Sistemas com Frameworks 6
INSERT INTO Usuario (nome, email, senha) VALUES (?, ?, ?)
INSERT INTO Livro (nome, isbn) VALUES (?, ?)
INSERT INTO Autor (nome) VALUES (?)
INSERT INTO <nome da tabela> (<nomes das colunas>) VALUES (<? separados por vírgula>)
Parâmetros
Valores relativos às colunas da tabela.
Parâmetros - Nome da tabela; - Nomes das colunas da
tabela; - Valores relativos às
colunas da tabela.
...
Generalizando por meio de parâmetros
Fevereiro 2012 Projeto de Sistemas com Frameworks 7
BD
Criar o esquema
Armazenar objetos
Efetuar consultas
Parâmetros - Nomes das tabelas (default: nome da classe); - Nomes das colunas (default: nome dos atributos); - Objetos a serem armazenados; - Parâmetros das consultas; - Etc.
o Aumentam a produ.vidade: código pronto;
o Simplificam o sistema: foco na lógica de negócio;
o Promovem sobware robusto: código testado, melhores prá.cas;
Frameworks
• Requerem uma curva de aprendizado;
• Constringem a solução a um molde (mesmo que parametrizado);
• Não se aplicam a todas as situações.
Fevereiro 2012 Projeto de Sistemas com Frameworks 8
Um framework é um conjunto de classes que cooperam para formar um projeto reutilizável para uma classe específica de aplicativos.
Eric Gamma
Tipos de frameworks • Mapeamento objeto/relacional; • Injeção de dependências; • Controlador frontal / MVC / Web; • Decorador; • Programação Orientada a Aspectos; • Auten.cação; • Busca; • Logging; • Etc. • Etc. • Etc.
Fevereiro 2012 Projeto de Sistemas com Frameworks 9
Arquiteturas baseadas em containers • Containers são servidores que gerenciam o ciclo de vida de
certos objetos; • Em Java, existe a plataforma Java Enterprise Edi.on
(recentemente, foram adicionados perfis ao Java EE); • Componentes do Java EE funcionam como frameworks:
– JPA: mapeamento objeto/relacional; – CDI: injeção de dependências; – JSF: controlador frontal; – Facelets: decorador; – Etc.
• Muitos deles foram baseados em frameworks.
Fevereiro 2012 Projeto de Sistemas com Frameworks 10
MAPEAMENTO OBJETO/RELACIONAL
Projeto de Sistemas com Frameworks
Fevereiro 2012 Projeto de Sistemas com Frameworks 11
Incompa.bilidade de paradigmas • Bancos de dados relacionais são muito populares; • Representação tabular vs. grafo de objetos; • Problemas:
– Granularidade limitada a tabela e coluna; – Herança: armazenamento e polimorfismo; – Iden.dade: == vs. equals() vs. chave primária; – Associações: transposições de chave; – Navegação no grafo de objetos: o problema dos N+1 SELECTs.
• Custo: – Repe.ção de estruturas em comandos SELECT, INSERT, etc.; – Modelo de objetos “torcido” para se adequar; – Sobware de diqcil manutenção.
Fevereiro 2012 Projeto de Sistemas com Frameworks 12
Mapeamento Objeto/Relacional
• Classes; • Objetos; • Atributos; • Associações.
• Tabelas; • Linhas (tuplas); • Colunas; • Chaves.
Fevereiro 2012 Projeto de Sistemas com Frameworks 13
Linguagem OO BD Relacional
BD
Nome Email Senha
Usuario
Mapeamento Objeto/Relacional
• Classes; • Objetos; • Atributos; • Associações.
• Tabelas; • Linhas (tuplas); • Colunas; • Chaves.
Fevereiro 2012 Projeto de Sistemas com Frameworks 14
Linguagem OO BD Relacional
BD Mapeamento Objeto/Relacional
Object/Relational Mapping (ORM)
Persistência automática e transparente de objetos de um aplicativo OO para tabelas em um banco de dados relacional, utilizando meta-dados que descrevem o mapeamento entre os objetos e o banco de dados. Em essência, transforma dados de
uma representação para a outra. Christian Bauer and Gavin King
Componentes de uma solução ORM • API para efe.vação de operações CRUD; • Linguagem ou API para construção de consultas que se
refiram às classes ou suas propriedades; • Mecanismo de especificação dos meta-‐dados de
mapeamento; • Técnicas de interação com o BD relacional, incluindo:
– Verificação de objetos sujos (dirty checking); – Associações recuperadas sob demanda (lazy associa.on fetching);
– Outras funções de o.mização.
Fevereiro 2012 Projeto de Sistemas com Frameworks 15
o Elimina grande parte do código de infraestrutura;
o Reduz manutenção por alteração nos dados;
o Maior desempenho, dado o foco do framework;
o Independência de fornecedor de BD.
Vantagens e desvantagens
• Requerem uma curva de aprendizado;
• Para serem bem usados, requerem conhecimento de SQL e BD relacionais;
• Problemas causados por seu uso são mais complexos;
• Não se aplicam a todas as situações.
Fevereiro 2012 Projeto de Sistemas com Frameworks 16
Alguns frameworks ORM para Java
Fevereiro 2012 Projeto de Sistemas com Frameworks 17
E outros...
O padrão Java EE: JPA • Java Persistence API; • Versão atual: 2.0 (JSR 317); • Implementações:
– BatooJPA; – DataNucleus; – EclipseLink; – JBoss Hibernate; – ObjectDB; – OpenJPA.
Fevereiro 2012 Projeto de Sistemas com Frameworks 18
Exemplo: uma classe com JPA
Fevereiro 2012 Projeto de Sistemas com Frameworks 19
@Entity public class Funcionario { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id;
@Version @Column(nullable = false) private Long version; private String nome; private String login; private String senha;
@ElementCollection(fetch = FetchType.EAGER) private Set<Funcao> funcoes; /* Getters e setters. */ }
Exemplo: configuração JPA (EclipseLink)
Fevereiro 2012 Projeto de Sistemas com Frameworks 20
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" ...> <persistence-unit name="SisContrAm-ejbPU" transaction-type="JTA"> <provider> org.eclipse.persistence.jpa.PersistenceProvider
</provider> <jta-data-source>SisContrAm-ds</jta-data-source> <properties> <property name="eclipselink.ddl-generation" value="create-tables"/> </properties>
</persistence-unit> </persistence>
Exemplo: operações nos dados
Fevereiro 2012 Projeto de Sistemas com Frameworks 21
// Recuperando todos os objetos Funcionario. EntityManager em = /* Obtém o EM de alguma forma. */ CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); cq.select(cq.from(Funcionario.class)); return em.createQuery(cq).getResultList();
// Idem, utilizando JPQL. EntityManager em = /* Obtém o EM de alguma forma. */ Query q = em.createQuery("SELECT f FROM Funcionario f"); Return q.getResultList();
// Salvando um funcionário. Funcionario obj = /* Obtém o objeto de alguma forma. */ EntityManager em = /* Obtém o EM de alguma forma. */ em.persist(obj); // Excluindo um funcionário. Funcionario obj = /* Obtém o objeto de alguma forma. */ EntityManager em = /* Obtém o EM de alguma forma. */ em.remove(obj);
Objetos de Acesso a Dados • Data Access Object, ou DAO; • Classe específica para operações de persistência:
– Salvar; – Excluir; – Recuperar por ID; – Listar todos; – Pesquisar com filtro; – Etc.
• Separa a lógica de acesso a dados, facilitando a manutenção e os testes unitários.
Fevereiro 2012 Projeto de Sistemas com Frameworks 22
INJEÇÃO DE DEPENDÊNCIAS Projeto de Sistemas com Frameworks
Fevereiro 2012 Projeto de Sistemas com Frameworks 23
Ligação entre componentes • Modularidade e coesão: caracterís.cas desejadas; • Separação de responsabilidades:
– Lógica de negócio; – Acesso a dados; – Interface gráfica com o usuário; – Etc.
• Cria-‐se uma cadeia de dependências:
• Problema: como conectar as dependências mantendo baixo acoplamento entre as camadas?
Fevereiro 2012 Projeto de Sistemas com Frameworks 24
Interface gráfica
Lógica de negócio
Aceso a dados
Envia entrada do usuário
Recupera/salva dados no BD
Primeiro: programe para interfaces... • ... e não para implementações; • Para um baixo acoplamento, ao usar um serviço:
– Precisamos saber os parâmetros a fornecer (pré-‐condição); – Precisamos saber o resultado que será gerado (pós-‐condição); – Não precisamos saber como o resultado será gerado.
Fevereiro 2012 Projeto de Sistemas com Frameworks 25
Exemplo: agência de viagens
Fevereiro 2012 Projeto de Sistemas com Frameworks 26
Parte gerenciada pelo controlador frontal (veremos a seguir)
Interface define os métodos de persistência disponíveis
Implementação não é acessada diretamente pela classe cliente.
Segundo: inverta o controle
Fevereiro 2012 Projeto de Sistemas com Frameworks 27
• Inversion of Control (IoC); • Dependency Injec.on (DI).
Alguns frameworks de DI para Java
Fevereiro 2012 Projeto de Sistemas com Frameworks 28
Silk DI
PicoContainer
E outros...
O padrão Java EE: CDI • Contexts and Dependency Injec.on for the Java EE plaxorm; • Versão atual: 1.0 (JSR 299); • Implementações:
– Weld (Seam Framework); – Resin CanDI; – Apache OpenWebBeans.
Fevereiro 2012 Projeto de Sistemas com Frameworks 29
Exemplo: EJBs e CDI
Fevereiro 2012 Projeto de Sistemas com Frameworks 30
/* Arquivo: PacoteTuristicoDAO.java */ @Local public interface PacoteTuristicoDAO { long recuperarContagem(); List<PacoteTuristico> recuperarTodos();
List<PacoteTuristico> recuperarAlguns(int[] intervalo); PacoteTuristico recuperarPorId(Long id); PacoteTuristico salvar(PacoteTuristico objeto); void excluir(PacoteTuristico objeto); }
/* Arquivo: PacoteTuristicoDAO.java */ @Stateless public class PacoteTuristicoDAOJPA2 implements PacoteTuristicoDAO { @PersistenceContext private EntityManager em; /* Implementação dos métodos declarados na interface... */ }
Exemplo: EJBs e CDI
Fevereiro 2012 Projeto de Sistemas com Frameworks 31
@Stateful @LocalBean @Model public class CadastrarPacotes { @EJB private PacoteTuristicoDAO pacoteTuristicoDAO;
@Inject private Localizacao loc; private List<PacoteTuristico> pacotes; @Inject
void carregarPacotes() { pacotes = pacoteTuristicoDAO.recuperarTodos(); } /* Resto da classe... */ }
CONTROLADORES FRONTAIS (MVC/WEB)
Projeto de Sistemas com Frameworks
Fevereiro 2012 Projeto de Sistemas com Frameworks 32
Arquitetura de aplicações Web • Web = protocolo HTTP, requisição/resposta; • Em Java:
– Servlets (classes): inadequado para escrita HTML;
– JSPs (páginas): inadequado para lógica de negócio.
Fevereiro 2012 Projeto de Sistemas com Frameworks 33
response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.write("<html><head><title>Hello World</title></head>"); out.write("<body>" + new Date() + "</body></html>"); out.close();
<html>[...] <% Connection conn; PreparedStatement stmt; conn = BancoDados.conectar(); // [...] Lógica de negócio. %> [...]</html>
Modelo 2: Front Controller • Baseado na arquitetura MVC (Model-‐View-‐Controller).
Fevereiro 2012 Projeto de Sistemas com Frameworks 34
Lógica de apresentação (interface gráfica)
Alguns frameworks MVC para Java
Fevereiro 2012 Projeto de Sistemas com Frameworks 35
E outros...
O padrão Java EE: JSF • JavaServer Faces; • Versão atual: 2.0 (JSR 314), 2.2 (JSR 344); • Implementações:
– Oracle Mojarra; – Apache MyFaces.
• Bibliotecas de componentes: – JBoss RichFaces; – PrimeFaces; – ICEFaces; – OpenFaces; – Trinidad; – Tomahawk.
Fevereiro 2012 Projeto de Sistemas com Frameworks 36
Exemplo: formulário JSF
Fevereiro 2012 Projeto de Sistemas com Frameworks 37
<h1>Cadastro</h1> <p>Entre seus dados para se cadastrar:</p> <h:form id=”frmCadastro"> <p>Nome: <h:inputText id="nome" value="#{acaoCadastro.usuario.nome}"
size="30" /></p> <p>Data de Nascimento: <h:inputText id=”dataNascimento" value="#{acaoCadastro.usuario.dataNascimento}" size="10"> <f:convertDateTime pattern="dd/MM/yyyy" /> </h:inputText></p>
<p>E-mail: <h:inputText id="email" value="#{acaoCadastro.usuario.email}" size="20" /></p> <p>Senha: <h:inputSecret id=”senha" value="#{acaoCadastro.usuario.senha}" size="20" /></p> <p><h:commandButton action="#{acaoCadastro.cadastrar}" value=”Cadastrar" /></p> </h:form>
Exemplo: classe de ação
Fevereiro 2012 Projeto de Sistemas com Frameworks 38
@Named @SessionScoped public class AcaoCadastro { @EJB private AplCadastro aplCadastro;
private Usuario usuario = new Usuario(); private int idade; /* Getters para usuario e idade. */ public String cadastrar() {
try { aplCadastro.cadastrar(usuario); } catch (ExcecaoMenorDeIdade e) { idade = e.getIdade(); return "/cadastro/menorDeIdade.xhtml"; } return "/cadastro/sucesso.xhtml"; } }
Possui atributos nome, dataNascimento, email e senha.
Exemplo: resultado para menores de idade
Fevereiro 2012 Projeto de Sistemas com Frameworks 39
<p>Preado(a) <h:outputText value="#{acaoCadastro.usuario.nome}" />, infelizmente nosso serviço está disponível somente para maiores de
idade e, de acordo com a data de nascimento fornecida, você possui apenas <h:outputText value="#{acaoCadastro.idade}" /> anos de idade.</p>
Fevereiro 2012 Projeto de Sistemas com Frameworks 40
<html ...> #{acaoCadastro}
@Model public class AcaoCadastro { @EJB private AplCadastro
aplCadastro; }
public class Usuario { /* ... */ }
@Stateful @SessionScoped public class AplCadastro { @EJB private UsuarioDAO
usuarioDAO; }
@Stateless public class UsuarioDAOJPA { @PersistenceContext private EntityManager em; }
Request
Session Application
Juntando MVC + DI + DAO/ORM
PROJETO (DESIGN) COM FRAMEWORKS
Projeto de Sistemas com Frameworks
Fevereiro 2012 Projeto de Sistemas com Frameworks 41
Frameworks no projeto de sistemas • Frameworks são muito u.lizados na prá.ca; • Possuem um impacto considerável na arquitetura escolhida; • Inclui-‐los nos modelos de projeto:
– Faz os modelos ficarem mais próximos da implementação; – Programadores tomam menos decisões; – Promove uso de arquitetura robusta; – Aumentam a produ.vidade (com padrões de bom senso).
Fevereiro 2012 Projeto de Sistemas com Frameworks 42
FrameWeb • Um método baseado em frameworks para o projeto de
sistemas de informação Web (WIS); – Alguns modelos podem servir para sistemas não-‐Web.
• Propostas: – Uma arquitetura padrão para WISs baseados em frameworks; – Um perfil da UML para construção de quatro .pos de modelo:
• Modelo de domínio; • Modelo de persistência; • Modelo de navegação; • Modelo de aplicação.
Fevereiro 2012 Projeto de Sistemas com Frameworks 43
Arquitetura base
Fevereiro 2012 Projeto de Sistemas com Frameworks 44
Modelo de domínio
Fevereiro 2012 Projeto de Sistemas com Frameworks 45
Fevereiro 2012 Projeto de Sistemas com Frameworks 46
Modelo de persistência
Modelo de persistência
Fevereiro 2012 Projeto de Sistemas com Frameworks 47
Modelo de navegação
Fevereiro 2012 Projeto de Sistemas com Frameworks 48
Modelo de aplicação
Fevereiro 2012 Projeto de Sistemas com Frameworks 49
hHp://nemo.inf.ufes.br/ vitorsouza@inf.ufes.br
Fevereiro 2012 Projeto de Sistemas com Frameworks 50