1 Introdução aos padrões de projeto (GoF) Conceitos preliminares –Mecanismos de herança –Princípio de Substituição de Liskov –Acoplamento concreto x Acoplamento.

Slides:



Advertisements
Apresentações semelhantes
Soluções elegantes para problemas recorrentes
Advertisements

PADRÕES DE PROJETO..
Paulo Marques Hernâni Pedroso
Modelagem de Software Orientado a Objetos
Design Patterns Builder Pattern
Projeto de Sistemas de Software
Modelagem Orientada a Objetos
De 17 1 Linguagens de Programação Orientadas a Objetos Pós-Gradução(Lato-Sensu) em Sistemas de Banco de Dados - UFPa Marco Fagundes Aula.
Orientação a Objetos Introdução. Objetos: o que são? Olhando o mundo real pode-se ver vários objetos: mesa, cadeiras, alunos, professores etc. Esses objetos.
Refatorações Experiência é aquela coisa maravilhosa que permite que você reconheça um erro tão logo o cometa novamente F.P. Jones.
Padrões GoF – Factory Method
Chain of Responsibility
Introdução ao paradigma de programação: Orientado a Objetos
Linguagem de Programação II
Linguagem de Programação II
Padrão de Construção Factory Method
Herança e Polimorfismo
Classes e objetos P. O. O. Prof. Grace.
Polimorfismo em C#.
Programação Orientada a Objetos com Java
Fundamentos da Engenharia de Software
Visão crítica sobre padrões: Over Engineering
Módulo III Padrões GOF Professores
Linguagens Orientadas a Objeto
Sobrecarga e Encapsulamento
Programação Orientada à Objetos
Padrões de Projeto Aplicações empresariais são complexas
Design Patterns e você. Jay Moretti Grupo de desenvolvedores Actionscripts do Brasil
Acoplamento e Coesão Modelagem e Programação Orientada a Objetos
Princípios de Análise e Projeto Orientados a Objetos com UML
INTRODUÇÃO À ORIENTAÇÃO A OBJETOS EM JAVA
SISTEMAS DISTRIBUIDOS Aula 4
Aula prática 14 Orientação a Objetos – C++ Parte 2
Design Pattern (Padrões de Projeto)
Programação Orientada à Objetos
Interfaces e classes abstratas. Conceitos de Orientação a Objeto.
UTFPR – Campus Curitiba - DAELN Cursos de Eng. Eletrônica/Eng
Prof. Gilberto Irajá Müller
Orientação a Objetos usando Java
Classes Abstratas P. O. O. Prof. Ângela e Grace.
POO II JEAN CARLO MENDES
Decorator POO - Avançado.
Interfaces POO Avançado.
Padrões de Projeto.
Introdução Padrões de Projeto
Trabalho Final de Padrões de Projeto
Padrões de Projeto Abstract Factory.
Padrões de Projeto.
Bruno Inojosa MCP .NET Framework
Linguagem II Classes Abstratas Interfaces. Davi Pires Revisão Reuso de código Superclasses e subclasses Composição vs. Herança Construtores.
Factory.
Design Patterns A adoção dos padrões terá um efeito profundo e duradouro sobre a forma de escrevermos programas Ward Cunningham e Ralph Johnson.
Padrões de Projeto de Software Orientado a Objetos
1 Design Patterns Israel Rios. 2 Origens A idéia de padrões de projeto não teve origem na ciência da computação Christopher Alexander A Pattern Language:
Jobson Ronan Padrões GoF Jobson Ronan
Introdução a Orientação a Objetos
Classes abstratas São classes das quais não se pode instanciar objetos. São classes das quais não se pode instanciar objetos. Seu objetivo é ser herdada.
1 - Introdução a Padrões de Projeto
Módulo II Capítulo 1: Orientação a Objetos
Padrões de Projetos Orientados a Objetos I Wolley W. Silva.
Padrões de Projeto. O que são?  Soluções provenientes de diversos projetos e utilizados por diversos programadores;  Documentados em catálogos como.
Padrões de Projeto de Criação Padrões de Projeto Orientados a Objetos Prof a. Danielle Martin Universidade de Mogi das Cruzes.
1 Padrões de Projeto de Software Orientado a Objetos Programação Orientada a Objetos Prof. Fabio Kon - IME/USP.
1 Introdução aos Padrões de Projetos Créditos: Prof. Fabio Kon - IME/USP Adaptações: Prof. Nécio de Lima Veras.
Introdução a Padrões de Projeto Padrões de Projeto Orientado a Objetos Profa. Danielle Martin Universidade de Mogi das Cruzes.
Programação Orienta a Objetos (SI) Análise e Projetos de Sistemas (LCC) 1 - Introdução a Padrões de Projeto Eduardo de Lucena Falcão.
Princípios de design SOLID Padrões de Projeto Orientados a Objetos Profa. Danielle Martin Universidade de Mogi das Cruzes.
Introdução a Padrões de Projeto Padrões de Projeto Orientado a Objetos Profa. Danielle Martin Universidade de Mogi das Cruzes.
Herança em Java Curso: Informática Disciplina: Programação Orientada a Objetos Prof. Abrahão Lopes
Padrões de Projeto.
Transcrição da apresentação:

