Aula 24 Programação Modular, POO e Padrões de Projeto

Documentos relacionados
Aula 23. Programação Orientada à Objetos vs. Programação Modular

Padrões de Projeto. Padrões de Projeto. Além dos 23 Padrões GoF. Os 23 Padrões de Projeto. Documentação de um Padrão. Classificação dos Padrões

Tópicos da Aula. POO e Padrões de Projetos. Considere três classes... Reuso de Classes. Locadora de DVD. Sistema Acadêmico

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos

Classes e Objetos. Sintaxe de classe em Java

Linguagem de Programação II Programação Orientada a Objetos. Orientação a Objetos

Classe Abstrata e Interface

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura

Orientação a objetos. Programação. Orientada a Objetos. Orientação a objetos. Orientação a objetos. Abstração e encapsulamento

Tipos, Literais, Operadores

Tipos, Literais, Operadores

Recapitulando. Construtores: (Overload assinatura) public Circle() {...} public Circle(double x, double y, double r) {... }

Orientação a Objetos e Java

Linguagem de Programação II Implementação

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

Linguagem de Programação Orientada a Objeto Polimorfismo, Classes Abstractas e Interfaces

Programação Orientada a Objetos em Java

Palavras Reservadas da Linguagem Java

Análise e Projeto Orientados por Objetos

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Programação Orientada a Objetos. Métodos e Atributos. Métodos. Métodos. Alexandre César Muniz de Oliveira. Parte III

Programação Orientada a Objetos. Professor: André Luis Meneses Silva br.geocities.com/programacao2ufs

Linguagem de Programação Orientada a Objeto Abstração - Encapsulamento

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

9 Classes Abstractas e Interfaces

Conceitos de Programação Orientada a Objetos

Mas o que é mesmo Padrão de Projeto?

Profa. Thienne Johnson

INF1337 LINGUAGEM DE PROGRAMAÇÃO ORIENTADA A OBJETOS

Análise de Programação

Linguagem de Programação IV Introdução

Paradigmas de Linguagens de Programação. Suporte para Programação Orientada a Objeto

PROGRAMAÇÃO ORIENTADA A OBJETOS JAVA

Singleton e Adapter. Professor: Nazareno Andrade (baseado no material de Hyggo Almeida e Jacques Sauvé)

Programação com Objectos. Processamento de Dados I. 2. Classes, Atributos e Métodos

Computação II Orientação a Objetos

UNIFEI Disciplina Professor

Interfaces. Universidade Católica de Pernambuco Ciência da Computação. Prof. Márcio Bueno.

Engenharia de Software

