Padrões de Projeto
Padrões de Projeto
Prof. Cristiano Biancardi
Prof. Cristiano Biancardi
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi no Biancardi 2 2
Introdução
Introdução
Aplicações em 2 camadas
Aplicações em 2 camadas
• Lógica de apresentação (a interface homem
máquina) e a lógica de negócio (algoritmos do
sistema – casos de uso), estão reunidos em
uma única camada.
• Modelo de Classes do Domínio do Problema
fica separado –> quando implementadas.
• Atualização eram extremamente penosas e
complexas.
Com o passar do tempo, novas restrições de tempo e custo surgiram,
Com o passar do tempo, novas restrições de tempo e custo surgiram,
além de maior concorrência.
além de maior concorrência.
Necessidade de um modelo que permitisse maior produtividade e
Necessidade de um modelo que permitisse maior produtividade e
desenvolvimento de aplicações mais confiáveis.
desenvolvimento de aplicações mais confiáveis.
Surgiram os padrões de desenvolvimento em 3 ou mais camadas.
Surgiram os padrões de desenvolvimento em 3 ou mais camadas.
Vantagens:
Vantagens:
•
Reusabilidade
Reusabilidade
O mesmo modelo pode ser usado com diferentes visões (ou aplicações diferentes).
O mesmo modelo pode ser usado com diferentes visões (ou aplicações diferentes).
Confiabilidade: modelo pronto e testado
Confiabilidade: modelo pronto e testado
•
Clareza e Modularidade de projeto.
Clareza e Modularidade de projeto.
•
Manutenção facilitada
Manutenção facilitada
Torna o sistema mais flexível, de modo que partes podem ser
alteradas independentemente.
• Necessário apenas a definição da interface contratual a ser usada.Necessário apenas a definição da interface contratual a ser usada.
Qualquer alteração em uma determinada camada não influi nas
demais, desde que o mecanismo de comunicação entre elas
permanece inalterado.
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
4
4
Projetar software é uma tarefa difícil. A maioria dos projetistas é capaz
Projetar software é uma tarefa difícil. A maioria dos projetistas é capaz
de compreender conceitos como classes, objetos, interfaces e herança.
de compreender conceitos como classes, objetos, interfaces e herança.
O desafio reside em aplicá-los para construir software flexível e
O desafio reside em aplicá-los para construir software flexível e
reutilizável.
reutilizável.
Projetistas novatos tendem a se perder com as muitas opções
Projetistas novatos tendem a se perder com as muitas opções
disponíveis e a recorrer a técnicas não orientadas a objetos com as
disponíveis e a recorrer a técnicas não orientadas a objetos com as
quais têm certa familiaridade.
quais têm certa familiaridade.
Projetistas experientes, por sua vez, tendem a fazer bons projetos. Eles
Projetistas experientes, por sua vez, tendem a fazer bons projetos. Eles
sabem que não se deve resolver todo e qualquer problema partindo de
sabem que não se deve resolver todo e qualquer problema partindo de
princípios básicos (classes, objetos, herança, relacionamentos,
princípios básicos (classes, objetos, herança, relacionamentos,
agregação,...).
agregação,...).
Ao contrário, deve-se buscar reutilizar soluções que funcionaram no
Ao contrário, deve-se buscar reutilizar soluções que funcionaram no
passado. Esta é a motivação para o estudo de padrões de projeto, ou
passado. Esta é a motivação para o estudo de padrões de projeto, ou
design patterns
design patterns
.
.
Assim, um padrão é um par nomeado problema/solução, que pode
Assim, um padrão é um par nomeado problema/solução, que pode
ser utilizado em novos contextos, com orientações sobre com
ser utilizado em novos contextos, com orientações sobre com
utilizá-lo em novas situações.
utilizá-lo em novas situações.
Padrões são destilações de sabedoria acumulada, fornecendo
Padrões são destilações de sabedoria acumulada, fornecendo
um jargão-padrão e nomeando os conceitos que praticantes
um jargão-padrão e nomeando os conceitos que praticantes
experimentados aplicam.
experimentados aplicam.
Cada padrão sistematicamente nomeia, explica e avalia um
Cada padrão sistematicamente nomeia, explica e avalia um
importante projeto que ocorre repetidamente em sistemas OO.
importante projeto que ocorre repetidamente em sistemas OO.
•
O objetivo de um
O objetivo de um
design pattern
design pattern
é registrar uma experiência no projeto
é registrar uma experiência no projeto
de software OO, na forma de um padrão passível de ser efetivamente
de software OO, na forma de um padrão passível de ser efetivamente
utilizado por projetistas.
utilizado por projetistas.
Um projetista familiarizado com padrões de projeto pode aplicá-los
Um projetista familiarizado com padrões de projeto pode aplicá-los
diretamente a problemas de projeto sem ter que redescobrir
diretamente a problemas de projeto sem ter que redescobrir
abstrações e os objetos que as capturam.
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
6
6
Em geral, um padrão tem quatro elementos essenciais:
Em geral, um padrão tem quatro elementos essenciais:
•
Nome
Nome
: identificação de uma ou duas palavras, que se possa utilizar
: identificação de uma ou duas palavras, que se possa utilizar
para descrever o problema de projeto, suas soluções e
para descrever o problema de projeto, suas soluções e
conseqüências.
conseqüências.
•
Problema
Problema
: descreve quando aplicar o padrão. Explica o problema
: descreve quando aplicar o padrão. Explica o problema
de projeto e seu contexto.
de projeto e seu contexto.
•
Solução
Solução
: descreve os elementos que compõem o projeto, seus
: descreve os elementos que compõem o projeto, seus
relacionamentos, responsabilidades e colaborações.
relacionamentos, responsabilidades e colaborações.
Não
Não
descreve
descreve
um particular projeto concreto ou implementação.
um particular projeto concreto ou implementação.
Um padrão provê uma descrição abstrata de um problema de projeto e
Um padrão provê uma descrição abstrata de um problema de projeto e
como uma organização geral de classes e objetos resolve este problema.
como uma organização geral de classes e objetos resolve este problema.
•
Conseqüências
Conseqüências
: são os resultados e os comprometimentos feitos
: são os resultados e os comprometimentos feitos
ao se aplicar o padrão, tais como, bibliotecas de classes necessárias,
ao se aplicar o padrão, tais como, bibliotecas de classes necessárias,
que problemas acarreta, etc.
A sigla “GoF”
A sigla “GoF”
•
“
“
Gang of Four”
Gang of Four”
•
Apelido carinhoso pela qual o quarteto Erich Gamma,
Apelido carinhoso pela qual o quarteto Erich Gamma,
Richard Helm, Ralph Johnson e John Vlissides ficou
Richard Helm, Ralph Johnson e John Vlissides ficou
conhecido quando escreveram o livro “Design
conhecido quando escreveram o livro “Design
Patterns”, no início da década de 90
Patterns”, no início da década de 90
•
Neste livro, os quatro dividiram um conjunto de 23
Neste livro, os quatro dividiram um conjunto de 23
padrões em 3 grupos:
padrões em 3 grupos:
Estruturais:
Estruturais:
lidam com maneiras de se compor
lidam com maneiras de se compor
objetos.
objetos.
Comportamentais:
Comportamentais:
caracterizam formas de
caracterizam formas de
interação entre objetos.
interação entre objetos.
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
8
Observer
Observer
Observador
Observador
Intenção
Intenção
•
Definir uma dependência um-para-muitos entre objetos de
Definir uma dependência um-para-muitos entre objetos de
forma que quando um objeto muda de estado, todos seus
forma que quando um objeto muda de estado, todos seus
dependentes são notificados e atualizados automaticamente.
dependentes são notificados e atualizados automaticamente.
Aplicação
Aplicação
•
Mudar um objeto causando mudanças em outros objetos,
Mudar um objeto causando mudanças em outros objetos,
sendo que não se sabe a priori quantos objetos precisam ser
sendo que não se sabe a priori quantos objetos precisam ser
mudados.
mudados.
•
Fazer um objeto notificar outros objetos de que seu estado
Fazer um objeto notificar outros objetos de que seu estado
mudou, sem assumir nada sobre os outros objetos.
mudou, sem assumir nada sobre os outros objetos.
•
Exemplo:
Exemplo:
Fundos múltiplos investem em ações, de modo que quando o preço de
Fundos múltiplos investem em ações, de modo que quando o preço de
uma ação muda, todos os fundos que investem nessa açao são
uma ação muda, todos os fundos que investem nessa açao são
afetados.
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
10
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi no Biancardi 12 12
MVC
MVC
•
Com o aumento da complexidade das aplicações
Com o aumento da complexidade das aplicações
desenvolvidas torna-se fundamental a separação entre os
desenvolvidas torna-se fundamental a separação entre os
dados (
dados (
Model
Model
) e o layout (
) e o layout (
View
View
).
).
•
Desta forma, alterações feitas no layout não afetam a
Desta forma, alterações feitas no layout não afetam a
manipulação de dados, e estes poderão ser reorganizados sem
manipulação de dados, e estes poderão ser reorganizados sem
alterar o layout.
alterar o layout.
•
Um dos primeiros padrões identificados na área de software foi
Um dos primeiros padrões identificados na área de software foi
o modelo MVC:
o modelo MVC:
Model (Modelo)
Model (Modelo)
View (Visão)
View (Visão)
Motivação:
Motivação:
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
14
14
Diferença
Diferença
•
Separação em camadas
Separação em camadas
•
Relacionamento entre as camadas
Relacionamento entre as camadas
•
Separado em camadas, é possível
Separado em camadas, é possível
estabelecer interação.
•
Model:
Model:
responsável pelo armazenamento e
responsável pelo armazenamento e
manutenção dos dados utilizados pela aplicação.
manutenção dos dados utilizados pela aplicação.
Modelo de classes proveniente da fase de análise
Modelo de classes proveniente da fase de análise
•
View:
View:
é a camada responsável pela interface com
é a camada responsável pela interface com
o usuário.
o usuário.
•
Controller: t
Controller: t
rata os eventos de interação com o
rata os eventos de interação com o
usuário e, normalmente, invoca as mudanças no
usuário e, normalmente, invoca as mudanças no
modelo.
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
16
16
Relação entre
Relação entre
Model, View e
Model, View e
Controller
Controller
•
Linhas sólidas
Linhas sólidas
indicam associação
indicam associação
direta / Chamada
direta / Chamada
de métodos
de métodos
•
Linhas tracejadas
Linhas tracejadas
indicam associação
indicam associação
indireta / Eventos
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi no Biancardi 18 18
Funcionamento:
Funcionamento:
•
A visão
A visão
Parte usada para transformar e preparar os dados do
Parte usada para transformar e preparar os dados do
modelo para que possam ser apresentados de
modelo para que possam ser apresentados de
alguma forma (HTML, swing etc).
alguma forma (HTML, swing etc).
O controlador retira os dados do modelo e os entrega
O controlador retira os dados do modelo e os entrega
para a visão (ou retira dados da interface e alimenta
para a visão (ou retira dados da interface e alimenta
o modelo).
o modelo).
Esta, por sua vez, alimenta templates com estes
Esta, por sua vez, alimenta templates com estes
dados para que possam ser apresentados ao usuário.
dados para que possam ser apresentados ao usuário.
Além disso, efetua-se algum tratamento do tipo:
Além disso, efetua-se algum tratamento do tipo:
•
Verificação de campos obrigatórios
Verificação de campos obrigatórios
•
O modelo
O modelo
Parte que encapsula os dados da aplicação.
Parte que encapsula os dados da aplicação.
Fornecer rotinas para administrar e manipular dados.
Fornecer rotinas para administrar e manipular dados.
•
Deve conter métodos para adicionar, eliminar e atualizar
Deve conter métodos para adicionar, eliminar e atualizar
informações dos objetos na base de dados.
informações dos objetos na base de dados.
•
Também deve conter métodos para obter a lista de objetos
Também deve conter métodos para obter a lista de objetos
existentes.
existentes.
De modo geral, a técnica de acesso aos dados deve ser
De modo geral, a técnica de acesso aos dados deve ser
encapsulada no modelo.
encapsulada no modelo.
•
Desta forma, se uma aplicação for transferida de um
Desta forma, se uma aplicação for transferida de um
sistema que usa banco de dados para um sistema que usa
sistema que usa banco de dados para um sistema que usa
arquivos texto para guardar as informações, o único
arquivos texto para guardar as informações, o único
elemento que precisa ser alterado será o modelo
elemento que precisa ser alterado será o modelo
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
20
20
•
O controlador
O controlador
Responsável pelas respostas às ações dos
Responsável pelas respostas às ações dos
usuários.
usuários.
No caso de uma aplicação desktop, uma
No caso de uma aplicação desktop, uma
ação de usuário (geralmente) é a solicitação
ação de usuário (geralmente) é a solicitação
de uma consulta aos dados de um cliente.
de uma consulta aos dados de um cliente.
O controlador é acionado pela Visão e vai
O controlador é acionado pela Visão e vai
responder de acordo, fazendo com que o
responder de acordo, fazendo com que o
Modelo manipule os dados necessários
Modelo manipule os dados necessários
(consulta o cliente no banco e monta o
(consulta o cliente no banco e monta o
objeto que o representa).
Estrutura
Estrutura
Modelo
Visão
Controle
Eventos
Invoca os métodos públicos
Invoca os métodos públicos para
pesquisa o estado do modelo
Estimula o sistema
Acessa a base de dados
Invoca Métodos
Notifica a Visão
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
22
22
Onde colocar regras de negócio?
Onde colocar regras de negócio?
•
A)No Controller, deixando o Model apenas como
A)No Controller, deixando o Model apenas como
representação do negócio (objetos com get e
representação do negócio (objetos com get e
set)
set)
•
B)Fazer com que o Model seja representação do
B)Fazer com que o Model seja representação do
negócio unido com as regras da aplicação
negócio unido com as regras da aplicação
também (por exemplo, uma lógica de venda), e
também (por exemplo, uma lógica de venda), e
o Controller fica encarregado apenas de
o Controller fica encarregado apenas de
controlar o fluxo entre as camadas.
controlar o fluxo entre as camadas.
Dica: usar B.
Dica: usar B.
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
24
24
Desvantagens
Desvantagens
•
Complexidade adicional, só justificável
Complexidade adicional, só justificável
em aplicações de médio e grande
em aplicações de médio e grande
porte.
porte.
Não é aconselhável para pequenas
Não é aconselhável para pequenas
aplicações.
aplicações.
•
Requer uma quantidade maior de
Requer uma quantidade maior de
tempo para analisar e modelar o
tempo para analisar e modelar o
sistema.
sistema.
Ver códigos:
Ver códigos:
MVC1
MVC1
•
http://www.dsc.ufcg.edu.br/~jacques/cursos/map
http://www.dsc.ufcg.edu.br/~jacques/cursos/map
/html/arqu/mvc/mvc.htm
8.1 Transformação de
8.1 Transformação de
classes de análise em
classes de análise em
classes de projeto
classes de projeto
Especificação de classes de
Especificação de classes de
fronteira
fronteira
N
N
ão devemos atribuir a essas classes responsabilidades
ão devemos atribuir a essas classes responsabilidades
relativas à lógica do negócio.
relativas à lógica do negócio.
•
Classes de fronteira devem apenas servir como um ponto de
Classes de fronteira devem apenas servir como um ponto de
captação de informações, ou de apresentação de informações
captação de informações, ou de apresentação de informações
que o sistema processou.
que o sistema processou.
•
A única inteligência que essas classes devem ter é a que
A única inteligência que essas classes devem ter é a que
permite a elas realizarem a comunicação com o ambiente do
permite a elas realizarem a comunicação com o ambiente do
sistema.
sistema.
Há diversas razões para isso
Há diversas razões para isso
:
:
•
Em primeiro lugar, se o sistema tiver que ser implantado em
Em primeiro lugar, se o sistema tiver que ser implantado em
outro ambiente, as modificações resultantes sobre seu
outro ambiente, as modificações resultantes sobre seu
funcionamento propriamente dito seriam mínimas.
funcionamento propriamente dito seriam mínimas.
•
Além disso, o sistema pode dar suporte a diversas formas de
Além disso, o sistema pode dar suporte a diversas formas de
interação com seu ambiente (e.g., uma interface gráfica e uma
interação com seu ambiente (e.g., uma interface gráfica e uma
interface de texto).
interface de texto).
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi no Biancardi 28 28
Especificação de classes de
Especificação de classes de
fronteira
fronteira
Durante a análise, considera-se que há uma única classe de
Durante a análise, considera-se que há uma única classe de
fronteira para cada ator.
fronteira para cada ator.
No projeto, algumas dessas classes podem resultar em várias
No projeto, algumas dessas classes podem resultar em várias
outras.
outras.
Dois tipos:
Dois tipos:
•
Interface com
Interface com
seres humanos:
seres humanos
:
projeto da interface gráfica
projeto da interface gráfica
produz o
produz o
detalhamento das classes.
detalhamento das classes.
•
Outros sistemas
Outros sistemas
ou equipamentos
ou
equipamentos:
: devemos
devemos definir uma ou mais
definir uma ou mais
classes para encapsular o protocolo de comunicação.
classes para encapsular o protocolo de comunicação.
É usual a definição de um
É usual a definição de um
subsistema
subsistema
para representar a comunicação
para representar a comunicação
com outros sistemas de software ou com equipamentos.
com outros sistemas de software ou com equipamentos.
É comum nesse caso o uso do padrão Façade (mais adiante)
É comum nesse caso o uso do padrão Façade (mais adiante)
O projeto de objetos de fronteira é altamente dependente da
O projeto de objetos de fronteira é altamente dependente da
natureza do ambiente...
Especificação de classes de
Especificação de classes de
fronteira
fronteira
Clientes WEB clássicos
Clientes WEB clássicos
•
Classe
C
lasses
s
de fronteira são
de fronteira
são representada
representadas
s
por páginas HTML que, m
por páginas HTML
que, m
uitas
uitas
vezes,
vezes, representam
representam sites
sites dinâmic
dinâmico
os
s.
.
Clientes móveis
Clientes móveis
•
Classes de fronteira implement
C
lasses de fronteira implementa
am algum protocolo específico com o
m algum protocolo específico com o
ambiente.
ambiente.
Um exemplo é a WML (Wireless Markup Language).
Um exemplo é a WML (Wireless Markup Language).
Clientes stand-alone
Clientes stand-alone
•
Nesse caso, é recomendável que os desenvolvedores pesquisem os
Nesse caso, é recomendável que os desenvolvedores pesquisem os
recursos fornecidos pelo ambiente de programação sendo utilizado.
recursos fornecidos pelo ambiente de programação sendo utilizado.
Um exemplo disso é o Swing/JFC da linguagem Java.
Um exemplo disso é o Swing/JFC da linguagem Java.
Serviços WEB
Serviços WEB
(
(
WEB services
WEB services
)
)
•
Um serviço WEB é um uma forma de permitir que uma aplicação
Um serviço WEB é um uma forma de permitir que uma aplicação
forneça seus serviços (funcionalidades) através da Internet.
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi no Biancardi 30 30
Especificação de classes de
Especificação de classes de
entidade
entidade
A maioria das classes de entidade normalmente permanece na
A maioria das classes de entidade normalmente permanece na
passagem da análise ao projeto.
passagem da análise ao projeto.
•
Na verdade, classes de entidade são normalmente as primeiras classes
Na verdade, classes de entidade são normalmente as primeiras classes
a serem identificadas, na
a serem identificadas, na
análise de domínio
análise de domínio
.
.
Durante
Durante
o
o
projeto,
projeto,
um
um
aspecto importante a considerar sobre
aspecto importante a considerar sobre
classes de entidade é identificar quais delas geram objetos que
classes de entidade é identificar quais delas geram objetos que
devem ser
devem ser
persistentes
persistentes
.
.
•
Para essas classes, o seu mapeamento para algum mecanismo de
Para essas classes, o seu mapeamento para algum mecanismo de
armazenamento persistente deve ser definido
armazenamento persistente deve ser definido
(mais adiante).
(mais adiante)
.
Um aspecto importante é a forma
Um aspecto importante é a forma
de
de
representar associações,
representar associações,
agregações e composições entre objetos
agregações e composições entre objetos
de entidade
de entidade
.
.
•
Essa representação é função da
Essa representação é função da
navegabilidade
navegabilidade
e da multiplidade
e da
multiplidade
definidas para a associação (
Especificação de classes de
Especificação de classes de
entidade
entidade
Outro aspecto relevante
Outro aspecto relevante
para
para
classe
classe
s
s
de entidade
de entidade
é
é
modo como
modo como
podemos identificar cada um de seus objetos unicamente.
podemos identificar cada um de seus objetos unicamente.
•
Isso porque, principalmente em sistemas de informação, objetos de
Isso porque, principalmente em sistemas de informação, objetos de
entidade devem ser armazenados de modo
entidade devem ser armazenados de modo
persistente.
persistente
.
•
Por exemplo, um objeto da classe Aluno é unicamente identificado pelo
Por exemplo, um objeto da classe Aluno é unicamente identificado pelo
valor de sua matrícula (um atributo do domínio).
valor de sua matrícula (um atributo do domínio).
A manipulação dos diversos atributos identificadores possíveis em
A manipulação dos diversos atributos identificadores possíveis em
uma classes pode ser bastante trabalhosa.
uma classes pode ser bastante trabalhosa.
Para evitar isso, um
Para evitar isso, um
identificador de implementação
identificador de implementação
é criado
é criado
,
,
que não tem correspondente com atributo algum do domínio.
que não tem correspondente com atributo algum do domínio.
•
P
P
ossibilidade de manipular identificadores de maneira uniforme e
ossibilidade de manipular identificadores de maneira uniforme e
eficiente.
eficiente.
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi no Biancardi 32 32
Especificação de classes de
Especificação de classes de
controle
controle
Com relação às classes de controle, no projeto devemos identificar a real
Com relação às classes de controle, no projeto devemos identificar a real
utilidade das mesmas.
utilidade das mesmas.
•
Em casos de uso simples (e.g., manutenção de dados), classes de controle não
Em casos de uso simples (e.g., manutenção de dados), classes de controle não
são realmente necessárias.
são realmente necessárias.
•
Neste caso, classes de fronteira podem repassar os dados fornecidos pelos
Neste caso, classes de fronteira podem repassar os dados fornecidos pelos
atores diretamente para as classes de entidade correspondentes. (não
atores diretamente para as classes de entidade correspondentes. (não
recomendado, somente em casos extremos => eficiência!)
recomendado, somente em casos extremos => eficiência!)
Entretanto, é comum a situação em que uma classe de controle de análise
Entretanto, é comum a situação em que uma classe de controle de análise
ser transformada em duas ou mais classes no nível de projeto.
ser transformada em duas ou mais classes no nível de projeto.
•
Objetivo
Objetivo
: de evitar a criação de uma única classe com baixa coesão e
:
de evitar a criação de uma única classe com baixa coesão e
alto acoplamento.
alto acoplamento.
No refinamento de qualquer classe proveniente da análise, aplicar padrões
No refinamento de qualquer classe proveniente da análise, aplicar padrões
de projeto (
Especificação de classes de
Especificação de classes de
controle
controle
Um tipo comum de controlador é o
Um tipo comum de controlador é o
controlador de caso
controlador de caso
de uso
de uso
,
,
responsável pela coordenação da realização de um
responsável pela coordenação da realização de um
caso de uso.
caso de uso.
As
As
seguintes responsabilidades são esperadas de um
seguintes responsabilidades são esperadas de um
controlador de caso de uso:
controlador de caso de uso:
•
C
C
oordenar a realização de um caso de uso do sistema.
oordenar a realização de um caso de uso do sistema.
•
S
S
ervir como canal de comunicação entre objetos de fronteira e
ervir como canal de comunicação entre objetos de fronteira e
objetos de entidade.
objetos de entidade.
•
S
S
e comunicar com outros controladores, quando necessário.
e comunicar com outros controladores, quando necessário.
•
M
M
apear ações do usuário (ou atores de uma forma geral) para
apear ações do usuário (ou atores de uma forma geral) para
atualizações ou mensagens a serem enviadas a objetos de
atualizações ou mensagens a serem enviadas a objetos de
entidade.
entidade.
•
E
E
star apto a manipular exceções provenientes das classes de
star apto a manipular exceções provenientes das classes de
entidades.
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi no Biancardi 34 34
Especificação de classes de
Especificação de classes de
controle
controle
Alguns exemplos dos aspectos de uma aplicação
Alguns exemplos dos aspectos de uma aplicação
cuja coordenação é de responsabilidade das
cuja coordenação é de responsabilidade das
classes de controle
classes de controle
:
:
•
produção de valores para
produção de valores para
preenchimento de controles
preenchimento de controles
da interface gráfica,
da interface gráfica,
•
autenticação de usuários,
autenticação de usuários,
Especificação de outras
Especificação de outras
classes
classes
Além do refinamento de classes preexistentes, diversas
Além do refinamento de classes preexistentes, diversas
outros aspectos demanda a identificação de novas classe
outros aspectos demanda a identificação de novas classe
durante o projeto.
durante o projeto.
•
Persistência de objetos
Persistência de objetos
•
Distribuição e comunicação (e.g., RMI, CORBA, DCOM, WEB)
Distribuição e comunicação (e.g., RMI, CORBA, DCOM, WEB)
•
Autenticação/Autorização
Autenticação/Autorização
•
Logging
Logging
•
Configurações
Configurações
•
Threads
Threads
•
Classes para testes (
Classes para testes (
Test Driven Development
Test Driven Development
)
)
•
Uso de
Uso de
bibliotecas
bibliotecas
,
,
componentes
componentes
e
e
frameworks
frameworks
Conclusão: a tarefa de identificação (reuso?) de classes
Conclusão: a tarefa de identificação (reuso?) de classes
não
não
termina na análise.
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi no Biancardi 36 36
Façade
Façade
Fachada
Fachada
Provê uma interface unificada para um conjunto de classes em um
Provê uma interface unificada para um conjunto de classes em um
subsistema.
subsistema.
Define uma interface de nível mais alto para o subsistema,
Define uma interface de nível mais alto para o subsistema,
tornando-o mais fácil de ser usado.
tornando-o mais fácil de ser usado.
Facilita o trabalho em subsistemas pois são fornecidas as
Facilita o trabalho em subsistemas pois são fornecidas as
interfaces de cada subsistema.
interfaces de cada subsistema.
•
Facilita a utilização do sistema: Cliente só precisa conhecer a fachada.
Facilita a utilização do sistema: Cliente só precisa conhecer a fachada.
Promove acoplamento fraco:
Promove acoplamento fraco:
•
Pequenas mudanças no subsistema não mais afetam o cliente.
Pequenas mudanças no subsistema não mais afetam o cliente.
•
A manutenção também é facilitada!!!
A manutenção também é facilitada!!!
Facade serve para abstrair complexas chamadas de métodos em
Facade serve para abstrair complexas chamadas de métodos em
diversos componentes, facilitando o acesso a um conjunto
diversos componentes, facilitando o acesso a um conjunto
funcionalidades agrupadas. Ele permite que você consiga criar
funcionalidades agrupadas. Ele permite que você consiga criar
uma interface de simples acesso ao sistema, de fora pra dentro.
Problema:
Problema:
•
Existem circunstâncias onde é necessário
Existem circunstâncias onde é necessário
utilizar diversas classes diferentes para que
utilizar diversas classes diferentes para que
uma tarefa possa ser completada.
uma tarefa possa ser completada.
•
Caracteriza uma situação onde uma classe
Caracteriza uma situação onde uma classe
cliente necessita utilizar objetos de um
cliente necessita utilizar objetos de um
conjunto específico de classes utilitárias que,
conjunto específico de classes utilitárias que,
em conjunto, compõem um subsistema
em conjunto, compõem um subsistema
particular ou que representam o acesso a
particular ou que representam o acesso a
diversos subsistemas distintos.
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
38
Solução
Solução
•
O
O
Facade
Facade
é um padrão que pode apresentar infinidades
é um padrão que pode apresentar infinidades
de formas de representá-lo.
de formas de representá-lo.
•
O que importa para este padrão é que o Cliente apenas
O que importa para este padrão é que o Cliente apenas
acesse objetos da classe
acesse objetos da classe
Facade
Facade
, esperando algum
, esperando algum
resultado vindo dela.
resultado vindo dela.
•
A classe
A classe
Facade
Facade
é que terá a responsabilidade de entrar
é que terá a responsabilidade de entrar
em contato com as diversas instâncias dentro deste
em contato com as diversas instâncias dentro deste
sistema, efetuar possíveis cálculos vindos de classes
sistema, efetuar possíveis cálculos vindos de classes
abaixo dela e retornar as respostas que o cliente pediu.
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
40
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
42
Implementação:
Implementação:
•
Implementar um
Implementar um
Facade
Facade
demanda
demanda
definir um conjunto de operações
definir um conjunto de operações
reduzidas que permita ocultar a
reduzidas que permita ocultar a
complexidade inerente à utilização de
complexidade inerente à utilização de
várias classes de um subsistema.
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
44
44
Exemplo:
Exemplo:
•
O cliente necessita consultar várias entidades a fim de saber
O cliente necessita consultar várias entidades a fim de saber
se têm condições de receber um empréstimo. Para isso,
se têm condições de receber um empréstimo. Para isso,
normalmente, o cliente teria que conhecer toda a
normalmente, o cliente teria que conhecer toda a
complexidade envolvida com as regras de concessão de
complexidade envolvida com as regras de concessão de
empréstimos e aprende-las, no entanto, nada melhor do que
empréstimos e aprende-las, no entanto, nada melhor do que
deixar isso a cargo de quem já está no sistema, no caso o
deixar isso a cargo de quem já está no sistema, no caso o
Facade
Facade
, que irá se preocupar em colher dados das diferentes
, que irá se preocupar em colher dados das diferentes
classes que podem decidir sobre a possibilidade do
classes que podem decidir sobre a possibilidade do
empréstimo e retornará esta informação pronta para o
empréstimo e retornará esta informação pronta para o
cliente.
cliente.
•
FacadeApp
FacadeApp
é o cliente que busca informações que podem vir
é o cliente que busca informações que podem vir
de vários de subsistemas,
de vários de subsistemas,
Facade
Facade
é a classe responsável por
é a classe responsável por
acessar os subsistemas e trazer respostas de forma
acessar os subsistemas e trazer respostas de forma
transparente a quem esteja acessando o
transparente a quem esteja acessando o
Facade
Facade
.
.
Banco
Banco
,
,
Emprestimo
Emprestimo
,
,
Crédito
Crédito
e
e
Consumidor
Consumidor
são classes pertencentes
são classes pertencentes
aos subsistemas.
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
46
/* Complex parts */ class CPU {
public void freeze() { ... }
public void jump(long position) { ... } public void execute() { ... }
}
class Memory {
public void load(long position, byte[] data) { ...
} }
class HardDrive {
public byte[] read(long lba, int size) { ...
} }
/* Facade */
class ComputerFacade {
public void startComputer() { cpu.freeze();
memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE)); cpu.jump(BOOT_ADDRESS); cpu.execute(); } } /* Client */ class You {
public static void main(String[] args) {
ComputerFacade facade = new ComputerFacade (); facade.startComputer();
} }
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
48
48
Persistência em Bancos de Dados
Persistência em Bancos de Dados
Relacionais
Relacionais
•
Apresentação:
Apresentação:
5.2 - Mapeamento de objetos para o
5.2 - Mapeamento de objetos para o
modelo relacional - Cap12
modelo relacional - Cap12
MVC Estendido
MVC Estendido
•
A arquitetura MCV é um bom ponto de
A arquitetura MCV é um bom ponto de
partida.
partida.
•
Contudo, ela desconsidera um
Contudo, ela desconsidera um
importante componente: a gerência de
importante componente: a gerência de
dados.
dados.
•
Evolução do MVC:
Evolução do MVC:
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
50
50
Duas formas complementares de agrupamento de classes em
pacotes:
•Pelo domínio do problema: aproveitando os
subsistemas definidos na fase de análise => Arquitetura
do Sistema
•Por estereótipos, tendo sido utilizados os estereótipos
propostos por Coad e Yourdon [Coad93].
Atendimento Cliente
Controle Acervo
Utilitario
pacote Utilitario, trata classes
reutilizáveis em outros contextos
•
Componente do Domínio do Problema (Model)
Componente do Domínio do Problema (Model)
:
:
corresponde aos subsistemas responsáveis por implementar
corresponde aos subsistemas responsáveis por implementar
diretamente os requisitos dos usuários; (classe de análise)
diretamente os requisitos dos usuários; (classe de análise)
•
Componente de Interação Humana (View)
Componente de Interação Humana (View)
:
:
corresponde aos subsistemas que implementam as interfaces
corresponde aos subsistemas que implementam as interfaces
com o usuário; (interface gráfica, texto)
com o usuário; (interface gráfica, texto)
•
Componente de Gerência de Tarefa (Controll)
Componente de Gerência de Tarefa (Controll)
:
:
corresponde aos subsistemas responsáveis por controlar e
corresponde aos subsistemas responsáveis por controlar e
coordenar tarefas; (casos de uso)
coordenar tarefas; (casos de uso)
•
Componente de Gerência de Dados
Componente de Gerência de Dados
:
:
corresponde aos subsistemas responsáveis pelo
corresponde aos subsistemas responsáveis pelo
armazenamento e recuperação de objetos (persistência dos
armazenamento e recuperação de objetos (persistência dos
objetos). (gravação em meio secundário – BD, arquivo texto)
objetos). (gravação em meio secundário – BD, arquivo texto)
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi no Biancardi 52 52 DP_Controle Acervo GD_Controle Acervo IU_Controle Acervo UtilitarioPessoa (from Utilitario) GT_ControleAcervo UtilitarioInterfaceGrafica (from Utilitario)
Uso do p
Uso do p
adrão DAO
adrão DAO
O padrão DAO é uma forma de desacoplar as classes do negócio dos
O padrão DAO é uma forma de desacoplar as classes do negócio dos
aspectos relativos ao acesso e ao armazenamento persistente.
aspectos relativos ao acesso e ao armazenamento persistente.
•
DAO:
DAO
:
Data Access Object
Data Access Object
(Objeto de Acesso a Dados).
(Objeto de Acesso a Dados).
Nessa estratégia
Nessa estratégia
, um
, um
SSOO
SSOO
obtém acesso a objetos de negócio
obtém acesso a objetos de negócio
através de uma interface, a chamada
através de uma interface, a chamada
interface DAO
interface DAO
.
.
•
Classes que implementam essa interface transforma
Classes que implementam essa interface transforma
m
m
informações
informações
provenientes do mecanismo de armazenamento em objetos de negócio
provenientes do mecanismo de armazenamento em objetos de negócio
,
,
e vice-versa
e vice-versa
.
.
O SSOO
O SSOO
interage com o
interage com o
objeto DAO
objeto DAO
através de uma interface.
através de uma interface.
•
A implementação desse objeto simplesmente não faz diferença para a
A implementação desse objeto simplesmente não faz diferença para a
aplicação.
aplicação.
•
O objeto DAO isola completamente os seus clientes das particularidades
O objeto DAO isola completamente os seus clientes das particularidades
d
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
54
54
Uso do p
Uso do p
adrão DAO
adrão DAO
Uso do p
Uso do p
adrão DAO
adrão DAO
public interface AlunoDAO
{
public void inserir(Aluno aluno)
throws AlunoDAOException;
public void atualizar(Aluno aluno)
throws AlunoDAOException;
public void remover(Aluno aluno)
throws AlunoDAOException;
public List<Aluno> encontrarTodos() throws AlunoDAOException;
public
Aluno
encontrarPorMatricula(String
matricula)
throws
AlunoDAOException;
public List<Aluno> encontrarPorTurma(int idTurma) throws AlunoDAOException;
Exemplo em linguagem Java de uma
Exemplo em linguagem Java de uma
InterfaceDAO
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
56
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
58
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
60
60
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
62
62
Outro exemplo de estrutura DAO:
Outro exemplo de estrutura DAO:
BaseSombra
{abstract} -expressao campos parametros camposParametros expressaoAtualiza criterio ordem tabela : String : String : String : String : String : String : String : String + + + + + + + + + + + + + + + setCriterio () setOrdem () setTabela () montaInstConsulta () montaInstConsultaQtd () montaInstAlterar () montaInstIncluir () executeInstSQLUpdate () executeInstSQLConsulta () abstract adicionaCampos () adicionaCamposCod () adicionaCamposCons () abstract adicionaParametros () abstract adicionaCamposParametros () adicionaParametrosCod () : v oid : v oid : v oid : v oid : v oid : v oid : v oid : v oid : ResultSet : v oid : v oid : v oid : v oid : v oid : v oidConexao
-conexao driv er nome senha url usuario : Connection : String : String : String : String : String + + + conectar () desconectar () getStatement () : v oid : v oid : Statement<<from Uti l i tari o.Persistenci a>> BaseSombra {abstract} -expressao campos parametros camposParametros expressaoAtualiza criterio ordem tabela : String : String : String : String : String : String : String : String + + + + + + + + + + + + + + + setCriterio () setOrdem () setTabela () montaInstConsulta () montaInstConsultaQtd () montaInstAlterar () montaInstIncluir () executeInstSQLUpdate () executeInstSQLConsulta () abstract adicionaCampos () adicionaCamposCod () adicionaCamposCons () abstract adicionaParametros () abstract adicionaCamposParametros () adicionaParametrosCod () : v oid : v oid : v oid : v oid : v oid : v oid : v oid : v oid : ResultSet : v oid : v oid : v oid : v oid : v oid : v oid MDCampoGlobalSombra + inserir (CampoGlobal mdCampoGlobal) : v oid
MDTabGlobalSombra + + + + + +
inserir (MDTabGlobal mdTabGlobal) consultar (int codTalGlobal)
consulta (String nome)
alterar (MDTabelaGlobal mdTabGlobal) remov er (int codTabGlobal)
consultarTodas () : v oid : MDTabGlobal : MDTabGlobal : v oid : v oid : Array List FonteDeDadosSombra + + + + + +
inserir (FonteDeDados f onteDeDados) consultar (int codFD)
consultar (String nomeFD)
alterar (FonteDeDados f onteDeDados) remov er (int codFD)
consultarTodas () : v oid : FonteDeDados : FonteDeDados : v oid : v oid : Array List MapeamentoTabSombra + + + + +
inserir (MapeamentoTabela mapeamentoTabela) consultar (int codTabGlobal, int codFD)
consultar (int codTabLocal)
alterar (MapeamentoTabela mapeamentoTabela) remov er (int codTabLocal)
: v oid : MapeamentoTabela : MapeamentoTabela : v oid : v oid MDTabLocalSombra + + + + + +
inserir (MDTabLocal mdTabLocal) consultar (int codTalLocal)
consultar (String nome, int codFD) alterar (MDTabelaLocal mdTabLocal) remov er (int codTabLocal)
consultarTodas (int codFD)
: v oid : MDTabLocal : MDTabLocal : v oid : v oid : Array List MDCampoLocalSombra + +
inserir (MDCampoLocal mdCampoLocal) consultar (int codCampoLocal)
: v oid : MDCampoLocal MapeamentoCampoSombra + + + + +
inserir (MapeamentoTabela mapeamentoCampo) consultar (int codCampoGlobal, int codFD) consultar (int codCampoLocal)
alterar (MapeamentoCampo mapeamentoCampo) remov er (int codCampoLocal)
: v oid
: MapeamentoCampo : MapeamentoCampo : v oid
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
64
64
Mostrar Exemplo:
Mostrar Exemplo:
MVC2
MVC2
•
http://blog.brasilacademico.com/2008/11/java-cr
http://blog.brasilacademico.com/2008/11/java-cr
iando-uma-aplicao-em-3-camadas.html
Uso de um f
Uso de um f
ramework ORM
ramework ORM
Um framework ORM é um conjunto de classes que realiza o
Um framework ORM é um conjunto de classes que realiza o
mapeamento
mapeamento
objeto-relacional de forma
objeto-relacional de forma
transparente.
transparente.
•
ORM
ORM
:
:
Object-Relational Mapping
Object-Relational Mapping
(mapeamento objeto-
(mapeamento
objeto-relacional).
relacional).
Os frameworks ORM tentam resolver o problema do
Os frameworks ORM tentam resolver o problema do
mapeamento objeto relacional através de
mapeamento objeto relacional através de
classes que o
classes que o
realizam de forma transparente.
realizam de forma transparente.
Normalmente
Normalmente
,
,
um framework
um framework
ORM demanda a definição d
ORM demanda a definição d
a
a
correspondência entre a
correspondência entre a
estrutura de objetos da aplicação
estrutura de objetos da aplicação
e
e
o
o
esquema relacional do banco de dados
esquema relacional do banco de dados
.
.
•
E
E
ssa correspondência é fornecida através de um arquivo de
ssa correspondência é fornecida através de um arquivo de
configuração, denominado
configuração, denominado
arquivo de mapeamento
arquivo de mapeamento
.
.
•
De posse dessa correspondência, o framework está apto a
De posse dessa correspondência, o framework está apto a
mapear qualquer requisição por uma informação armazenada
mapear qualquer requisição por uma informação armazenada
no SGBDR.
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
66
66
Mostrar Exemplo:
Mostrar Exemplo:
Especificação de classes de
Especificação de classes de
controle
controle
Em aplicações WEB, é comum a prática de utilizar outro
Em aplicações WEB, é comum a prática de utilizar outro
tipo de objeto controlador chamado
tipo de objeto controlador chamado
front controller
front controller
(FC).
(FC).
Um FC é um controlador responsável por receber todas as
Um FC é um controlador responsável por receber todas as
requisições de um cliente.
requisições de um cliente.
O FC
O FC
identifica qual o controlador
identifica qual o controlador
(
(
de caso de uso)
de caso de uso)
adequado para processa
adequado para processa
r
r
a requisição
a requisição
, e a
, e a
despacha para
despacha para
ele.
ele.
Sendo assim, um FC é um ponto central de entrada para as
Sendo assim, um FC é um ponto central de entrada para as
funcionalidades do sistema.
funcionalidades do sistema.
•
Vantagem: m
Vantagem: m
ais fácil controlar a autenticação dos usuários.
ais fácil controlar a autenticação dos usuários.
O FC é um dos
O FC é um dos
padrões de projeto
padrões de projeto
do catálogo J2EE
do catálogo J2EE
•
http://java.sun.com/blueprints/corej2eepatterns/Patterns/FrontControlle
http://java.sun.com/blueprints/corej2eepatterns/Patterns/FrontControlle
r.html
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
68
Mostrar Exemplo:
Mostrar Exemplo:
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
70
Padrão BO
Padrão BO
Objeto de Negócios: Business Object
Objeto de Negócios: Business Object
Classe espelho do modelo que
Classe espelho do modelo que
contem somente as regras de
contem somente as regras de
negócio
negócio
Classe do modelo:
Classe do modelo:
•
Estrutura de informação: atributos, get,
Estrutura de informação: atributos, get,
set, construtor
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
72
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
74
74
Mostrar Exemplo:
Mostrar Exemplo:
Singleton
Singleton
Intenção:
Intenção:
•
Garantir que uma classe tenha somente
Garantir que uma classe tenha somente
uma instância e fornecer um ponto global
uma instância e fornecer um ponto global
de acesso à mesma.
de acesso à mesma.
Motivação
Motivação
•
Em muitas situações é necessário
Em muitas situações é necessário
garantir que algumas classes tenham
garantir que algumas classes tenham
uma e somente uma instância.
uma e somente uma instância.
Exemplo: o gerenciador de arquivos num
Exemplo: o gerenciador de arquivos num
sistema deve ser único; escalonadores;
sistema deve ser único; escalonadores;
gerenciadores de janelas.
Aplicações Desktop usando Java/NetBeans - Cristia
Aplicações Desktop usando Java/NetBeans - Cristia
no Biancardi
no Biancardi
76
76