Buscar

15 - Abstração Genérica

Prévia do material em texto

Abstração	
  Genérica	
  
Renata	
  Carvalho	
  
UNICAP	
  –	
  UNIVERSIDADE	
  CATÓLICA	
  DE	
  PERNAMBUCO	
   Renata	
  Carvalho	
  
Unidades	
  genéricas	
  e	
  instanciação	
  
•  Uma	
  unidade	
  genérica	
  é	
  uma	
  unidade	
  de	
  
programa	
  que	
  é	
  parametrizada	
  em	
  relação	
  às	
  
enKdades	
  das	
  quais	
  ela	
  depende	
  
•  A	
  instanciação	
  de	
  uma	
  unidade	
  genérica	
  cria	
  uma	
  
unidade	
  de	
  programa	
  ordinária,	
  na	
  qual,	
  cada	
  
parâmetro	
  formal	
  da	
  unidade	
  é	
  trocado	
  por	
  um	
  
argumento	
  
•  Gera	
  sob	
  demanda	
  uma	
  família	
  de	
  unidades	
  de	
  
programas	
  similares	
  evitando	
  a	
  redundância	
  de	
  código	
  
•  Favorece	
  a	
  reusabilidade	
  porque	
  uma	
  mesma	
  unidade	
  de	
  
programa	
  pode	
  ser	
  instanciada	
  em	
  diferentes	
  programas	
  
Unidades	
  
genéricas	
  e	
  
instanciação	
  
Exemplo	
  
Tipos	
  e	
  classes	
  
parâmetros	
  
Exemplo:	
  
classe	
  genérica	
  
em	
  Java	
  
Notas	
  de	
  
Implementação	
  
UNICAP	
  –	
  UNIVERSIDADE	
  CATÓLICA	
  DE	
  PERNAMBUCO	
   Renata	
  Carvalho	
  
Unidades	
  genéricas	
  e	
  instanciação	
  
•  Unidades	
  genéricas	
  seguem	
  o	
  princípio	
  da	
  
abstração	
  
•  Uma	
  unidade	
  genérica	
  é	
  uma	
  abstração	
  sobre	
  uma	
  
declaração	
  
•  Possui	
  um	
  corpo	
  –	
  a	
  declaração	
  –	
  e	
  uma	
  instanciação	
  
genérica	
  é	
  uma	
  declaração	
  que	
  produzirá	
  ligações	
  pela	
  
elaboração	
  do	
  corpo	
  da	
  unidade	
  genérica	
  
•  Unidades	
  genéricas	
  são	
  suportadas	
  por	
  Ada,	
  	
  	
  
C++	
  e	
  Java	
  em	
  diferentes	
  perspecKvas	
  
Unidades	
  
genéricas	
  e	
  
instanciação	
  
Exemplo	
  
Tipos	
  e	
  classes	
  
parâmetros	
  
Exemplo:	
  
classe	
  genérica	
  
em	
  Java	
  
Notas	
  de	
  
Implementação	
  
UNICAP	
  –	
  UNIVERSIDADE	
  CATÓLICA	
  DE	
  PERNAMBUCO	
   Renata	
  Carvalho	
  
Exemplo	
  
•  C++	
  suporta	
  funções	
  genéricas	
  (func%on	
  
templates)	
  e	
  classes	
  genéricas	
  (class	
  templates)	
  
template	
  
	
  <int	
  capacity>	
  
class	
  Queue	
  {	
  
	
  
private:	
  
	
  char	
  elems[capacity];	
  
	
  int	
  front,	
  rear,	
  length;	
  
	
  
public:	
  
	
  Queue();	
  
	
  void	
  add	
  (char	
  e);	
  
	
  char	
  remove();	
  
}	
  
Parâmetro	
  formal	
  da	
  classe	
  	
  
genérica	
  –	
  denota	
  um	
  valor	
  	
  
inteiro	
  a	
  ser	
  conhecido	
  durante	
  	
  
a	
  instanciação	
  
Unidades	
  
genéricas	
  e	
  
instanciação	
  
Exemplo	
  
Tipos	
  e	
  classes	
  
parâmetros	
  
Exemplo:	
  
classe	
  genérica	
  
em	
  Java	
  
Notas	
  de	
  
Implementação	
  
UNICAP	
  –	
  UNIVERSIDADE	
  CATÓLICA	
  DE	
  PERNAMBUCO	
   Renata	
  Carvalho	
  
Exemplo	
  
•  Definição	
  de	
  construtores	
  e	
  métodos	
  em	
  separado	
  
