Modelagem com Tipos de Objetos • Introdução Modelagem com Tipos de Objeto Prof. Dr. Italo Santiago Vega Dezembro de 2000 PUC-SP • Padrões representam soluções para problemas que aparecem durante o desenvolvimento de software. • Padrões descrevem conhecimento especializado e decisões de projeto no nível de modelagem (“know-how”). • Atuam como exemplares a serem seguidos, mostrando “como fazer as coisas adequadamente”. Depto. de Ciência da Computação www.pucsp.br/~italo Fonte: FAQ de discussão de padrões - g.oswego.edu/dl/pd-FAQ/pd-FAQ.html Copyright, 2000 © ISV Níveis de Aprendizagem Nível Estágio 1 Aprendizagem de regras Nomes das peças, movimentos legais, geometria do tabuleiro, etc. Algoritmos, estruturas de dados e linguagens de programação. Aprendizagem de princípios Valor relativo das peças, valor estratégico das casas centrais, etc. Modularidade, orientação a objetos, contratos, etc. 2 3 Aprendizagem de padrões Mestre em Xadrez Biblioteca de Classes Mestre em Projeto SW Estudar os jogos de outros mestres. Estes jogos contém padrões que devem ser entendidos, memorizados e aplicados repetidamente. Estudar os padrões dos projetos de outros mestres. Lógica Específica da Aplicação ATIVAÇÃO Matemática Interface do Usuário Banco de Dados Framework FLUXO UNIDIRECIONAL DE CONTROLE Padrões e Frameworks Rede / Interface do Usuário Lógica Específica da Aplicação Rede Matemática Malha de Eventos Fonte: Douglas Schmidt - www.cs.wustl.edu/~schmidt/cs242/learning.html Biblioteca Padrão Biblioteca Padrão Call Backs • Framework é feito de software. Malha de Eventos Banco de Dados – Realização física de uma solução. • Padrão de projeto representa conhecimento, informação e experiência sobre software. – Instruções de como realizar uma solução. FLUXO BIDIRECIONAL DE CONTROLE (C) 2000 isv •1 Modelagem com Tipos de Objetos • Tópicos • Modelagem de Tipos de Objetos • Modelagem com Polimorfismo • Padrão “Visitor” • Meta-modelagem Modelagem de Tipos de Objetos Total: 55 min. 10 min. Modelo da Casa Situação I Casa • Uma casa é composta por três aposento: um quarto, um banheiro e uma cozinha. • Deseja-se saber a área de cada um destes três aposentos. mostrar() Casa aposento[0] Banheiro Cozinha tamanho() tamanho() true false tamanho = ((Quarto) aposento[i] ).tamanho(); return “MÉDIO”; • Polimorfismo INEXPLORADO! tamanho = ((Cozinha) aposento[i] ).tamanho(); true false tamanho = ((Banheiro) aposento[i] ).tamanho(); aposento[ i ] instanceof Banheiro true false return “GRANDE”; Qual o Problema? false aposento[ i ] instanceof Cozinha tamanho() Cozinha Método Casa.mostrar() aposento[ i ] instanceof Quarto true aposento[2] Banheiro Quarto return “PEQUENO”; i = 0; i < aposento.length; i++ aposento[1] Quarto Objeto polimórfico: exibe diferentes realizações. Elementos do vetor “aposento” tornamse uma “instance of” da classe real que os fabricou... System.out.println( tamanho ); (C) 2000 isv •2 Modelagem com Tipos de Objetos • Correção I aposento 3 Casa {abstract} Aposento {abstract} tamanho() mostrar() Modelagem com Polimorfismo «subclass» Quarto Cozinha tamanho() tamanho() return “PEQUENO”; return “MÉDIO”; Banheiro tamanho() return “GRANDE”; 10 min. Método Casa.mostrar() i = 0; i < aposento.length; i++ tamanho = aposento[ i ].tamanho( ); true false Funciona? Como o sistema “adivinha” o tipo de cada objeto da sala? Qual versão do método “tamanho” será ativada? Oops...!? Será que ele sabe o que é vinculação dinâmica de algoritmos? System.out.println( tamanho ); Tipos Estáticos e Dinâmicos aposento[ 0 ] / Aposento : Quarto :Casa aposento[ 1 ] / Aposento : Conzinha mostrar( ) tamanho( ) “PEQUENO” tamanho( ) Objeto Polimórfico Objeto polimórfico: tipo dinâmico “escondido” sob o tipo estático (do ancestral). Tipo dinâmico =Quarto Tipo estático =Aposento “MÉDIO” (C) 2000 isv •3 Modelagem com Tipos de Objetos • Polimorfismo por Modelagem aposento 3 Casa Define o tipo estático de cada posição do vetor de aposentos da casa. {abstract} Aposento Padrão “Visitor” «subclass» Quarto Define o tipo dinâmico de cada posição do vetor de aposentos da casa. 20 min. Método Casa.inspecionar() ??? Situação II: Inspeção Seletiva Arquiteto • Novo requisito: “devese poder visitar cada aposento da casa, de modo que: Casa Bombeiro Bombeiro visitar( x : Aposento ) bombeiro visitar( x : Banheiro ) arquiteto Banheiro – um arquiteto possa visitar todos, e – um bombeiro visite apenas o banheiro”. COLISÃO !!! Casa Quarto Arquiteto visitar( a : Aposento ) arquiteto.visitar( a ); Cozinha 3 bombeiro.visitar( a ); aposento {abstract} Aposento Correção !? Arquiteto visitar( x : Aposento ) Extensões Bombeiro bombeiro visitar( x : Banheiro ) arquiteto Casa visitar( a : Aposento ) arquiteto.visitar( a ); if ( sala instanceof Banheiro ) 3 aposento {abstract} Aposento (C) 2000 isv bombeiro.visitar( (Banheiro) a ); • E se a casa for reformada, de modo a ter uma “sala de música”: – visitada apenas por um especialista em acústica? Casa Bombeiro Banheiro Sala de Música Quarto Arquiteto Cozinha Especialista em Acústica •4 Modelagem com Tipos de Objetos • Problema da Manutenção Modelo OO ??? EspecialistaEmAcustica • Pergunta: onde se deve alocar a responsabilidade da “visitar a casa”? visitar( x:SalaDeMusica ) especialista arquiteto.visitar( a ); Casa if ( sala instanceof Banheiro ) bombeiro.visitar( (Banheiro) a ); visitar( a : Aposento ) if( sala instanceof SalaDeMusica ) especialista.visitar( (SalaDeMusica) a ); 3 aposento – Modelo atual: é a casa que se responsabiliza pela “visita”. – Ela seleciona e visita cada aposento, usando o seu método visitar( ). {abstract} Aposento if ( sala instanceof Banheiro ) bombeiro.visitar( (Banheiro) a ); Padrão “Visitor” • Mudança de paradigma: cada aposento deve saber como conduzir a própria visita ! • Introduz-se a operação visitar( ) no aposento... • O arquiteto visita qualquer aposento! Conseqüência: Estilo clássico da decomposição funcional !!! Funções que atuam sobre dados passivos. Substituição de Métodos (Override) • O bombeiro visita apenas banheiros... {abstract} Aposento visitar() «subclass» Banheiro super.visitar( this ); (C) 2000 isv visitar( a : Aposento ) CAST !!! Dados Passivos bombeiro.visitar( this ); Casa visitar() Banheiro substitui o método “visitar( )”por uma versão mais específica. {abstract} Aposento visitar( ) arquiteto.visitar( this ); Método Casa.visitar() !!! Casa visitar( a : Aposento ) a.visitar( ); 3 aposento {abstract} Aposento •5 Modelagem com Tipos de Objetos • Conseqüências • Inserção da classe SalaDeMúsica na família de subclasses de Aposento (com substituição do método visitar() ) ... • Benefícios do efeito polimórfico: Meta-modelagem – Extensibilidade “escalar” (o processo de introdução de novas classes é similar). – Maior encapsulação (reduz a necessidade de alterar classes préexistentes, quando novas são acrescentadas). – não provoca alteração na classe Aposento . 10 min. Modelagem de Tipo por “Seletor” Quantidade de Banheiros Casa • A casa foi ampliada com mais banheiros. • Como saber quantos banheiros existem na casa? {abstract} Aposento aposento Casa 5 tipo : { ID_BANHEIRO } totalBanheiros() : int ehBanheiro() : boolean Banheiro return false; Banheiro «subclass» Sala de Música Quarto return tipo == ID_BANHEIRO; Cozinha ehBanheiro() : boolean Método Casa.totalBanheiros() Alteração da classe “Casa”. total=0; i = 0; i < sala.length; i++ false return total; sala[ i ].ehBanheiro() true true Banheiro Extensões... • E se for necessária a contagem de salas de música (Casa.totalSalasDeMusica()) ? total++; Casa false totalBanheiros( ) : int totalSalasDeMusica( ) : int (C) 2000 isv •6 Modelagem com Tipos de Objetos • Modelagem de Tipo por “Seletor” aposento Casa 5 Método Casa.totalBanheiros() i = 0; i < sala.length; i++ tipo : { ID_BANHEIRO, ID_MUSICA } totalBanheiros() : int ehBanheiro() : boolean ehSalaDeMusica():boolean return false; false «subclass» return tipo == ID_MUSICA; Sala de Musica ehSalaDeMusica() : boolean Alteração da classe “Casa”. total=0; {abstract} Aposento sala[ i ].ehSalaDeMusica( ) true false return total; Banheiro ehBanheiro() : boolean Similaridade Estrutural do Algoritmo Caracterização do Processo de Extensão Este é o “parâmetro”do algoritmo de contagem de banheiros, salas de música, etc. 1) Inserir um novo “enumerado”de identificação de tipos. {abstract} Aposento <novo identificador de tipo> <novo seletor de tipo> <teste de verificação do tipo> false true 2) Inserir uma nova operação de seleção de tipo. true false return total; «subclass» {abstract} <Novo Aposento> 3) Alterar / acrescentar a classe do novo tipo. Natureza do Problema de Manutenção • Testa-se um valor que representa um conjunto finito de tipos. Tipos de Aposentos Cozinha Banheiro (C) 2000 isv total++; true Sala de Música Quarto Solução por Objetos • Como testar um valor que deve representar um conjunto infinito de tipos? INFINITOS Tipos de Aposentos Cozinha Banheiro Sala de Música Quarto <novo seletor de tipo> ? • A meta-classe Classe deve oferecer a identificação de cada nova classe utilizada pelo ambiente de execução do sistema. Encontra-se no meta-nível do modelo OO !!! Class class : Class Aposento.class == Aposento Banheiro.class == Banheiro {abstract} Aposento Banheiro •7 Modelagem com Tipos de Objetos • Método Casa.totalBanheiros() Verificação se o aposento é um banheiro !!! total=0; i = 0; i < sala.length; i++ Volta para o Início ? i = 0; i < sala.length; i++ sala[ i ].class == Banheiro total++; true true false sala[ i ] instanceof Banheiro total++; true true false false return total; OPS !!! total=0; false return total; Framework Biblioteca Padrão Considerações Finais Rede / Interface do Usuário Lógica Específica da Aplicação Frameworks Padrão “Visitor” Meta-nível Matemática Banco de Dados 5 min. FLUXO BIDIRECIONAL DE CONTROLE Estrutura do “Visitor” Visitante Elemento visitarA( A ) visitarB( B ) aceitar( Visitante ) Call Backs Malha de Eventos Dinâmica da Colaboração ? a:A b:B : Visitante aceitar( :Visitante ) visitar( a ) operaçãoA( ) v.visitarA( this ) Fonte: GOF (C) 2000 isv A B aceitar( v:Visitante ) operaçãoA( ) aceitar( v:Visitante ) operaçãoB( ) aceitar( :Visitante ) visitar( b ) operaçãoB( ) Fonte: GOF •8 Modelagem com Tipos de Objetos • Meta-nível: Classe Class Exemplo Comum você táxi você Class aceitar( você ) visitar( táxi ) destino( ) class : Class O táxi está no controle do transporte. Bibliografia Modelagem com Tipos de Objeto • GAMMA, E. et. al.; Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, 1995. • JÉZÉQUEL, J-M.; TRAIN, M.; MINGINS, C.; Design Patterns and Contracts. Addison-Wesley, 2000. • VEGA, I. S.; Apontamentos de “Análise e Projeto OO”. Curso de Pós-graduação em “Qualidade no Desenvolvimento de Software”, SENAC, 1999. Prof. Dr. Italo Santiago Vega Dezembro de 2000 PUC-SP Depto. de Ciência da Computação www.pucsp.br/~italo Copyright, 2000 © ISV (C) 2000 isv •9