Baixe o app para aproveitar ainda mais
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 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Compartilhar