template	
  
	
  <int	
  capacity>	
  
Queue<capacity>::Queue()	
  {	
  
	
  front	
  =	
  rear	
  =	
  length	
  =	
  0;	
  
}	
  
	
  
template	
  
	
  <int	
  capacity>	
  
void	
  Queue<capacity>::add	
  (char	
  e)	
  {	
  
	
  elems[rear]	
  =	
  e;	
  
	
  rear	
  =	
  (rear	
  +	
  1)	
  %	
  capacity;	
  
	
  length++;	
  
}	
  
template	
  
	
  <int	
  capacity>	
  
char	
  Queue<capacity>::remove	
  ()	
  {	
  
	
  char	
  e	
  =	
  elems[front];	
  
	
  front	
  =	
  (front	
  +	
  1)	
  %	
  capacity;	
  
	
  length-­‐-­‐;	
  
	
  return	
  e;	
  
}	
  
	
  
Unidades	
  
genéricas	
  e	
  
instanciação	
  
Exemplo	
  
Tipos	
  e	
  classes	
  
parâmetros	
  
Exemplo:	
  
classe	
  genérica	
  
em	
  Java	
  
Notas	
  de	
  
Implementação	
  
UNICAP	
  –	
  UNIVERSIDADE	
  CATÓLICA	
  DE	
  PERNAMBUCO	
   Renata	
  Carvalho	
  
Exemplo	
  
•  Instanciação	
  de	
  pacotes	
  genéricos	
  
typedef	
  Queue<80>	
  Input_Buffer;	
  
typedef	
  Queue<120>	
  Line_Buffer;	
  
•  A	
  instanciação	
  resulta	
  em	
  classes	
  nas	
  quais	
  os	
  
parâmetros	
  formais	
  são	
  subsKtuídos	
  pelo	
  valor	
  do	
  
argumento	
  
Input_Buffer	
  inbuf;	
  
Line_Buffer	
  outbuf;	
  
Line_Buffer	
  errbuf;	
  
•  ou	
  
Queue<80>	
  inbuf;	
  
Queue<120>	
  outbuf;	
  
Queue<120>	
  errbuf;	
  
Unidades	
  
genéricas	
  e	
  
instanciação	
  
Exemplo	
  
Tipos	
  e	
  classes	
  
parâmetros	
  
Exemplo:	
  
classe	
  genérica	
  
em	
  Java	
  
Notas	
  de	
  
Implementação	
  
UNICAP	
  –	
  UNIVERSIDADE	
  CATÓLICA	
  DE	
  PERNAMBUCO	
   Renata	
  Carvalho	
  
Exemplo	
  
•  A	
  instanciação	
  on	
  the	
  fly	
  de	
  classes	
  genéricas	
  resulta	
  
num	
  problema	
  conceitual	
  e	
  em	
  outro	
  de	
  ordem	
  
pragmáKca	
  
•  O	
  problema	
  conceitual	
  diz	
  respeito	
  a	
  equivalência	
  de	
  Kpos	
  
•  Duas	
  variáveis	
  outbuf	
  e	
  errbuf	
  declaradas	
  	
  com	
  Kpos	
  Queue<120>	
  e	
  
Queue<120>	
  são	
  equivalentes	
  
•  Mas	
  se	
  duas	
  variáveis	
  são	
  declaradas	
  com	
  Kpos	
  Queue<m>	
  e	
  
Queue<n-­‐1>,	
  o	
  compilador	
  não	
  tem	
  como	
  decidir	
  se	
  os	
  Kpos	
  são	
  
equivalentes	
  
•  ⇒	
  instanciações	
  em	
  C++	
  devem	
  obrigatoriamente	
  poder	
  avaliar	
  seus	
  
argumentos	
  em	
  tempo	
  de	
  compilação	
  
•  O	
  problema	
  pragmáKco	
  pode	
  levar	
  o	
  programador	
  a	
  perder	
  o	
  
controle	
  sobre	
  a	
  expansão	
  de	
  código	
  
•  Se	
  Queue<120>	
  ocorre	
  em	
  vários	
  locais	
  do	
  código,	
  um	
  compilador	
  
não	
  profissional	
  pode	
  gerar	
  várias	
  instâncias	
  de	
  Queue,	
  enquanto	
  um	
  
profissional	
  geraria	
  apenas	
  uma	
  única	
  instância	
  
Unidades	
  
genéricas	
  e	
  
instanciação	
  
Exemplo	
  
Tipos	
  e	
  classes	
  