1 Introdução aos padrões de projeto (GoF) Conceitos preliminares –Mecanismos de herança –Princípio de Substituição de Liskov –Acoplamento concreto x Acoplamento abstrato –Generalização x Delegação Agenda

2 Padrões GoF Erich Gamma et al catalogaram 23 padrões que podem ser aplicados ao desenvolvimento de sistemas de software OO. –Gamma, Helm, Johnson e Vlissides e seus colaboradores são conhecidos mundialmente como a Gangue dos Quatro (Gang of Four, GoF). Os padrões catalogados pela equipe GoF possuem diversos nomes alternativos: –Padrões de projeto –Padrões GoF –Padrões de desenho –Design patterns

3 Categorias de padrões GoF Padrões de projeto estão relacionados a –questões de comportamento de objetos –ciclo de vida de objetos –a interface dos objetos –relacionamentos estruturais entre objetos. Em função disso, os padrões GoF foram divididos em três categorias: –Criacionais: têm a ver com inicialização e configuração de objetos. –Estruturais: têm a ver com o desacoplamento entre a interface e a implementação de objetos. –Comportamentais: têm a ver com interações (colaborações) entre sociedades de objetos.

4 Categorias de padrões GoF Chain of Responsibility Command Interpreter Iterator Mediator Memento Observer State Strategy Template Method Visitor Adapter Bridge Composite Decorator Façade Flyweight Proxy Abstract Factory Builder Factory Method Prototype Singleton ComportamentaisEstruturaisCriacionais

5 Agenda Introdução aos padrões de projeto (GoF) Conceitos preliminares –Mecanismos de herança –Princípio de Substituição de Liskov –Acoplamento concreto x Acoplamento abstrato –Generalização x Delegação

6 Mecanismos de herança O recurso de herança em LP´s OO permite o reuso de conceitos predefinidos na definição de novos conceitos. Há basicamente três formas possíveis de utilizar herança: –Herança estrita (herança por extensão ou extensão simples) –Herança de interface (herança de especificação) –Herança polimórfica

7 Mecanismos de herança (cont.) Herança estrita –subclasse estende a superclasse, acrescentando novos membros (atributos e/ou métodos). –A superclasse permanece inalterada. Herança de interface –A superclasse especifica o que uma subclasse deve oferecer, mas não implementa nenhuma funcionalidade. –Apenas a interface da superclasse é herdada pela subclasse. –A classe herdeira tem que oferecer implementação para métodos que a superclasse (ou interface) tenha declarado mas não implementado.

8 Mecanismos de herança (cont.) Herança polimórfica –A subclasse herda a interface e uma implementação de (pelo menos alguns) métodos da superclasse. –A subclasse pode então redefinir métodos para especializar o comportamento em relação ao que é oferecido pela superclasse.

9 Mecanismos de herança em Java Herança Estrita –palavra-chave extends; para herança estrita, marcar todos os métodos da superclasse como final. Herança de Especificação –uma especificação é implementada como uma interface; subclasses da especificação usam a palavra-chave implements para indicar este tipo de herança. –separa interface e implementação –implementações podem ser transparentemente substituídas –Diminui o acoplamento Herança polimórfica –como a extensão simples, usa a palavra-chave extends. Usando na superclasse as palavras-chave final e abstract, é possível indicar que partes da superclasse não podem ser modificadas ou devem ser modificadas.

10 Princípio de Substituição de Liskov Liskov Substitution Principle (LSP), por Barbara Liskov, em Princípio: todas as classes derivadas de uma classe devem ser trocáveis quando usadas como a classe base. Exemplo: –Seja A uma classe e B uma de suas subclasses. Seja ainda o método m(A a) { … } –Se m se comporta corretamente quando o parâmetro é uma instância de A, ele deve se comportar corretamente quando o parâmetro é uma instância de B –Isso sem que m precise saber que existe a classe B

