Padrões de Projeto
(Design Patterns)
Fábio Gondim Período: 2010.1 2(Design Patterns)
Peça Rei Rainha Torre Bispo Cavalo Peão
Quantidade 1 1 2 2 2 8
Símbolo
Conhecer as peças, tabuleiro e regras do jogo de xadrez não são suficientes para definir um grande jogador.
3
Padrões de Projeto
(Design Patterns)
Conhecer e compreender as técnicas, estratégias e jogadas dos grandes mestres é recomendável.
4
Padrões de Projeto
(Design Patterns)
Conhecer a sintaxe, semântica, estruturas e regras de uma linguagem orientada a objetos não é suficiente para definir um bom projetista.abstract continue for new switch assert*** default goto* package synchronized boolean do if private this break double implements protected throw byte else import public throws case enum**** instanceof return transient catch extends int short try char final interface static void class finally long strictfp** volatile
const* float native super while
Padrões de Projeto
(Design Patterns)
Conhecer e compreender as técnicas, estratégias e soluções dos grandes projetistas é recomendável.
Padrões de Projeto
(Design Patterns)
Padrão segundo o dicionário Aurélio:
...aquilo que serve de baseou norma para a
avaliação de qualidade ou quantidade...
... qualquer objeto que serve de modeloà
feitura de outro ...
...modelo, exemplo, protótipo, arquétipo...
7
O que é um padrão de projeto?
Idéia vem da área de arquitetura (1979)
“A importância de padrões na criação de sistemas complexos foi há muito tempo reconhecida em outras disciplinas. Christopher Alexander e seus colegas foram, talvez, os primeiros a propor a idéia de usar uma linguagem de padrões em projetos de edificações e cidades”
(Grady Booch)
8
O que é um padrão de projeto?
“Cada padrão descreve um problema no
nosso ambiente e o cerne da sua solução, de tal forma que você possa usar essa solução milhões de vezes, sem nunca fazê-lo da mesma maneira”
(Christopher Alexander, sobre padrões em Arquitetura)
9
Padrões de Projeto
(Design Patterns)
“
Existem problemas em software que
ocorrem repetidamente e que poderiam
ser resolvidos, em certa medida, da
mesma maneira
?
”
(Alan Shalloway & James R. Trott)
10
Padrões de Projeto
(Design Patterns)
“
Seria possível projetar software em
termos de padrões, criando soluções
específicas baseadas nesses padrões
somente depois que eles tivessem sido
identificados
?
”
(Alan Shalloway & James R. Trott)
11
Padrões de Projeto
(Design Patterns)
Idéia transportada para software em um livro
clássico:
Padrões de Projeto
Soluções reutilizáveis de software orientado a objetos Escrito por: Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides(que ficaram conhecidos como a Gangue dos Quatro (The Gang of Four – GoF)
12
Padrões de Projeto
(Design Patterns)
“É importante compreender que os autores não criaram os padrões descritos no livro; ao contrário, eles os identificaram como já existentes na comunidade de software – padrões que refletiam o que havia sido aprendido sobre projetos de alta qualidade para problemas específicos”
13
O que é um padrão de projeto?
"Os padrões de projeto são descrições de objetos e classes comunicantes que precisam ser personalizadas para resolver um problema geral de projeto em um contexto particular”
(Gamma, Helm, Johnson & Vlissides)
14
O que é um padrão de projeto?
“Os padrões de projeto são abstrações de alto nível, que documentam soluções bem-sucedidas de projeto. Eles são fundamentais para o reuso de projetos no desenvolvimento orientado a objetos.”
(Ian Sommerville)
15
Padrões de Projeto
(Design Patterns)
O que é um padrão de projeto?
“Os padrões de projeto são combinações de
classes e algoritmos associados que cumprem com os propósitos comuns de projeto. Um padrão de projeto expressa uma idéia em vez de uma combinação fixa de classes. Os algoritmos associados expressam a operação básica do padrão.”
(Eric Braude)
16
Padrões de Projeto
(Design Patterns)
“Um padrão de projeto nomeia, abstrai e identifica os aspectos chaves de uma estrutura comum para torná-la útil para a criação de um projeto orientado a objeto reutilizável. O padrão de projetos identifica as classes e instâncias participantes, seus papeis, colaborações e a distribuição de responsabilidades.
(...)
Padrões de Projeto
(Design Patterns)
Cada padrão de projeto focaliza um problema ou tópico particular de projeto orientado a objetos. Ele descreve em que situação pode ser aplicado, se ele pode ser aplicado em função de outras restrições de projeto e as conseqüências, custos e benefícios de sua utilização.”
(Gamma, Helm, Johnson & Vlissides)
Padrões de Projeto
(Design Patterns)
Quais os seus benefícios?
Descrevem e justificam soluções para problemas de
projeto orientado a objetos que foram previamente testadas e aprovadas.
“Padrões mostram como construir sistemas com boas qualidades de design OO.”
“Padrões são uma experiência orientada a objeto comprovada”
19
Quais os seus benefícios?
Permitem compartilhar experiências bem sucedidas
na resolução de problemas.
“Uma coisa que os melhores projetistas sabem que não devem fazer é resolver cada problema a partir de princípios elementares ou do zero. Em vez disso, eles reutilizam soluções que funcionaram no passado. Quando encontram uma boa solução eles a utilizam repetidamente.”
(Gamma, Helm, Johnson & Vlissides)
20
Quais os seus benefícios?
Permitem compartilhar experiências bem sucedidas
na resolução de problemas.
“Se não conhece padrões, você tem menos probabilidade de desenvolver projetos excelentes.
Padrões capturam sabedoria. Reusar essa sabedoria é extremamente útil.”
(Joshua Kerievsky)
21
Padrões de Projeto
(Design Patterns)
Quais os seus benefícios?
Tornam mais fácil reutilizar projetos e arquiteturas
bem sucedidas
“Muitas pessoas podem compreender conceitos como objetos, interfaces, classes e herança. O desafio reside em aplicá-los à construção de software flexível e reutilizável, e os padrões de projeto podem mostrar como fazê-lo.”
(Gamma, Helm, Johnson & Vlissides)
22
Padrões de Projeto
(Design Patterns)
Quais os seus benefícios?
Estabelecem um vocabulário de alto nível para
discussão sobre projeto de software:
“Quando você se comunica com outro desenvolvedor ou com sua equipe usando padrões, está
comunicando não apenas um nome de padrão, mas um conjunto inteiro de qualidades, características e restrições que o padrão representa”
(Eric Freeman & Elisabeth Freeman, 2005)
23
Padrões de Projeto
(Design Patterns)
“Padrões fornecem uma linguagem
compartilhada que pode maximizar o
valor de sua comunicação com outros
desenvolvedores”
(Eric Freeman & Elisabeth Freeman, 2005)
24
Padrões de Projeto
(Design Patterns)
Em geral, um padrão tem quatro
elementos essenciais:
1.O nome do padrão;
2.O problema;
3.A Solução;
25
O nome do padrão:
É uma referência que podemos utilizar
para descrever um problema de projeto, suas soluções e conseqüências em uma ou duas palavras.
26
O problema:
Descreve em que situação aplicar o
padrão. Ele explica o problema e seu contexto. Algumas vezes, o problema incluirá uma lista de condições que devem ser satisfeitas para que faça sentido aplicar o padrão.
27
Padrões de Projeto
(Design Patterns)
A solução:
Descreve os elementos que compõem o
padrão de projetos, seus relacionamentos, suas responsabilidades e colaborações.
28
Padrões de Projeto
(Design Patterns)
A solução não descreve um projeto
concreto ou implementação em particular porque um padrão é como um gabarito que pode ser aplicado em muitas situações diferentes. Em vez disso, o padrão fornece uma descrição abstrata de um problema de projeto e de como um arranjo geral de elementos (classes e objetos, no nosso caso) o resolve.
Padrões de Projeto
(Design Patterns)
As conseqüências:
São os resultados e análises das vantagens
e desvantagens da aplicação do padrão (são críticas para a avaliação de alternativas de projetos e para
compreensão dos custos e benefícios da aplicação do padrão).
Padrões de Projeto
(Design Patterns)
Uma vez que a reutilização é
freqüentemente um fator no projeto orientado a objetos, as conseqüências de um padrão incluem o seu impacto sobre a flexibilidade, a extensibilidade ou a portabilidade de um sistema.
31
Descrevendo os padrões de projeto:
Os padrões GOF são descritos de acordo
com um gabarito que fornece uma estrutura uniforme às informações, tornando os padrões de projeto mais fáceis de aprender, comparar e usar.
32
Gabarito:
Nome e classificação do padrão; Intenção e objetivo;
Também conhecido como; Motivação; Aplicabilidade; Estrutura; 33
Padrões de Projeto
(Design Patterns)
Gabarito (continuação):
Participantes; Colaborações; Conseqüências; Implementação; Exemplo de código; Usos conhecidos; Padrões relacionados. 34Padrões de Projeto
(Design Patterns)
Exemplo de um padrão: Singleton.
Nome: SINGLETON
Classificação: Criação de objetos
35
Padrões de Projeto
(Design Patterns)
Motivação
Algumas classes devem ser instanciadas
uma única vez:
Um spooler de impressão; Um gerenciador de janelas;
Um objeto que contém a configuração de um
programa;
Etc.
36
Padrões de Projeto
(Design Patterns)
Como assegurar que uma classe possua
apenas uma instância e que esta instância seja facilmente acessível?
Uma variável global deixa a instância acessível
mas não inibe a instanciação múltipla.
Uma melhor solução: faça com que a classe em si
seja responsável pela manutenção da instância única. Este é o padrão Singleton.
37
Aplicabilidade
Use o padrão Singleton quando:
For preciso haver apenas uma instância de uma
classe, e essa instância tiver que dar acesso aos clientes através de um ponto bem conhecido.
A única instância tiver de ser extensível através
de subclasses, possibilitando aos clientes usar uma instância estendida sem alterar o seu código.
Estrutura
39Padrões de Projeto
(Design Patterns)
Participantes
SingletonDefine uma operação getInstance() que
permite que clientes acessarem sua única instância (getInstance é uma operação de classe o que significa que em java ele deve ser um método estático).
Pode ser responsável pela criação de sua
própria instância única.
40
Padrões de Projeto
(Design Patterns)
Colaborações
Os clientes acessam uma instância
Singleton unicamente pela operação getInstance() do Singleton.
Conseqüências
O padrão Singleton apresenta vários
benefícios:
Padrões de Projeto
(Design Patterns)
Acesso controlado à instância única. Como a
classe Singleton encapsula a sua única instância, possui controle total sobre como e quando os clientes a acessam.
Espaço de nomes reduzido. O padrão
Singleton representa uma melhoria em relação ao uso de variáveis globais. Ele evita a poluição do espaço de nomes com variáveis globais que armazenam instâncias únicas
Padrões de Projeto
(Design Patterns)
Permite um refinamento de operações e da
representação. A classe Singleton pode ter
subclasses e é fácil configurar uma aplicação com uma instância dessa classe estendida. Você pode configurar a aplicação com uma instância da classe de que necessita em tempo de execução.
43
Permite um número variável de instâncias. O
padrão torna fácil mudar de idéia, permitindo mais de uma instância da classe Singleton. Além disso você pode utilizar a mesma abordagem para controlar o número de instâncias que a aplicação utiliza. Somente a operação que permite acesso à instância de Singleton necessita ser mudada.
44
Mais flexível do que operações de
classe (métodos estáticos).
Embora
possa parecer que podemos fazer o
equivalente a um Singleton com
métodos estáticos, lembre que isso
não permitiria o polimorfismo.
45
Padrões de Projeto
(Design Patterns)
Implementação
Como assegurar que haja uma única instância?
Uma forma é não permitir chamadas ao construtor. public class Config implements ConfigIF {
private static ConfigIF instânciaÚnica = null; private Config() {}
// o compilador não vai gerar um construtor default público
public static ConfigIF getInstance() { if(instânciaÚnica == null) {
// "lazy instantiation“
instânciaÚnica = new Config(); } return instânciaÚnica; }
46
Padrões de Projeto
(Design Patterns)
Usos conhecidos e padrões relacionados
Muitos padrões podem ser implementados
usando Singleton. Alguns exemplos são Abstract Factory, Builder e Prototype.
47
Padrões de Projeto
(Design Patterns)
Exercício
Crie uma classe Highlander que implemente o padrão Singleton.
(Lembram do filme Highlander onde os personagens diziam que só podia haver um?)
Crie uma classe Teste que crie duas referências para um objeto
Highlander utilizando o método getInstance() e que comprove que elas apontam para o mesmo objeto.
Tente instanciar um objeto Highlander na classe Teste e verifique
que o código não compila.
Acrescente o modificador synchronized ao método
getInstance() da classe HighLander. O que significa esta alteração?
48
Padrões de Projeto
(Design Patterns)
Bibliografia
BRAUDE, Eric. Projeto de Software. Bookman, 2005; FREEMAN, Eric, FREEMAN, Elizabeth. Use a Cabeça!
– Padrões de Projeto. Alta Books, 2005;
GAMMA, E., HELM, R., JOHNSON, R. e VLISSIDES, J.
Padrões de Projeto – Soluções reutilizáveis de software orientado a objetos. Bookman, 1995;
KERIEVSKY, JOSHUA. Refatoração para Padrões.
49
Bibliografia
LARMAN, Craig. Utilizando UML e Padrões. 2ª ed.
Bookman, 2002;
SHALLOWAY, Alan; TROTT, James. Explicando
Padrões de Projeto – Uma Nova Perspectiva em Projeto Orientado a Objeto. Bookman, 2004;
SOMMERVILLE, Ian. Engenharia de Software. 6ª