parâmetros	
  
Exemplo:	
  
classe	
  genérica	
  
em	
  Java	
  
Notas	
  de	
  
Implementação	
  
UNICAP	
  –	
  UNIVERSIDADE	
  CATÓLICA	
  DE	
  PERNAMBUCO	
   Renata	
  Carvalho	
  
Tipos	
  e	
  classes	
  parâmetros	
  
•  Como	
  uma	
  unidade	
  de	
  programa	
  usa	
  um	
  valor	
  
definido	
  em	
  qualquer	
  lugar,	
  a	
  unidade	
  de	
  
programa	
  pode	
  tornar-­‐se	
  genérica	
  e	
  
parametrizada	
  com	
  relação	
  a	
  esse	
  valor	
  
•  Graças	
  ao	
  princípio	
  da	
  correspondência	
  
•  Como	
  uma	
  unidade	
  de	
  programa	
  usa	
  um	
  %po	
  (ou	
  
classe)	
  definido	
  em	
  qualquer	
  lugar,	
  a	
  unidade	
  de	
  
programa	
  pode	
  tornar-­‐se	
  genérica	
  e	
  
parametrizada	
  com	
  relação	
  a	
  esse	
  Kpo	
  
•  Tem-­‐se	
   uma	
   nova	
   modalidade	
   de	
   parâmetro:	
   o	
  
parâmetro	
  que	
  é	
  um	
  Kpo	
  (ou	
  uma	
  classe)	
  
•  Unidade	
  genéricas	
  em	
  Ada,	
  C++	
  e	
  Java	
  podem	
  ter	
  
Kpos	
  como	
  parâmetros	
  
Unidades	
  
genéricas	
  e	
  
instanciação	
  
Exemplo	
  
Tipos	
  e	
  classes	
  
parâmetros	
  
Exemplo:	
  
classe	
  genérica	
  
em	
  Java	
  
Notas	
  de	
  
Implementação	
  
UNICAP	
  –	
  UNIVERSIDADECATÓLICA	
  DE	
  PERNAMBUCO	
   Renata	
  Carvalho	
  
Exemplo:	
  classe	
  genérica	
  em	
  Java	
  
•  Unidades	
  genéricas	
  foram	
  introduzidas	
  em	
  Java	
  com	
  
o	
  lançamento	
  da	
  plataforma	
  Java	
  2SE	
  5.0	
  em	
  2004	
  
•  Classes	
  genéricas	
  –	
  classes	
  que	
  podem	
  ser	
  
parametrizadas	
  em	
  relação	
  a	
  outras	
  classes	
  
class List <Element> { 
 private int length; 
 private Element[] elems; 
 
 public List () { 
 ... 
 } 
 public void append (Element e) { 
 ... 
 } 
} 
Parâmetro	
  formal	
  da	
  	
  
classe	
  genérica	
  List.	
  	
  
Denota	
  uma	
  classe	
  	
  
desconhecida	
  a	
  priori	
   Unidades	
  
genéricas	
  e	
  
instanciação	
  
Exemplo	
  
Tipos	
  e	
  classes	
  
parâmetros	
  
Exemplo:	
  
classe	
  genérica	
  
em	
  Java	
  
Notas	
  de	
  
Implementação	
  
UNICAP	
  –	
  UNIVERSIDADE	
  CATÓLICA	
  DE	
  PERNAMBUCO	
   Renata	
  Carvalho	
  
Exemplo:	
  classe	
  genérica	
  em	
  Java	
  
•  Instanciação	
  de	
  classes	
  genéricas	
  
•  List<Character>	
  sentence;	
  
List<TransacKon>	
  transacKons;	
  
•  O	
  argumento	
  na	
  instanciação	
  deve	
  ser	
  uma	
  
classe	
  –	
  Kpos	
  primiKvos	
  são	
  proibidos	
  
•  List<char>	
  sentence;	
  
Instanciação	
  ilegal	
  
Unidades	
  
genéricas	
  e	
  
instanciação	
  
Exemplo	
  
Tipos	
  e	
  classes	
  
parâmetros	
  
Exemplo:	
  
classe	
  genérica	
  
em	
  Java	
  
Notas	
  de	
  
Implementação	
  
UNICAP	
  –	
  UNIVERSIDADE	
  CATÓLICA	
  DE	
  PERNAMBUCO	
   Renata	
  Carvalho	
  
Exemplo:	
  classe	
  genérica	
  em	
  Java	
  