11 LSP – exemplo clássico Seja a classe abaixo. class Retangulo { protected double l, h; protected Point topEsquerdo; public double setAltura(double x) { h=x; } public double setComprimento(double x) { l=x; } public double getAltura() { return h; } public double getComprimento() { return l; } public double area() { return h*l; } … } Suponha que tenhamos várias aplicações clientes dessa classe…

12 LSP – exemplo clássico (cont.) Adicionando quadrados à aplicação… Um quadrado é um tipo de retângulo, certo? Então: –class Quadrado extends Retangulo { … } A princípio, não precisamos modificar o código cliente pré-existente. –e.g., void m(Retangle x) { … } não precisa de modificações quando da adição dessa nova classe Quadrado. Mas, há problemas com essa solução…podemos degenerar um quadrado! –Podemos criar um quadrado de comprimento e altura diferentes.

13 LSP – exemplo clássico (cont.) Uma segunda solução: redefinir os métodos setAltura e setComprimento na classe Quadrado. Veja a seguir. class Quadrado extends Retangulo { public void setAltura(double x) { h=x; l=x; } public void setComprimento(double x) { h=x; l=x; } Que tipo de herança é esse que estamos usando aqui?

14 LSP – exemplo clássico (cont.) Considere agora o trecho de código (cliente) a seguir: void m(Retangulo r) { r.setAltura(5); r.setComprimento(4); assert (r.area() == 20); } Quando temos apenas objetos retângulo, o código acima é válido; no entanto, este código não é válido quando, além de retângulos, temos também quadrados. Não há nada de errado com o método m O que está errado em Quadrado?

15 O papel do LSP LSP é um princípio bastante restritivo. Em geral, os desenvolvedores apóiam LSP e o têm como uma meta. Deve ser usado como um sinalizador –É possível e aceitável que se viole esse princípio, mas a violação deve ser examinada cuidadosamente. Depende do cliente da hierarquia de classes –e.g., se temos um programa no qual altura e comprimento nunca são modificados, é aceitável ter um Quadrado como uma subclasse de Retangulo. Square subclass of Rectangle e Elipse subclass of Circle têm sido fontes de guerras religiosas na comunidade OO por anos (vide

16 Acoplamentos concreto e abstrato Usualmente, um objeto A faz referência a outro B através do conhecimento da classe de B. –Esse tipo de dependência corresponde ao que chamamos de acoplamento concreto. Entretanto, há outra forma de dependência que permite que um objeto remetente envie uma mensagem para um receptor sem ter conhecimento da verdadeira classe desse último. –Essa forma de dependência corresponde ao que chamamos de acoplamento abstrato. –A acoplamento abstrato é preferível ao acoplamento concreto. Classes abstratas e interface permitem implementar o acoplamento abstrato.

17 Acoplamentos concreto e abstrato (cont)

18 Reuso através de generalização No reuso por generalização, subclasses que herdam comportamento da superclasse. –Exemplo: um objeto ContaCorrente não tem como atender à mensagem para executar a operação debitar só com os recursos de sua classe. Ele, então, utiliza a operação herdada da superclasse. Vantagem: fácil de implementar. Desvantagem: –Exposição dos detalhes da superclasse às subclasses (Violação do princípio do encapsulamento). –Possível violação do Princípio de Liskov (regra da substituição).

19 Reuso através de delegação A delegação é outra forma de realizar o reuso. Sempre que um objeto não pode realizar uma operação por si próprio, ele delega uma parte dela para outro(s) objeto(s). A delegação é mais genérica que a generalização. –um objeto pode reutilizar o comportamento de outro sem que o primeiro precise ser uma subclasse do segundo. O compartilhamento de comportamento e o reuso podem ser realizados em tempo de execução. Desvantagens: –desempenho (implica em cruzar a fronteira de um objeto a outro para enviar uma mensagem). –não pode ser utilizada quando uma classe parcialmente abstrata está envolvida.

20 Generalização versus delegação

21 Generalização versus delegação Há vantagens e desvantagens tanto na generalização quanto na delegação. De forma geral, não é recomendado utilizar generalização nas seguintes situações: –Para representar papéis de uma superclasse. –Quando a subclasse herda propriedades que não se aplicam a ela. –Quando um objeto de uma subclasse pode se transformar em um objeto de outra subclasse. Por exemplo, um objeto Cliente se transforma em um objeto Funcionário.