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
Download

PUC-SP