•  Caso	
  uma	
  classe	
  genérica	
  assuma	
  que	
  a	
  classe	
  
parâmetro	
  está	
  equipada	
  com	
  operações,	
  a	
  classe	
  
parâmetro	
  deve	
  ser	
  especificada	
  como	
  
implementando	
  uma	
  interface	
  adequada	
  
•  Diz-­‐se	
  que	
  tal	
  classe	
  parâmetro	
  é	
  limitada	
  (bounded)	
  pela	
  
interface	
  
class Sequence <Element implements Comparable<Element>> { 
 private int length; 
 private Element[] elems; 
 ... 
 public void sort () { 
 Element e; 
 if (e.compareTo(elems[i] < 0) 
 ... 
 } 
} 
Element	
  é	
  um	
  parâmetro	
  formal	
  
que	
  denota	
  uma	
  classe	
  	
  
Desconhecida,	
  mas	
  que	
  deve	
  	
  
implementar	
  a	
  interface	
  	
  
Comparable,	
  onde	
  o	
  método	
  	
  
compareTo	
  está	
  especificado.	
  
Unidades	
  
genéricas	
  e	
  
instanciação	
  
Exemplo	
  
Tipos	
  e	
  classes	
  
parâmetros	
  
Exemplo:	
  
classe	
  genérica	
  
em	
  Java	
  
Notas	
  de	
  
Implementação	
  
UNICAP	
  –	
  UNIVERSIDADE	
  CATÓLICA	
  DE	
  PERNAMBUCO	
   Renata	
  Carvalho	
  
Exemplo:	
  classe	
  genérica	
  em	
  Java	
  
•  Em	
  geral,	
  se	
  uma	
  unidade	
  genérica	
  em	
  Java	
  tem	
  
uma	
  classe	
  parâmetro	
  C,	
  ela	
  é	
  especificada	
  pela	
  
cláusula	
  
•  C	
  implements	
  Interface;	
  
•  O	
  compilador	
  verifica	
  a	
  unidade	
  genérica	
  para	
  
assegurar	
  que	
  
•  operações	
  usadas	
  por	
  C	
  na	
  unidade	
  genérica	
  ⊆	
  nas	
  
operações	
  declaradas	
  em	
  Interface	
  
•  O	
  compilador	
  verifica	
  separadamente	
  cada	
  
instanciação	
  da	
  unidade	
  genérica	
  para	
  assegurar	
  
que	
  
•  operações	
  declaradas	
  na	
  Interface	
  ⊆	
  nas	
  operações	
  que	
  
equipam	
  a	
  classe	
  passada	
  como	
  argumento	
  
•  Uma	
  vez	
  implementada,	
  as	
  unidades	
  genéricas	
  em	
  
Java	
  podem	
  ser	
  reusadas	
  com	
  segurança	
  em	
  
relação	
  a	
  verificação	
  de	
  Kpos	
  
Unidades	
  
genéricas	
  e	
  
instanciação	
  
Exemplo	
  
Tipos	
  e	
  classes	
  
parâmetros	
  
Exemplo:	
  
classe	
  genérica	
  
em	
  Java	
  
Notas	
  de	
  
Implementação	
  
UNICAP	
  –	
  UNIVERSIDADE	
  CATÓLICA	
  DE	
  PERNAMBUCO	
   Renata	
  Carvalho	
  
Notas	
  de	
  Implementação	
  
•  Unidades	
  genéricas	
  com	
  Kpos	
  parâmetros	
  
suscitam	
  interessantes	
  problemas	
  de	
  
implementação	
  
•  Como	
  o	
  Kpo	
  parâmetro	
  denota	
  um	
  Kpo	
  desconhecido,	
  o	
  
compilador	
   não	
   pode	
   determinar,	
   apenas	
   da	
   unidade	
  
genérica,	
  como	
  os	
  valores	
  do	
  Kpo	
  serão	
  representados	
  
•  Não	
   há	
   como	
   saber	
   o	
   espaço	
   de	
   memória	
   requerido,	
   por	
  
exemplo	
  
•  Somente	
  quando	
  a	
  unidade	
  genérica	
  é	
  instanciada	
  é	
  que	
  
o	
  compilador	
  pode	
  saber	
  essa	
  informação	
  
Unidades	
  
genéricas	
  e	
  
instanciação	
  
Exemplo	
  
Tipos	
  e	
  classes	
  
parâmetros	
  
Exemplo:	
  
classe	
  genérica	
  
em	
  Java	
  
Notas	
  de	
  
Implementação

Continue navegando