Buscar

Aula_01

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

PADRÕES DE PROJETO DE SOFTWARE
Aula 1 – Fundamentos de Padrão de Projeto
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
O que veremos nesta primeira aula
Conhecer o conceito de padrão de projeto e a suas aplicações;
Entender a descrição de um padrão de projeto e como usar;
Conhecer as duas principais famílias de padrões de projeto que serão estudadas no decorrer da disciplina;
Iniciar o estudo dos padrões de projeto da família GoF.
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Introdução
 Projetar software OO reusável e de boa qualidade é uma tarefa
 difícil;
 Para realizar essa tarefa a contento, projetistas experientes usam 
 soluções de sucesso com as quais já trabalharam no passado;
 Isso leva à descoberta de padrões de projeto;
 Durante duas décadas, a comunidade de padrões vem se desenvolvendo 
 de acordo com essa dinâmica.
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
O que é um padrão?
 Maneira testada ou documentada de alcançar um objetivo qualquer;
 Padrões são comuns em várias áreas da engenharia;
 Design Patterns, ou Padrões de Projeto;
Padrões para alcançar objetivos na engenharia de software usando classes e métodos em linguagens orientadas a objeto;
Inspirado em "A Pattern Language" de Christopher Alexander, sobre padrões de arquitetura de cidades, casas e prédios;
"Design Patterns" de Erich Gamma, John Vlissides, Ralph Jonhson e Richard Helm, conhecidos como "The Gang of Four", ou GoF, descreve 23 padrões de projeto úteis
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
O que é um padrão?
"Cada padrão descreve um problema que ocorre repetidas vezes em nosso ambiente, e então descreve o núcleo da solução para aquele problema, de tal maneira que pode-se usar essa solução milhões de vezes sem nunca fazê-la da mesma forma duas vezes"
 Christopher Alexander, sobre padrões em Arquitetura
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
O que é um padrão?
"Os padrões de projeto são descrições de objetos que se comunicam e classes que são customizadas para resolver um problema genérico de design em um contexto específico"
 Gamma, Helm, Vlissides & Johnson, sobre padrões em software
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
O que é um padrão?
“Um padrão é a abstração de uma forma concreta que ocorre muitas vezes em contextos específicos.” 
 Riehle & Zullighoven, 1996
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
O que é um padrão?
“Resolve um problema. É um conceito provado. A solução não é óbvia. Descreve um relacionamento.” 
Jim Coplien, 1996
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Padrões - características
 Capturam soluções de projeto exaustivamente refinadas com o passar 
 do tempo;
 São o resultado de um longo processo de projeto, re-projeto, teste e 
 reflexão sobre o que torna um sistema mais flexível, reusável e modular;
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Catálogos de padrões
Um catálogo de padrões é um grupo de padrões que estão relacionados de uma certa forma e podem ser usados juntos ou independentemente:
Core JEE(Java Enterprise Edition);
PoEAA(PatternsofEnterprise Application Architecture);
POSA(Pattern-OrientedSoftware Architecture)
GRASP(General Responsibility Assignment Software Patterns/Principles)
GoF(Gang ofFour)
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Catálogo - GoF
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Por que aprender padrões?
Aprender com a experiência dos outros
Identificar problemas comuns em engenharia de software e utilizar soluções testadas e bem documentadas;
Utilizar soluções que têm um nome: facilita a comunicação, compreensão e documentação;
Aprender a programar bem com orientação a objetos
Os 23 padrões de projeto "clássicos" utilizam as melhores práticas em OO para atingir os resultados desejados;
Desenvolver software de melhor qualidade
Os padrões utilizam eficientemente polimorfismo, herança, modularidade, composição, abstração para construir código reutilizável, eficiente, de alta coesão e baixo acoplamento;
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Elementos de um padrão
Nome
Problema:
Quando aplicar o padrão, em que condições?
Solução:
Descrição abstrata de um problema e como usar os elementos disponíveis (classes e objetos) para solucioná-lo
Consequências:
Custos e benefícios de se aplicar o padrão
Impacto na flexibilidade, extensibilidade, portabilidade e eficiência do sistema
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Formas de classificação
Gamma et al [1] os classifica de duas formas
Por propósito:
criação de classes e objetos,
alteração da estrutura de um programa, 
controle do seu comportamento
Por escopo: classe ou objeto
Metsker [2] os classifica em 5 grupos, por intenção (problema a ser solucionado):
oferecer uma interface,
atribuir uma responsabilidade,
realizar a construção de classes ou objetos
controlar formas de operação
implementar uma extensão para a aplicação
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Categorização por escopo
Escopo de classe
Descrevem relacionamentos entre classes e suas subclasses (herança).
Estáticos: relacionamentos são fixos e definidos em tempo de compilação.
Escopo de objeto
Descrevem relacionamentos entre objetos.
Dinâmicos: relacionamentos entre objetos podem ser alterados em tempo de execução.
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Categorização por finalidade
Estruturais
Tratam da composição de classes e objetos para formar estruturas complexas.
Associados à maneira como classes e objetos são organizados estruturalmente.
Oferecem formas efetivas para usar conceitos OO como herança e composição.
São abstrações de aspectos estruturais
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Categorização por finalidade
De criação
Associados ao processo de criação de objetos
Tornam um sistema independente de como seus objetos são criados, compostos e representados
Comportamentais
Têm a ver com a maneira pela qual responsabilidades são distribuídas a classes e objetos durante a realização de uma tarefa.
São abstrações de aspectos comportamentais
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Classificação dos 23 padrões segundo GoF*
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Resumo do padrões GoF
Adapter: Converter a interface de uma classe em outra interface esperada pelos clientes.
Façade: Oferecer uma interface única de nível mais elevado para um conjunto de interfaces de um subsistema.
Composite: Permitir o tratamento de objetos individuais e composições hierárquicas desses objetos de maneira uniforme.
Bridge: Desacoplar uma abstração de sua implementação, de tal forma que os dois possam variar independentemente.
Singleton: Garantir que uma classe só tenha uma única instância, e prover um ponto de acesso global a ela.
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Resumo do padrões GoF
Observer: Definir uma dependência um-para-muitos entre objetos para que, quando um objeto mudar de estado, os seus dependentes sejam notificados e atualizados.
Mediator: Definir um objeto que encapsula a forma como um conjunto de objetos interage.
Proxy: Prover um substituto ou ponto através do qual um objeto possa controlar o acesso a outro.
Chain of Responsibility: Compor objetos em cascata para, através dela, delegar uma requisição até que um objeto a sirva.
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Resumo do padrões GoF
Flyweight: Usar compartilhamento para suportar eficientemente grandes quantidades de objetos complexos.
Builder: Separar a construção
de objeto complexo da representação para criar representações diferentes com mesmo processo.
FactoryMethod: Definir uma interface para criar um objeto mas deixar que subclasses decidam que classe instanciar.
Abstract Factory: Prover interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas.
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Resumo do padrões GoF
Prototype: Especificar tipos a criar usando uma instância como protótipo e criar novos objetos ao copiar este protótipo.
Memento: Externalizar o estado interno de um objeto para que o objeto possa ter esse estado restaurado posteriormente.
TemplateMethod: Definir o esqueleto de um algoritmo dentro de uma operação, deixando alguns passos a serem preenchidos pelas subclasses.
State: Permitir a um objeto alterar o seu comportamento quando o seu estado interno mudar.
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Resumo do padrões GoF
Strategy: Definir uma família de algoritmos, encapsular cada um, e fazê-los intercambiáveis.
Command: Encapsular uma requisição como objeto, para parametrizar clientes com diferentes requisições, filas e dar suporte a ações reversíveis.
Interpreter: Dada uma linguagem, definir uma representação para sua gramática junto com um interpretador.
Decorator: Anexar responsabilidades adicionais a um objeto dinamicamente
Iterator: Prover acesso sequencial a elementos de um objeto agregado, sem expor sua representação interna
Visitor: Representar uma operação a ser realizada sobre os elementos de uma estrutura de objetos
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Classificação dos padrões GoF segundo Metsker [2]
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Padrões de construção
A maneira padrão de construir objetos em Java é através de construtores
Toda classe tem um construtor: operação declarada com o mesmo nome da classe, que não retorna valor e só pode ser usada na inicialização
O construtor é uma tarefa de classe (estática)
Se um construtor não é explicitamente declarado em uma classe, o sistema cria um construtor default para a classe
Todo construtor inicializa a hierarquia de classes do objeto antes de executar
Todo construtor sempre contém ou uma referência à superclasse (implícita ou explícita) ou uma referência a outro construtor da classe como primeira ou única instrução
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Construtores em Java
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Além dos construtores
Construtores em Java definem maneiras padrão de construir objetos. Sobrecarga permite ampla flexibilidade
Alguns problemas em depender de construtores
Cliente pode não ter todos os dados necessários para instanciar um objeto
Cliente fica acoplado a uma implementação concreta (precisa saber a classe concreta para usar new com o construtor)
Cliente de herança pode criar construtor que chama métodos que dependem de valores ainda não inicializados (vide processo de construção)
Objeto complexo pode necessitar da criação de objetos menores previamente, com certo controle difícil de implementar com construtores
Não há como limitar o número de instâncias criadas.
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Além dos construtores
Padrões que oferecem alternativas à construção de objetos
Factory Method: adia a decisão sobre qual classe concreta instanciar
Abstract Factory: construir uma família de objetos que compartilham um "tema" em comum
Builder: obtém informação necessária em passos antes de requisitar a construção de um objeto
Prototype: especificar a criação de um objeto a partir de um exemplo fornecido
Memento: reconstruir um objeto a partir de uma versão que contém apenas seu estado interno
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Factory method
"Definir uma interface para criar um objeto mas deixar que subclasses decidam que classe instanciar. Factory Method permite que uma classe delegue a responsabilidade de instanciamento às subclasses." 
[GoF]
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Como implementar?
É possível criar um objeto sem ter conhecimento algum de sua classe concreta?
Esse conhecimento deve estar em alguma parte do sistema, mas não precisa estar no cliente
FactoryMethod define uma interface comum para criar objetos
O objeto específico é determinado nas diferentes implementações dessa interface
O cliente do FactoryMethod precisa saber sobre implementações concretas do objeto criador do produto desejado
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Como selecionar o criador?
Para criar objetos não é mais preciso saber a classe concreta do objeto a ser criado, mas ainda é preciso saber a classe do criador.
Para escolher qual criador usar sem que seja preciso instanciá-lo com um construtor, crie uma classe Factory com um método estático que decida qual criador usar com base em um parâmetro
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Prós e contras
Vantagens
Criação de objetos é desacoplada do conhecimento do tipo concreto do objeto
Conecta hierarquias de classe paralelas
Facilita a extensibilidade
Desvantagens
Ainda é preciso saber a classe concreta do criador de instâncias (pode-se usar uma classe Factory, com método estático e parametrizado que chame diretamente o Factory Method):
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Exemplo 1
public class Montadora{
public void novoCarro(String tipo){
	Carro carroZero;
 	if(tipo.equals(“Vectra”))
	 carroZero = new Vectra();
 else
	 if(tipo.equals(“Omega”))
	 carroZero = new Omega();
	 else 
 	 if(tipo.equals(“Gol”))
	 carroZero = new Gol();
	 else 
	 if(tipo.equals(“Golf”))
		carroZero = new Golf();
}
};
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Continuação do Exemplo 1
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Exemplo 2
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Continuação do Exemplo 2
public abstract class Aplicacao {
 private Documento doc;
 
