projeto de sistemas com frameworks - inf.ufes.brvitorsouza/wp-content/uploads/teaching-br... · –...

Post on 14-Feb-2019

220 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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  

top related