Padrões de Projeto
Copyright 2012, Eddie E. Burris
Apresentação
sobre Padrões de
Projeto traduzida
e adaptada do
livro:
Copyright 2012, Eddie E. Burris
Sumário
•
•
•
•
•
•
•
•
•
•
Um simples exemplo
História dos padrões de projeto
O que é um padrão de projeto de software?
Código  Projeto  Padrão de Projeto
Categorias de padrões
Nem todos os pares problema-solução são
padrões
Benefícios dos padrões de projeto
Questão resolvida
Modelos de padrão de projeto
Padrões de Projeto
– Singleton, Iterator,
Observer,
outros
Copyright
2012, Eddie E.eBurris
Projeto de SIG p/ Biblioteca
• Imagine que você está na etapa final do projeto
de um SIG para uma biblioteca. Os requisitos
solicitados permitem aos usuários:
– Pegar um livro (empréstimo)
– Devolver um livro
– Renovar um livro, e
– Reservar um livro
Copyright 2012, Eddie E. Burris
Diagrama de Caso de Uso do SIG p/
Biblioteca
Pegar
Livro
Devolver
Livro
Renovar
Livro
Usuário da
Biblioteca
Reservar
Livro
Copyright 2012, Eddie E. Burris
Rascunho do Projeto
Copyright 2012, Eddie E. Burris
O que fazer?
Alto Acoplamento
Copyright 2012, Eddie E. Burris
Livros sobre projeto de software oferecem soluções
reutilizáveis ​para problemas recorrentes de projeto
• Singleton – O padrão de projeto Singleton
garante que não mais do que uma instância de
uma classe seja criada. . .
Copyright 2012, Eddie E. Burris
Procurando por uma solução para o
nosso problema de projeto de software
• Iterator – O padrão de projeto Iterator fornece
uma maneira uniforme de examinar. . .
• Façade – A intenção do padrão de projeto Façade
é “prover uma interface unificada para um
conjunto de interfaces em um subsistema. Façade
define um alto nível de interface que torna o
subsistema mais fácil de ser usado.” [Gang of
Four]
Copyright 2012, Eddie E. Burris
Resultado do
projeto após a
aplicação do
padrão de
projeto Façade
Copyright 2012, Eddie E. Burris
O novo projeto
realmente é
melhor?
• A nova classe Façade
tem as mesmas três
setas presentes no
projeto antigo?
• O novo projeto
também não tem
um alto
acoplamento?
Copyright 2012, Eddie E. Burris
História dos Padrões de Projeto
• Padrões não tiveram origem com
software; surgiram na esfera do
planejamento urbano e arquitetura.
• Na década de 70, Christopher Alexander
propôs a criação de um padrão de estilo
que as pessoas comuns pudessem usar
para criar edifícios ​e espaços públicos
mais agradáveis..
• O primeiro livro sobre padrões, A Pattern Language:
Towns, Buildings, Construction, documentou 253
padrões.
• Cada padrão provia uma solução geral para um
problema de projeto recorrente em um contexto
particular.
Copyright 2012, Eddie E. Burris
História dos padrões de projeto de
software
• Em 1987 Kent Beck e Ward Cunningham
proporam a criação de um estilo padrão para
projetos de software.
• Sua visão original era permirtir que os usários
“escrevessem seus próprios programas”.
“Nosso sucesso inicial utilizando um estilo padrão
para o projeto de interface de usuário nos deixou
bastante entusiasmado com as possibilidades de
usuários
de
computador
projetarem
e
programarem seus próprios aplicativos.” [Sowizral]
Copyright 2012, Eddie E. Burris
Gangue dos Quatro
• O movimento de padrões de software começou
para valer após a publicação de Design Patterns:
Elements of Reusable Object-Oriented Software
[1994].
• Os quatro autores Erich Gamma, Richard Helm,
Ralph Johnson and John Vlissides são conhecidos
coletivamente como a “Gang of Four” or GofF
(Gangue dos Quatro).
Copyright 2012, Eddie E. Burris
1977
Cristopher Alexander co-autor do primeiro
livro sobre padrões, A Pattern Language:
Towns, Buildings, Construction, documentou
253 padrões em planejamento urbano e
arquitetura de construções.
1994
A gangue dos quatro iniciaram o movimento de
padrões de software com a publicação do primeiro
livro de padrões de software: Design Patterns:
Elements of Reusable Object-Oriented Software. O
livro documenta 23 padrões de projeto de software.
1987
Kent Beck e Ward Cunningham proporam a
criação de um estilo padrão para projetos de
software a luz das ideias do estilo padrão para
projetos urbanos e construções de Christopher
Alexander
Marcos importantes na história
dos padrões de projeto
Copyright 2012, Eddie E. Burris
O que é um padrão de projeto?
• Um padrão de projeto de software é uma
solução reusável para um problema de projeto
recorrente.
• A proposta do processo de design é determinar
como eventuais códigos serão estruturadas ou
organizados em módulos.
• A saída do processo de design é um modelo
abstrato de solução tipicamente expressada por
meio de uma linguagem simbólica de
modelagem, como UML.
Copyright 2012, Eddie E. Burris
Padrões de Projeto como Problema → Pares
de Soluções
• Conceitualmente, um padrão de projeto provê
um mapeamento de um problema específico de
design para uma solução genérica.
Problema de Design
Solução Genérica
Como posso garantir que
uma classe só tenha uma
instância?
Como posso fazer objetos
dependentes cientes das
mudanças de estado em um
objeto subordinado sem o
uso de votação?
Copyright 2012, Eddie E. Burris
Padrões de Projeto Definidos
• Conhecimento de padrões
de projeto simplifica o
projeto do software pela
redução do número de
problemas de design que
são resolvidos a partir de
princípios fundamentais.
• Problemas de projeto que
correspondem a padrões
de projeto documentados,
têm soluções prontas.
• Os demais problemas que
não
correspondem
a
padrões
de
projeto
documentados devem ser
resolvidos a partir de
princípios fundamentais.
Copyright 2012, Eddie E. Burris
Código  Projeto  Padrão de Projeto
• A seguir, o código será familiar a qualquer um
que tenha escrito um programa GUI em Java:
Copyright 2012, Eddie E. Burris
Código  Projeto  Padrão de Projeto
• Da mesma forma, o seguinte código será familiar a
qualquer um que tenha escrito um programa GUI em
C #:
Copyright 2012, Eddie E. Burris
Código  Projeto  Padrão de Projeto
• Em cada caso, um manipulador de eventos ou de
rotina callback é registrado para lidar com
eventos de clique de botão.
• Cada implementação é única, mas em ambos os
casos o projeto é o mesmo.
Copyright 2012, Eddie E. Burris
Código  Projeto  Padrão de Projeto
• Em ambos os casos, o problema de projeto geral
é como permitir que um ou mais objetos (aqueles
que contêm as rotinas de tratamento de eventos)
possa ser notificado quando o estado de outro
objeto (o botão) muda.
• Este é um problema de design rotineiro para o
qual existe uma solução reutilizável na forma do
padrão de projeto Observer.
Copyright 2012, Eddie E. Burris
Padrão de Projeto Observer
• Nome do Padrão: Observer.
• Contexto: Um ou mais objetos (observadores) precida
saber das mudanças de estado em outro objeto (o
sujeito).
• Problema: Os objetos que fazem a observação
(observadores) deve estar dissociados do objeto sob
observação (o sujeito).
• Solução: Definir uma classe ou interface Subject
(Sujeito) com métodos para vincular e desvincular os
observadores, bem como um método para notificar
aos observadores vinculados quando o estado do
sujeito muda. Definir uma interface Observer que
define um método de retorno que sujeitos podem usar
para notificar os observadores de uma mudança.
Copyright 2012, Eddie E. Burris
Padrão de Projeto Observer [Cont.]
• Modelo de solução abstrada para o padrão de
projeto Observer:
Copyright 2012, Eddie E. Burris
Categorias de Padrões
• As quatro categorias principais de padrões de
software são: padrões de análise, padrões de
arquitetura, padrões de projeto e idiomas de
programação.
Copyright 2012, Eddie E. Burris
Padrões de Análise
Pessoa
• Padrões de análise
documentam conhecimento
Jurídica
Física
coletivo de abstrações
comumente encontradas
durante a análise de domínio
e modelagem de negócios.
• Exemplo de padrão de análise: Party (Pessoa).
• O padrão de análise Party é uma abstração que
representa uma pessoa (Física) ou organização
(Jurídica).
Copyright 2012, Eddie E. Burris
Padrões de Arquitetura
• Projeto ocorre em diferentes níveis.
• Um padrão de arquitetura é um plano de alto
nível para organizar os componentes de nível
superior de um sistema de programa ou
software.
Copyright 2012, Eddie E. Burris
Padrões de Projeto
• Os padrões de projeto resolvem os problemas de
projeto de nível médio. As soluções para estes
problemas são definidos por um pequeno
número de classes e/ou objetos.
• Padrões de projeto são o assunto desta
apresentação.
Copyright 2012, Eddie E. Burris
Idiomas de Programação
• Um idioma de programação é um padrão de baixo
nível, de linguagem específica que explica como
realizar uma tarefa simples, usando uma linguagem
de programação específica ou tecnologia.
• Um termo mais popular para idioma de programação
hoje é a receita...
• Exemplo
– Problema: Como garantir que instâncias de uma
classe C + + nunca sejam copiadas?
– Solução: Declare a cópia do construtor e copia do
operador de atribuição da classe como privado e não
implemente-as.
Copyright 2012, Eddie E. Burris
Nem todos os pares problema-solução
são Padrões
• Embora não haja critérios formais ou teste
decisivo para o que é e não é um padrão, existem
alguns pares problema-solução que não são
geralmente consideradas como padrões.
Copyright 2012, Eddie E. Burris
Algoritmos não são padrões de
projeto
• Algoritmos não são padrões de projeto, porque
eles têm objetivos diferentes.
• A finalidade de um algoritmo é resolver um
problema específico (triagem, pesquisa, etc) de
uma maneira computacionalmente eficiente,
como medido em termos de tempo e de espaço
de complexidade.
• O objetivo de um padrão de projeto é organizar o
código de uma maneira eficiente medida em
termos
de
flexibilidade,
facilidade
de
manutenção, reutilização, etc
Copyright 2012, Eddie E. Burris
Designs únicos não são padrões
• Nem todos os projetos de software sobe para o
nível de um padrão. Padrões são frequentemente
descritos como soluções reutilizáveis ​e bem
comprovada. Você não pode ter certeza se um
projeto único é reutilizável ou comprovado.
• A métrica geral é que um projeto de software não
pode ser considerado um padrão até que tenha
sido aplicado em uma solução do mundo real
pelo menos três vezes (a chamada "Regra de
Três").
Copyright 2012, Eddie E. Burris
Benefícios dos Padrões de Projeto
• Padrões de Projeto facilitam o reuso.
• Padrões de Projeto deixam o projeto mais fácil, mas
não é fácil.
• Padrões de Projeto captura conhecimento e facilita sua
difusão.
• Padrões de Projeto define um vocabulário comum para
a discussão de projeto.
• Padrões de Projeto move o desenvolvimento de
software para mais próximo de uma disciplina de
engenharia bem estabelecida.
• Padrões de Projeto demonstra conceitos e princípios
de bom design.
• Conhecer padrões de projeto populares torna mais
fácil de aprender bibliotecas de classe que usam
padrões de projeto.
Copyright 2012, Eddie E. Burris
Ponto Importante
• Faça o teste de comparação imparcial dos
padrões de projeto.
• Você pode dizer qual dos seguintes diagramas de
classe representam o State e qual representa o
Strategy?
Copyright 2012, Eddie E. Burris
State vs. Strategy
• É claro que é impossível dizer qual é o State e
qual é o Stratey.
• Estruturalmente eles são idênticos.
• Os padrões de projeto não se distinguem só pela
sua estrutura estática.
• O que torna um padrão de design único é o seu
objetivo.
Copyright 2012, Eddie E. Burris
Objetivo
• O objetivo de um padrão é o problema a ser
resolvido ou a razão para usá-lo.
• A intenção do padrão de State é permitir que um
objeto altere seu comportamento quando seu
estado interno muda.
• A intenção do padrão Strategy é encapsular
diferentes algoritmos ou comportamentos e
torná-los intercambiáveis ​partir da perspectiva do
cliente.
Copyright 2012, Eddie E. Burris
Modelos de Padrões de Projeto
• Padrões de projeto são quase sempre
apresentados utilizando uma estrutura uniforme.
• Ter um formato consistente faz com que seja
mais fácil de aprender, comparar e usar padrões.
Copyright 2012, Eddie E. Burris
Modelo Exemplo
• Nome do Padrão – um nome descritivo curto.
• Introdução – motivação para aprender o padrão
• Objetivo – o problema de projeto que o padrão
aborda.
• Solução – os aspectos comportamentais estruturais
estáticos e dinâmicos da solução.
• Código de Exemplo – um fragmento de código mostra
um exemplo de implementação do padrão.
• Discussão – alguma das questões de implementação
relacionadas com a utilização do padrão.
• Padrões relacionados – padrões relacionados com o
que está sendo descrito.
Copyright 2012, Eddie E. Burris
Padrões de Projeto
•
•
•
•
•
•
•
•
•
•
Singleton
Iterator
Adapter
Decorator
State
Strategy
Factory Method
Observer
Façade
Template Method
Copyright 2012, Eddie E. Burris
Singleton
• Objetivo – O padrão de projeto Singleton garante
que não mais do que uma instância de uma
classe seja criada e fornece um ponto global de
acesso a essa instância.
Copyright 2012, Eddie E. Burris
Solução
Copyright 2012, Eddie E. Burris
Iterator
• Objetivo – O padrão de projeto Iterator fornece
uma maneira uniforme de percorrer os
elementos de uma coleção de objetos.
Copyright 2012, Eddie E. Burris
Solution
Copyright 2012, Eddie E. Burris
Adapter
• Objetivo – O padrão de projeto Adapter é útil em
situações em que uma classe existente fornece
um serviço necessário, mas há uma
incompatibilidade entre a interface oferecida e o
que os clientes da interface esperam. O padrão
Adapter mostra como converter a interface da
classe existente na interface esperada pelos
clientes.
Copyright 2012, Eddie E. Burris
Solução usando composição
Copyright 2012, Eddie E. Burris
Solução usando herança
Copyright 2012, Eddie E. Burris
Decorator
• Objetivo – O padrão de projeto decorator fornece
uma maneira de anexar dinamicamente
responsabilidades adicionais a um objeto. Ele usa
a composição de objetos ao invés de herança de
classe para uma abordagem leve e flexível ao
adicionar responsabilidades a objetos em tempo
de execução.
Copyright 2012, Eddie E. Burris
Solução – Estrutura estática
Copyright 2012, Eddie E. Burris
Diagrama Conceitual
Copyright 2012, Eddie E. Burris
Solução – Comportamento Dinâmico
Copyright 2012, Eddie E. Burris
State
• Objetivo – Se um objeto passa por estados
claramente identificáveis, e o comportamento do
objeto é especialmente dependente de seu
estado, ele é um bom candidato para o padrão de
projeto State.
Copyright 2012, Eddie E. Burris
Solução
Copyright 2012, Eddie E. Burris
Strategy
• Objetivo – O padrão de projeto Strategy define
uma família de algoritmos, encapsula cada um, e
os torna intercambiáveis. Strategy permite que o
algoritmo varie independentemente dos clientes
que o utilizam. [Gang of Four].
Copyright 2012, Eddie E. Burris
Solução
Copyright 2012, Eddie E. Burris
Factory Method
• Intent – O padrão Factory Method "define uma
interface para criar um objeto, mas deixa as
subclasses decidirem qual classe instanciar.
Factory Method permite que uma classe submeta
a instanciação para subclasses." [Gang of Four]
Copyright 2012, Eddie E. Burris
Solução
Copyright 2012, Eddie E. Burris
Observer
• Objetivo – O padrão de projeto Observer define
uma relação um-para-muitos entre um objeto
sujeito e qualquer número de objetos
observadores de tal forma que, quando o objeto
sujeito muda, objetos observadores são
notificados e dada a chance de reagir a mudanças
no sujeito.
Copyright 2012, Eddie E. Burris
Solução – Estrutura Estática
Copyright 2012, Eddie E. Burris
Solução – Comportamento Dinâmico
Copyright 2012, Eddie E. Burris
Solução com classe base comum para sujeitos
Copyright 2012, Eddie E. Burris
Façade
• Objetivo – O objetivo do padrão de projeto
Façade design é “prover uma interface unificada
para um conjunto de interfaces em um
subsistema. Façade define uma interface de altonível que torna o subsistema mais fácil de usar.”
[Gang of Four]
Copyright 2012, Eddie E. Burris
Solução
Copyright 2012, Eddie E. Burris
Template Method
• Objetivo – Com o padrão de projeto Template
Method a estrutura de um algorítmo é
representada com variações sobre o algorítmo
implementado pelas subclasses. O esqueleto do
algoritmo é declarado em um método modelo
em termos de operações substituíveis. As
subclasses podem estender ou substituir algumas
ou todas destas operações.
Copyright 2012, Eddie E. Burris
Solução
Copyright 2012, Eddie E. Burris
Fim
Copyright 2012, Eddie E. Burris
Download

Copyright 2012, Eddie E. Burris