 abstract Documento criaDocumento(); //Abstração do Factory Method
 void novoDocumento() {
 this.doc = this.criaDocumento();
 }
 
 void abrirDocumento() {
 this.doc.abrir();
 }
 }
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Continuação do Exemplo 2
public abstract class Documento {
 void abrir() {
 System.out.println("Documento:Abrir documento!");
 }
 
 void fechar() {
 System.out.println("Documento:Fechar documento!");
 }
 
 void gravar() {
 System.out.println("Documento:Gravar documento!");
 }
 }
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Continuação do Exemplo 2
public class MinhaAplicacao extends Aplicacao {
 /**
 * Uma implementação do Factory Method. Este método é 
 * especializado na criação de documentos do tipo MeuDocumento
 */
 Documento criaDocumento() {
 return new MeuDocumento();
 }
 }
public class MeuDocumento extends Documento {
 }
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Abstract Factory
"Prover uma interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas." 
[GoF]
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Problema
FUNDAMENTOS DE PADRÕES DE PROJETO
– AULA1
PADRÕES DE PROJETO DE SOFTWARE
Estrutura de Abstract Factory
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Exemplo 1
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Exemplo 2
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Continuação do Exemplo 2
public abstract class WidgetFactory {
 public static WidgetFactory obterFactory() {
 if(Configuracao.obterInterfaceGraficaAtual()==Configuracao.MotifWidget)
 return new MotifWidgetFactory();
 else
	 return new QtWidgetFactory();
 }
 public abstract Botao criarBotao();
 }
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Continuação do Exemplo 2
 public class MotifWidgetFactory extends WidgetFactory{
 public Botao criarBotao() {
 return new BotaoMotif();
 }
 }
 