Lista 05 Herança. public class PessoaFisica extends Pessoa { private String RG; public PessoaFisica(){ super(); } public String getrg(){ return RG; }

Java First-Tier: Aplicações. Herança: Simples Múltipla. Orientação a Objetos em Java (III) Problemas de Herança Múltipla.

Instituto Federal de Educação, Ciência e Tecnologia do Ceará IFCE Programa Educacional Brasileiro de Desenvolvimento para ios BEPiD PROVA OBJETIVA

Classes e Objetos INTRODUÇÃO À ORIENTAÇÃO A OBJETOS COM JAVA - MÓDULO II. Classes. Objetos. Um modelo para a criação de objetos

Computação II Orientação a Objetos

Programação Orientada a Objetos

Interfaces POO. Prof. Marcio Delamaro

Linguagens de Programação Aula 12

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

4 Conceito de Herança

Universidade da Beira Interior Cursos: Engenharia Informática, Matemática /Informática e Ensino da Informática

Linguagem de Programação II Implementação

Laboratório de programação II

Universidade Federal de Uberlândia Faculdade de Computação Programação Orientada a Objetos II Prof. Fabiano Dorça. Padrão Observer (Observador)

Introdução. LP OO desenvolvida pela Sun no início da década de 90 com sintaxe semelhente a C\C++. C C++.

Introdução à orientação a objetos. João Tito Almeida Vianna 18/05/2013

Linguagem de Programação III

Relacionamentos entre objetos

Herança. Fátima L. S. Nunes Luciano A. Digiampietri Norton T. Roman SISTEMAS DE INFORMAÇÃO 1

Conceitos de Linguagens de Programação - Características. Paavo Soeiro

Linguagem de Programação III

Algoritmos e Programação 2. Objetos e Classes em Java. Classes. Revisão. Definições de classes incluem (geralmente):

Instituto Superior de Engenharia de Lisboa

Construtores e Especificadores de Acesso

Interfaces e Classes Abstratas

Computação II Orientação a Objetos

Padrões de Design. Padrões de Design. Abstract Factory. Padrões de Design. Padrões de Design Abstract Factory. Abstract Factory.

Herança. Herança. Herança. Herança. Herança. Programação Orientada a Objetos

PADRONIZAÇÃO 10. INTERFACES PADRONIZAÇÃO CONTRATOS

A figura abaixo representa uma classe denominada Carteira. Esta classe é composta dos métodos depositar(valor) e retirar(valor) e do atributo saldo.

Programação Estruturada e Orientada a Objetos

Modelo do Mundo Real. Abstração. Interpretação

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Tipos Básicos. Operadores de Incremento e Decremento. Operador Sizeof. Estruturas de Dados Aula 2: Estruturas Estáticas

Fundamentos Básicos da linguagem Java (Programação Orientada a Objetos) Prof. Responsáveis Wagner Santos C. de Jesus

Estruturas de Dados Aula 2: Estruturas Estáticas. Tipos Básicos. Quantos valores distintos podemos representar com o tipo char?

Módulo III Padrões GOF

Estruturas de Dados Aula 2: Estruturas Estáticas 02/03/2011

Introdução. Universidade Federal de Uberlândia. Programação Orientada a Objetos. Prof. Fabiano Dorça

Iteradores. Iteradores. Isabel Harb Manssour. Roteiro. Coleções

Esta categoria mais geral, à qual cada objeto pertence, denominamos de classe; IFSC/POO + JAVA - prof. Herval Daminelli

POO29004 Programação Orientada a Objetos

Programação por Objectos. Java

UNIVERSIDADE PAULISTA - UNIP ICET INSTITUTO DE CIÊNCIAS EXATAS E TECNOLÓGIA

Introdução ao Java. Prof. Herbert Rausch Fernandes

Herança. Universidade Católica de Pernambuco Ciência da Computação. Prof. Márcio Bueno.

Programação: Vetores

Linguagem de Programação III

Programação Java. Marco Fagundes. - Herança, Classes Abstratas e Interfaces Marco Fagundes -

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Programação Orientada a Objetos com Java. Prof. Júlio Machado

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

Programação. Orientada a Objetos: Herança. Objetos. Relacionamento entre classes. Análise e Projeto Orientados a. Objetos

Transcrição:

Aula 24 Programação Modular, POO e Padrões de Projeto Alessandro Garcia LES/DI/PUC-Rio Junho 2010 Diferenças entre... Módulos (em C) e Classes (Linguagens OO) Classes possuem um operador de instanciação explícito Hierarquia de classes Uso de herança para reuso de estrutura e comportamento C: reuso somente através de chamadas de funções Suporte direto a funções polimórficas (polimorfismo) Destruição de objetos (desalocação de memória) em algumas linguagens OO é feita de forma automática Suporte direto a definição de interfaces... Nov 2009 Alessandro Garcia LES/DI/PUC-Rio 2/ 27 1

Interfaces (em Java) Interfaces As interfaces definem assinaturas de conjuntos de métodos, mas não os implementam tem o papel do módulo de declaração (*.h)... mas permite definir interfaces reutilizáveis (p.e. serializable) Interface é uma especificação que permite que classes, não diretamente relacionadas na mesma hierarquia, possam incorporar propriedades similares Uma classe que implemente a interface deve implementar TODOS os métodos definidos nesta public interface Sleeper { public void wakeup(); public long ONE_SECOND = 1000; // milli Nov 2009 Alessandro Garcia LES/DI/PUC-Rio 3/ 27 Diferenças entre... Módulos (em C) e Classes (Linguagens OO) Classes possuem um operador de instanciação explícito Hierarquia de classes Uso de herança para reuso de estrutura e comportamento C: reuso somente através de chamadas de funções Destruição de objetos (desalocação de memória) em algumas linguagens OO é feita de forma automática Suporte direto a definição de interfaces... Linguagens OO: melhor controle de visibilidade (graus de encapsulamento) exemplo: Java... Nov 2009 Alessandro Garcia LES/DI/PUC-Rio 4/ 27 2

Visibilidade de membros da classe Controlando o acesso aos membros da classe Especificador classe subclasse pacote todos private X protected X X X public X X X X default X X Nov 2009 Alessandro Garcia LES/DI/PUC-Rio 5/ 27 Pacotes (em Java) Pacotes Para facilitar o uso, controle de acesso e controle de conflito de nomes, os programadores agrupam classes e interfaces relacionadas em pacotes Para definir qual pacote uma classe pertence, basta incluir no início arquivo da classe a linha: package nomepacote; Os pacotes necessários a uma classe devem ser incorporados através do comando import similar ao include Nov 2009 Alessandro Garcia LES/DI/PUC-Rio 6/ 27 3

Abstract e Final Métodos Abstract: não possuem implementação e devem ser implementados pelas subclasses classe deve ser definida como abstract quando possuir pelo menos um método abstrato Métodos Final: não podem ser sobrescritos é válido estender uma classe não marcada como final mas não podemos sobrescrever seus métodos final Erro de compilação Nov 2009 Alessandro Garcia LES/DI/PUC-Rio 7/ 27 Membros estáticos de uma classe Métodos e variáveis estáticos Declarados com o especificador static São comuns a todos os objetos da classe Utilizados para declaração de constantes t Utilizados para declaração de métodos que não necessitam de uma instância da classe static int FALSO 0; static int VERDADEIRO 1; public static boolean testa( int p ) { if( p == this.verdadeiro ) return( true ); else return( false ); Nov 2009 Alessandro Garcia LES/DI/PUC-Rio 8/ 27 4

Diferenças entre... Módulos (em C) e Classes (Linguagens OO) Classes possuem um operador de instanciação explícito Hierarquia de classes Uso de herança para reuso de estrutura e comportamento C: reuso somente através de chamadas de funções Destruição de objetos (desalocação de memória) em algumas linguagens OO é feita de forma automática Suporte direto a definição de interfaces... Linguagens OO: melhor controle de visibilidade (graus de encapsulamento) exemplo: Java... Suporte direto à funções polimórficas É possível a implementação de funções polimórficas em C? Nov 2009 Alessandro Garcia LES/DI/PUC-Rio 9/ 27 Polimorfismo em C? Função como um dado Uma função definida é uma seqüência de bytes contida em um espaço de dados usualmente contíguo em geral, não alterável constante possui um nome usualmente o nome da função possui um endereço origem de execução nome da função Função de acesso( x, y,..., z ) Meio Endereço do espaço Tamanho Espaço de dados possui também um tipo... 10 / 32 5

Função como um dado O tipo de uma função é estabelecido pela sua assinatura física valor retornado lista dos tipos de parâmetros os nomes dos parâmetros não fazem parte da assinatura o nome da função não faz parte da assinatura exemplo: int ( int, double ) Uma função A será do mesmo tipo que a função B caso ambas tenham a mesma assinatura programador deve garantir que exista uma igualdade semântica 11 / 32 Dado tipo ponteiro para função Em C e C++ podem ser definidas variáveis do tipo ponteiro para função exemplo: int (* VarF1 )( int, double ) VarF1 é um ponteiro para função do tipo: int ( int, double ) Exemplo de atribuição int Func( int X, double Y ) {... /* Func */ Func é uma constante do tipo ponteiro para uma função do tipo: int ( int, double ) main(...) { VarF1 = Func ; 12 / 32 6

Exemplo simples: integração por trapézio Seja f(x) uma função contínua em [a, b] h ITR 2 o problema da integração numérica consiste em calcular um valor aproximado para I b x dx solução: calcular a integral f ( ) limite superior aproximada através da regra dos trapézios f0 2 f1 f2 f3 fm2 fm1 limite inferior i Parâmetros: - número de interações: 8 - limites inferior e superior: 0 e m - e a própria função f Y fm a função a ser integrada Exemplo: f(x) = 2 * x double 0 1 2 3 4 5 6 7 8 f A B X Maio 2009 Alessandro Garcia 0 f 1 f LES/DI/PUC-Rio 1 f 2 f 2 f 3 f 3 f m 13 / 32 Exemplo simples: integração /* Função de integração numérica utilizando regra dos trapézios */ double Integrar( double LimInf, double LimSup, int NumInt, double ( * Func )( double X )) { double Integral = 0.0 ; Y double Intervalo ; int i ; assert( NumInt >= 2 ) ; Intervalo = ( LimSup - LimInf ) / ( NumInt - 1 ) ; Integral += Func( LimSup ) ; Integral += Func( LimInf ) ; for ( i = 1 ; i < NumInt - 1 ; i++ ) { Integral += 2 * Func( Intervalo * i ) ; /* for */ Integral *= Intervalo/2; return Integral ; /* Integrar */ h ITR 2 f0 2 0 1 2 3 4 5 6 7 8 A B X f1 f2 f3 fm2 fm1 fm 14 / 32 7

Exemplo simples: integração, uso /* exemplo de uso */ double Quadrado( double X ) { return X ** 2 ; double Cubo( double X ) { return X ** 3 ; printf( \n F = x ** 2 de x=1 a x=10: %lf, Integrar( 1.0, 10.0, 20, Quadrado )) ; printf( \n F = x ** 3 de x=1 a x=10: %lf, Integrar( 1.0, 10.0, 20, Cubo )) ; 15 / 32 Função como um dado A assinatura pode estar associada a um de vários corpos na hora da chamada é estabelecida a associação da chamada estática (tempo de compilação), caso normal de linguagens procedurais dinâmica (tempo de execução), caso freqüente em linguagens orientadas a objetos Assinatura F( int ) Chama F( float ) Associação da chamada Assinatura *F( float ) Associação dinâmica Associação estática Corpo F( float ) Corpo F( float ) Corpo F ( int ) 16 / 32 8

Da aula passada... Para aula de hoje... Objetivos discutir os conceitos de programação orientada a objetos (OO) do ponto de vista de programação modular o que são padrões de projeto? discutir como projetar programas C de forma reusável com padrões de projeto (ex. esquemas de algoritmos, estruturas de cabeças, etc...) discutir como projetar programas OO de forma reusável com padrões de projeto fazem sentido em programação modular em C? 17 / 27 Sumário Introdução à padrões de projeto Padrões de projeto em C Estrutura cabeça Esquemas de algoritmo: Pesquisa Binária Iterador Padrões de projeto OO Singleton Adapter Observer Etc... 18 / 27 9

Iterador: exemplo de esquema de algoritmo Problema: como seqüencialmente acessar os elementos de um conjunto de dados (ordenado ou não), expondo o mínimo possível da sua representação interna? Solução de projeto: Um iterador (função geradora) é um esquema de algoritmo composto por: tipo tpestado: o descritor (tipo) do estado possivelmente define uma constante: ESTADO_NIL um ou mais tipos tpvalorx que determinam o tipo dos elementos acessados pela correspondente função: tpvalorx ObterValorX( tpestado,...) E.g. indice atual de um valor sendo percorrido valores acessíveis à partir do escritor do estado função tpestado DefinirPrimeiro(... ) função tpestado DefinirProximo( tpestado,... ) função boolean Terminou( tpestado,... ) 19 / 27 Iterador: exemplo pesquisa em tabela Esquema do algoritmo para pesquisa em qualquer tabela tpestado Corrente ; Corrente = DefinirPrimeiro( ValorProcurado ) ; while (!Terminou( Corrente )) { if ( Comparar( ObterValor( Corrente ), ValorProcurado ) == EH_IGUAL ) { return Corrente ; /* if */ Corrente = DefinirProximo(Corrente, ValorProcurado); /* while */ return ESTADO_NIL ; 20 / 27 10

Padrões de projeto Servem para resolver problemas/perguntas recorrentes em projeto (e programação) de software Exemplo: como implementar um mecanismo de observação? Estabelecem soluções elegantes para tais problemas definem papéis/participantes (módulos conceituais) a serem implementados soluções não são suportadas diretamente por uma primitiva única da linguagem (p.e. Singleton) provêem exemplos em uma linguagem de programação (p.e. Java) Através de nomes/metáforas, um catálogo de padrões permite estabelecer um idioma entre programadores Comunicação eficiente: Vamos usar o padrão Adapter para Estabelece as conseqüências positivas e negativas de usar aquele padrão: reuso, manutenibilidade, segurança, performance, etc... 21 / 27 Padrões de projeto Padrões de problemas Exemplos de padrões de projeto OO: Singleton Strategy Padrões de soluções Adapter Template Method Observer State Vantagem: reuso e manutenibilidade do código genérico dos padrões de um projeto para outro dentro de um projeto, poder have várias instâncias do mesmo padrão História: desde os anos 90, padrões OO em engenharia de software 1995, Gang of Four (Gamma, Helm, Johnson, Vlissides): Design Patterns: Elements of Reusable Object-Oriented Software criação (Singleton), estrutural (Adapter), comportamental (Observer) 22 / 27 11

Criação: Padrão Singleton (Objeto Unitário) 1a instanciação Objeto único da classe singleton Classe Singleton Instanciações subsequentes 23 / 27 Padrão Singleton (Objeto Unitário) Uma classe singleton sempre tem uma variável estática privada para manter a instância única Um construtor privado SecurityManager private static SecurityManager uniqueinstance // other attributes private SecurityManager( ) public static SecurityManager getinstance( ) // other methods Um método público estático para invocar o construtor privado se uniqueinstance é null; caso contrário, retorna uniqueinstance 24 / 27 12

Padrão Strategy (Estratégia) Encapsula variantes de um algoritmo relacionados em classes que são subclasses de uma classe comum Permite a seleção de algoritmo variar por objeto e também no decorrer do tempo estratégias podem variar de forma independente de clientes evita tornar complexa a classe contexto com diferentes algoritmos (e respectivas estruturas de dados) para o mesmo propósito Forma Geral: Java: pode ser uma classe abstrata ou interface 25 / 27 Padrão Estratégia Exemplo 1 qual padrão/conceito poderia ser usado em combinação com o padrão Estratégia? número de métodos abstratos pode variar de aplicação para aplicação 26 / 27 13

Padrão Estratégia Exemplo 2 número de métodos abstratos pode variar de aplicação para aplicação 27 / 27 Padrão Estratégia Exemplo 2 public class BubbleSort implements SortStrategy { public void sort(double[] list) { double temp; for(int i = 0; i < list.length; i++) { for(int j = 0; j < list.length - i; j++) { if(list[i] < list[j]) { temp = list[i]; list[i] = list[j]; list[j] = temp; 28 / 27 14

Padrão Estratégia Exemplo 2 public class QuickSort implements SortStrategy { public void sort(double[] a) { quicksort(a, 0, a.length - 1); private void quicksort(double[] a, int left, int right) { if (right <= left) return; int i = partition(a, left, right); quicksort(a, left, i-1); quicksort(a, i+1, right); private int partition(double[] a, int left, int right) { ; 29 / 27 Padrão Estratégia Exemplo 2 Sorting Client public class SortArray { Context private SortStrategy sorter = null; public void sortdouble(double[] list) { sorter.sort(list); public SortInterface getsorter() { return sorter; public void setsorter(sortstrategy sorter) { this.sorter = sorter; public class SortingClient { public static void main(string[] args) { double[] list = {1,2.4,7.9,3.2,1.2,0.2, ; SortArray context = new SortArray(); context.setsorter(new BubbleSort()); context.sortdouble(list); for(int i =0; i< list.length; i++) { System.out.println(list[i]); context.setsorter(new QuickSort()); context.setsorter(new InsertionSort()); 30 / 27 15

Padrão Estratégia Conseqüências Benefícios evolução modular das estratégias permite facilmente a troca dinâmica das estratégias para o mesmo contexto qual mecanismo de OO permite isso? é possível em C? desvantagens aumenta o número de objetos pode ter um efeito negativo sobre performance devido a criação de objetos para cada troca de estratégia todos algoritmos devem em usar a mesma interface Strategy nem sempre é natural ou possível 31 / 27 Comportamental: Padrão Observer Observadores Sujeito Observado - Sujeito é independente dos observadores - Observadores são atribuidos dinamicamente aos observados - Sujeito informa observadores sobre suas mudanças de estado 32 / 27 16

Comportamental: Padrão Observer variantes: uso de interfaces ou classes abstratas 33 / 27 Padrão Observer O Padrão Observer paper subject : elemento do sistema sendo observado mantém referências para os observadores notifica os observadores que mudanças ocorreram <<interface>> Subject addobserver removeobserver notify Figure 1 FigureElement * <<interface>> Observer update * * Members exclusively dedicated to the pattern Point observers getx gety getcolor addobserver removeobserver notify setx sety setcolor Line observers getp1 getp2 getcolor * addobserver removeobserver notify setp1 setp2 setcolor Screen update Display Methods including some code relative to the pattern * 34 / 27 17

Estrutural: Padrão Adaptador A função de um adaptador é tornar possível a conexão de dois objetos: a tomada e o plugue de diferentes países converte a interface de uma classe (A) em outra interface (B) que clientes (C) conhecem Classes adaptadoras permitem duas classes (com interfaces originalmente incompatíveis) interagirem provided interface classe (componente) existente (funcionalidade externa) objeto cliente Tomada Alemã required interface A B C Adaptador Plugue UK 35 / 27 Padrão Adapter (Adaptador) Permite que uma aplicação utilize funcionalidades externas Uma classe Adapter implementa uma interface conhecida dos clientes e permite acesso a instâncias de uma classe não conhecida dos clientes. Exemplo: Writer <<inteface>> adaptado SystemOutPrinter printtosystemout(string s) Client writerobject.write() write () adaptador PrinterAdapter adaptee write() 36 / 27 18

Aula 24 Programação Modular com Padrões de Projeto Alessandro Garcia Alessandro Garcia LES/DI/PUC-Rio Junho 2010 19