• Nenhum resultado encontrado

Projeto de Sistemas com Frameworks

N/A
N/A
Protected

Academic year: 2021

Share "Projeto de Sistemas com Frameworks"

Copied!
50
0
0

Texto

(1)

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

(2)

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?  

(3)

INTRODUÇÃO  

(4)

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.  

(5)

•  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

(6)

Generalizando  por  meio  de  parâmetros  

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.

(7)

Generalizando  por  meio  de  parâmetros  

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;

(8)

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.  

Um framework é um conjunto de classes que cooperam para formar um

projeto reutilizável para uma classe específica de aplicativos.

(9)

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.  

(10)

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.  

(11)

MAPEAMENTO  OBJETO/

RELACIONAL  

(12)

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

.  

(13)

Mapeamento  Objeto/Relacional  

•  Classes;  

•  Objetos;  

•  Atributos;  

•  Associações.  

•  Tabelas;  

•  Linhas  (tuplas);  

•  Colunas;  

•  Chaves.  

Linguagem OO

BD Relacional

BD

Nome

Email

Senha

(14)

Mapeamento  Objeto/Relacional  

•  Classes;  

•  Objetos;  

•  Atributos;  

•  Associações.  

•  Tabelas;  

•  Linhas  (tuplas);  

•  Colunas;  

•  Chaves.  

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.

(15)

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);  

(16)

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  

(17)

Alguns  frameworks  ORM  para  Java  

(18)

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.  

(19)

Exemplo:  uma  classe  com  JPA  

@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. */

(20)

Exemplo:  configuração  JPA  (EclipseLink)  

<?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>

(21)

Exemplo:  operações  nos  dados  

// 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. */

(22)

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.  

(23)

INJEÇÃO  DE  DEPENDÊNCIAS  

(24)

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?  

Interface

gráfica

Lógica de

negócio

Aceso a

dados

Envia entrada

(25)

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.  

(26)

Exemplo:  agência  de  viagens  

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.

(27)

Segundo:  inverta  o  controle  

•  Inversion  of  Control  (IoC);  

•  Dependency  Injec.on  (DI).  

(28)

Alguns  frameworks  de  DI  para  Java  

Silk DI

Pico

Container

(29)

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;  

(30)

Exemplo:  EJBs  e  CDI  

/* 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... */

(31)

Exemplo:  EJBs  e  CDI  

@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... */

}

(32)

CONTROLADORES  FRONTAIS  

(MVC/WEB)  

(33)

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.  

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.

%>

(34)

Modelo  2:  Front  Controller  

Baseado

 na  arquitetura  

MVC

 (Model-­‐View-­‐Controller).  

Lógica de

apresentação

(interface gráfica)

(35)

Alguns  frameworks  MVC  para  Java  

(36)

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.  

(37)

Exemplo:  formulário  JSF  

<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>

(38)

Exemplo:  classe  de  ação  

@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,

(39)

Exemplo:  resultado  para  menores  de  idade  

<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}"

/>

(40)

<html ...>

#{acaoCadastro}

@Model

public class

AcaoCadastro {

@EJB

private

AplCadastro

public class

Usuario {

/* ... */

}

@Stateful @SessionScoped

public

class

AplCadastro {

@EJB

private

UsuarioDAO

usuarioDAO; }

@Stateless

public

class

UsuarioDAOJPA

{

@PersistenceContext

private

EntityManager em; }

Request

Session

Application

(41)

PROJETO  (DESIGN)  COM  

FRAMEWORKS  

(42)

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;  

(43)

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.  

(44)
(45)
(46)
(47)
(48)
(49)
(50)

hHp://nemo.inf.ufes.br/  

vitorsouza@inf.ufes.br

 

Referências

Documentos relacionados

Entendendo, então, como posto acima, propõe-se, com este trabalho, primeiramente estudar a Lei de Busca e Apreensão para dá-la a conhecer da melhor forma, fazendo o mesmo com o

A variação do pH da fase móvel, utilizando uma coluna C8 e o fluxo de 1,2 mL/min, permitiu o ajuste do tempo de retenção do lupeol em aproximadamente 6,2 minutos contribuindo para

Contudo, não é possível imaginar que essas formas de pensar e agir, tanto a orientada à Sustentabilidade quanto a tradicional cartesiana, se fomentariam nos indivíduos

Este presente artigo é o resultado de um estudo de caso que buscou apresentar o surgimento da atividade turística dentro da favela de Paraisópolis, uma

Todo ser humano é único e, por isso, toda sala de aula é um berço de diversidade. O que os sistemas educacionais fizeram ao longo dos tempos foi homogeneizar o sistema educacional

As principais indicações para a realização foram a suspeita de tuberculose (458 pacientes) e uso de imunobiológicos (380 pacientes).. A maior prevalência de resultado positivo

No caso de uma apresentação de Artigo em formato Áudio, o arquivo deverá ser enviado em CD por correio postal para:.. Comitê Editorial INFEIES - RM

- Se o estagiário, ou alguém com contacto direto, tiver sintomas sugestivos de infeção respiratória (febre, tosse, expetoração e/ou falta de ar) NÃO DEVE frequentar