public class QtWidgetFactory extends WidgetFactory {
 public Botao criarBotao() {
 return new BotaoQt();
 }
 }
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Continuação do Exemplo 2
 public abstract class Botao {
 public abstract void desenhar();
 }
 public class BotaoMotif extends Botao {
 public void desenhar() {
 System.out.println("Eu sou um botao Motif!");
 }
 }
 public class BotaoQt extends Botao {
 public void desenhar() {
 System.out.println("Eu sou um botao Qt!");
 }
 }
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Continuação do Exemplo 2
public class Cliente
 {
 public static void main(String[] args)
 {
 WidgetFactory factory = WidgetFactory.obterFactory();
 
 Botao botao = factory.criarBotao();
 botao.desenhar();
 }
 }
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Bibliografia
Utilizando UML e Padrões: uma introdução à análise e ao projeto orientados a objetos - 3ª Edição
Autor: Larman, Craig
Padrões de Projeto: soluções reutilizáveis de software orientado a objetos
Autor: Gamma, Erich ... [et al]
FUNDAMENTOS DE PADRÕES DE PROJETO – AULA1
PADRÕES DE PROJETO DE SOFTWARE
Fonte das imagens
Slide 4:
http://en.wikipedia.org/wiki/File:2_duplo_lego_bricks.jpg
http://lucasmauess.blogspot.com/2011/07/coisas-incriveis-feitas-em-lego.html
Slide 6:
http://www.devmedia.com.br/articles/viewcomp.asp?comp=10635
Slide 7:
http://www.anossaescola.com/cr/testes/RMarques/professor.gif
http://sitededicas.ne10.uol.com.br/curgraca3.htm 
Slide 8:
http://pedrocosta.wordpress.com/
http://despguerino.com/pictures.html 
Slide 9:
http://www.dsc.ufcg.edu.br/~jacques/cursos/p2/html/oo/usando.htm 
Slide 10:
http://carrosbr.com/vw-fox-e-cross-fox-2012.htm
http://www.carrosecorridas.com.br/2010/03/volkswagen-fox-e-crossfox-sao-os-modelos-preferidos-do-publico-feminino/
Slide 13:
http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html 
Slide 14:
http://www.alexandresmcampos.adm.br/fiec/jcid/java.htm
http://viralpatel.net/blogs/2008/12/java-virtual-machine-an-inside-story.html 
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Outros materiais