copyright 2012, eddie e. burris padrões de projeto

65
Copyright 2012, Eddie E. Burris Padrões de Projeto

Upload: internet

Post on 22-Apr-2015

105 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

Padrões de Projeto

Page 2: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

Apresentação sobre Padrões de Projeto traduzida

e adaptada do livro:

Page 3: Copyright 2012, Eddie E. Burris Padrões de Projeto

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, e outros

Page 4: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

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

Page 5: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

Diagrama de Caso de Uso do SIG p/ Biblioteca

Usuário da Biblioteca

PegarLivro

DevolverLivro

RenovarLivro

ReservarLivro

Page 6: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

Rascunho do Projeto

Page 7: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

O que fazer?Alto Acoplamento

Page 8: Copyright 2012, Eddie E. Burris Padrões de Projeto

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

Page 9: Copyright 2012, Eddie E. Burris Padrões de Projeto

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]

Page 10: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

Resultado do projeto após a aplicação do padrão de projeto Façade

Page 11: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

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

O novo projeto realmente é melhor?

Page 12: Copyright 2012, Eddie E. Burris Padrões de Projeto

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.

Page 13: Copyright 2012, Eddie E. Burris Padrões de Projeto

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]

Page 14: Copyright 2012, Eddie E. Burris Padrões de Projeto

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

Page 15: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

Marcos importantes na história dos padrões de projeto

1977Cristopher 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.

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

1994A 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.

Page 16: Copyright 2012, Eddie E. Burris 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.

Page 17: Copyright 2012, Eddie E. Burris Padrões de Projeto

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?

Page 18: Copyright 2012, Eddie E. Burris Padrões de Projeto

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.

Page 19: Copyright 2012, Eddie E. Burris Padrões de Projeto

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:

Page 20: Copyright 2012, Eddie E. Burris Padrões de Projeto

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

Page 21: Copyright 2012, Eddie E. Burris Padrões de Projeto

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.

Page 22: Copyright 2012, Eddie E. Burris Padrões de Projeto

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.

Page 23: Copyright 2012, Eddie E. Burris Padrões de Projeto

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.

Page 24: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

Padrão de Projeto Observer [Cont.]

• Modelo de solução abstrada para o padrão de projeto Observer:

Page 25: Copyright 2012, Eddie E. Burris Padrões de Projeto

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.

Page 26: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

Padrões de Análise

• Padrões de análise documentam conhecimento 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).

Pessoa

Física Jurídica

Page 27: Copyright 2012, Eddie E. Burris Padrões de Projeto

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.

Page 28: Copyright 2012, Eddie E. Burris Padrões de Projeto

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.

Page 29: Copyright 2012, Eddie E. Burris Padrões de Projeto

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.

Page 30: Copyright 2012, Eddie E. Burris Padrões de Projeto

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.

Page 31: Copyright 2012, Eddie E. Burris Padrões de Projeto

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

Page 32: Copyright 2012, Eddie E. Burris Padrões de Projeto

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").

Page 33: Copyright 2012, Eddie E. Burris Padrões de Projeto

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.

Page 34: Copyright 2012, Eddie E. Burris 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?

Page 35: Copyright 2012, Eddie E. Burris Padrões de Projeto

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.

Page 36: Copyright 2012, Eddie E. Burris Padrões de Projeto

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.

Page 37: Copyright 2012, Eddie E. Burris Padrões de Projeto

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.

Page 38: Copyright 2012, Eddie E. Burris Padrões de Projeto

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.

Page 39: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

Padrões de Projeto• Singleton• Iterator• Adapter• Decorator• State• Strategy• Factory Method• Observer• Façade• Template Method

Page 40: Copyright 2012, Eddie E. Burris Padrões de Projeto

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.

Page 41: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

Solução

Page 42: Copyright 2012, Eddie E. Burris Padrões de Projeto

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.

Page 43: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

Solution

Page 44: Copyright 2012, Eddie E. Burris Padrões de Projeto

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.

Page 45: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

Solução usando composição

Page 46: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

Solução usando herança

Page 47: Copyright 2012, Eddie E. Burris Padrões de Projeto

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.

Page 48: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

Solução – Estrutura estática

Page 49: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

Diagrama Conceitual

Page 50: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

Solução – Comportamento Dinâmico

Page 51: Copyright 2012, Eddie E. Burris Padrões de Projeto

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.

Page 52: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

Solução

Page 53: Copyright 2012, Eddie E. Burris Padrões de Projeto

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

Page 54: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

Solução

Page 55: Copyright 2012, Eddie E. Burris Padrões de Projeto

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]

Page 56: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

Solução

Page 57: Copyright 2012, Eddie E. Burris Padrões de Projeto

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.

Page 58: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

Solução – Estrutura Estática

Page 59: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

Solução – Comportamento Dinâmico

Page 60: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

Solução com classe base comum para sujeitos

Page 61: Copyright 2012, Eddie E. Burris Padrões de Projeto

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 alto-nível que torna o subsistema mais fácil de usar.” [Gang of Four]

Page 62: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

Solução

Page 63: Copyright 2012, Eddie E. Burris Padrões de Projeto

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.

Page 64: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

Solução

Page 65: Copyright 2012, Eddie E. Burris Padrões de Projeto

Copyright 2012, Eddie E. Burris

Fim