HERANÇA DE CLASSE VERSUS
HERANÇA DE INTERFACE
HÁ UMA DIFERENÇA GRANDE ENTRE UMA CLASSE
E SEU TIPO
A CLASSE DEFINE UMA
IMPLEMENTAÇÃO
O TIPO DEFINE APENAS A INTERFACE
OFERECIDA PARA ACESSAR OBJETOS DA CLASSE
UM OBJETO PODE TER MUITOS
TIPOS
CLASSES DIFERENTES PODEM TER O
MESMO TIPO
HERANÇA DE CLASSE SIGNIFICA HERANÇA DE
IMPLEMENTAÇÃO
A SUB-CLASSE HERDA A
IMPLEMENTAÇÃO DA SUPER-CLASSE
É UM MECANISMO PARA
COMPARTILHAR CÓDIGO E REPRESENTAÇÃO
HERANÇA DE INTERFACE (OU SUB-TIPOS)
DESCREVE QUANDO UM OBJETO PODE SER USADO EM VEZ DE OUTRO
AO FAZER HERANÇA DE CLASSE,
AUTOMATICAMENTE FAZ TAMBÉM HERANÇA DE INTERFACE
ALGUMAS LINGUAGENS NÃO PERMITEM DEFINIR
TIPOS SEPARADAMENTE DE CLASSES
MAS, NESTE CASO, A CLASSE
PURAMENTE ABSTRATA SERVE
"PROGRAM TO AN INTERFACE,
NOT AN IMPLEMENTATION"
O FATO DE QUE A HERANÇA DE
IMPLEMENTAÇÃO PERMITE FACILMENTE REUSAR A
FUNCIONALIDADE DE UMA CLASSE É INTERESSANTE MAS NÃO É
O ASPECTO MAIS IMPORTANTE A SER CONSIDERADO
HERANÇA OFERECE A HABILIDADE DE DEFINIR
FAMÍLIAS DE OBJETOS COM, INTERFACES IDÊNTICAS
ISSO É EXTREMAMENTE IMPORTANTE POIS
PERMITE DESACOPLAR UM OBJETO DE SEUS CLIENTES ATRAVÉS DO
POLIMORFISMO
A HERANÇA DE INTERFACE CORRETAMENTE
USADA (SEM ELIMINAR PARTES DA INTERFACE NAS
SUB-CLASSES) ACABA CRIANDO SUB-TIPOS, PERMITINDO O
POLIMORFISMO
PROGRAMAR EM FUNÇÃO DE UMA INTERFACE E
NÃO EM FUNÇÃO DE UMA IMPLEMENTAÇÃO (UMA CLASSE
PARTICULAR) PERMITE O POLIMORFISMO E FORNECE AS SEGUINTES
VANTAGENS:
CLIENTES PERMANECEM SEM
CONHECIMENTO DO TIPO DE OBJETOS QUE ELES USAM,
DESDE QUE OS OBJETOS OBEDEÇAM A INTERFACE
CLIENTES PERMANECEM SEM
CONHECIMENTO DAS CLASSES QUE IMPLEMENTAM TAIS
OBJETOS
A INTERFACE É O QUE HÁ DE COMUM
A FLEXIBILIDADE VEM DA
POSSIBILIDADE DE MUDAR A IMPLEMENTAÇÃO DA
INTERFACE, ATÉ EM TEMPO DE EXECUÇÃO, JÁ QUE O
POLIMORFISMO É IMPLEMENTADO COM "LATE
BINDING" FEITO EM TEMPO DE EXECUÇÃO
EM JAVA, UMA CLASSE PODE IMPLEMENTAR
VÁRIAS INTERFACES
ISSO PERMITE TER MAIS
POLIMORFISMO MESMO SEM QUE AS CLASSES PERTENÇAM
A UMA MESMA HIERARQUIA
EXEMPLO NO USO DE INTERFACES
UMA APLICAÇÃO
QUE GERENCIA A COMPRA DE PRODUTOS
TEMOS QUE TER
INFORMAÇÃO SOBRE:
FORNECEDORES
EMPRESAS
DE FRETE
LUGARES
DE RECEPÇÃO DE PRODUTOS
LUGARES
DE FATURAMENTO
TODAS ESSAS
ENTIDADES TÊM UM ENDEREÇO
TAIS ENDEREÇOS
APARECEM EM VÁRIOS LUGARES DA INTERFACE DO USUÁRIO (UI)
VOCÊ QUER UMA
CLASSE QUE EXIBA E EDITE ENDEREÇOS DE FORMA A
REUTILIZÁ-LA QUANDO HOUVER UM ENDEREÇO A MANIPULAR NA
UI
DIGAMOS QUE A
CLASSE SE CHAME EndereçoPanel
EndereçoPanel
DEVE OBTER E ALTERAR ENDEREÇOS DE OBJETOS
A CLASSE
EndereçoPanel DEVE TRABALHAR COM OBJETOS DE QUE CLASSE?
CLASSES
DIFERENTES SERÃO USADAS PARA FORNECEDORES, EMPRESAS DE
FRETE, ETC.
A SOLUÇÃO É
USAR UMA INTERFACE PARA ENDEREÇOS E FAZER COM QUE
EndereçoPanel REFERENCIE (TRABALHE COM) QUALQUER CLASSE
QUE IMPLEMENTE ESSA INTERFACE

EndereçoPanel
NÃO SABE COM QUE TIPO DE CLASSE ELA TRABALHA!
EM VEZ DE PENSAR
"COM QUE CLASSE
VOU ME COMUNICAR?", PENSE "CLASSES QUAISQUER
QUE SUPORTAM QUAL INTERFACE
ME INTERESSAM?"
ISSO É MUITO
PODEROSO!
DEVEM EXISTIR
INTERFACES PARA AS PARTES MAIS IMPORTANTES DE QUALQUER
PROGRAMA
NO EXEMPLO ACIMA,
PODEMOS USAR INTERFACES E DELEGAÇÃO

COMO ACHAR
INTERFACES
PROCURE
ASSINATURAS REPETIDAS
ONDE HÁ
DELEGAÇÃO, UM OBJETO SE ESCONDE ATRÁS DE
OUTRO: DEVE HAVER UMA INTERFACE COMUM
PROCURE
MÉTODOS QUE PODERIAM SER USADAS EM APLICAÇÕES
SEMELHANTES E USE INTERFACES PARA QUE A
REUSABILIDADE DAS CLASSES CLIENTES SEJA MAIOR
EXEMPLO:
MUITAS COISAS PODERIAM SER RESERVÁVEIS,
NÃO SÓ PASSAGENS DE AVIÃO
EXEMPLO:
MUITAS COISAS PODE SER ALUGADAS, NÃO SÓ
FITAS DE VÍDEO
PROCURE
MUDANÇAS FUTURAS (NOVOS OBJETOS QUE PODERIAM
APARECER) E COLOQUE AS SEMELHANÇAS SOB CONTROLE
DE INTERFACES
HÁ,
ENTRETANTO, PESSOAS QUE NÃO CONCORDAM EM
"PENSAR MUITO NA FRENTE"
ACOPLAMENTO
O GRAU DE INTERAÇÃO ENTRE
MÓDULOS DE UM SISTEMA
TAMBÉM MEDE O GRAU DE
INTERDEPENDÊNCIA ENTRE MÓDULOS
O QUE SÃO OS "MÓDULOS"?
CLASSES/INTERFACES: ACOPLAMENTO
ESTÁTICO (EM TEMPO DE COMPILAÇÃO)
OBJETOS: ACOPLAMENTO DINÂMICO
(EM TEMPO DE EXECUÇÃO)
POR QUE ACOPLAMENTO É RUIM?
DIMINUI A REUSABILIDADE DE
OBJETOS PORQUE OBJETOS NÃO PODEM SER USADOS
SOZINHOS
AUMENTA A CHANCE DE BUGS QUANDO
MUDANÇAS SÃO FEITAS A UM DOS OBJETOS ACOPLADOS
ACOPLAMENTO ESTÁTICO
BASICAMENTE, A HERANÇA CRIA
ACOPLAMENTO ESTÁTICO FORTE NA HIERARQUIA
POR ISSO, HERANÇA (DE
IMPLEMENTAÇÃO) PODE SER RUIM (VER À FRENTE)
TIPOS DE ACOPLAMENTOS (DO MENOS RUIM
ATÉ O PIOR)
ACOPLAMENTO DE DADOS
ACOPLAMENTO DE CONTROLE
ACOPLAMENTO DE DADOS GLOBAIS
ACOPLAMENTO DE DADOS INTERNOS
ACOPLAMENTO DE DADOS
SITUAÇÕES
SAÍDA DE UM OBJETO É ENTRADA
DE OUTRO
USO DE PARÂMETROS PARA PASSAR
ITENS ENTRE MÉTODOS
OCORRÊNCIA COMUM:
OBJETO A PASSA OBJETO X PARA
OBJETO B
OBJETO X E B ESTÃO ACOPLADOS
UMA MUDANÇA NA
INTERFACE DE X PODE IMPLICAR EM MUDANÇAS
A B
EXEMPLO:
class Servidor {
public void mensagem( MeuTipo X ) {
// código aqui
X.façaAlgo( Object dados );
// mais código
}
}
EXEMPLO PIOR:
OBJETO A PASSA OBJETO X PARA
OBJETO B
X É UM OBJETO COMPOSTO (CONTÉM
OUTRO(S) OBJETO(S))
OBJETO B DEVE EXTRAIR OBJETO Y
DE DENTRO DE X
HÁ ACOPLAMENTO ENTRE B, X,
REPRESENTAÇÃO INTERNA DE X, Y
EXEMPLO: ORDENAÇÃO DE REGISTROS DE
ALUNOS POR MATRÍCULA E NOME
class RegistroAluno {
String nome;
Long matrícula;
public String getNome() { return nome; }
public Long getMatrícula() { return matrícula; }
// etc.
}
ListaOrdenada apoo = new ListaOrdenada();
RegistroAluno novoAluno;
//etc.
apoo.add(novoAluno);
AGORA, VAMOS VER OS PROBLEMAS
class ListaOrdenada {
Object[] elementosOrdenados = new Object[ tamanhoAdequado ];
public void add( RegistroAluno X ) {
// código não mostrado
Long matrícula1 = X.getMatrícula();
Long matrícula2 = elementosOrdenados[ K ].getMatrícula();
if ( matrícula1 < matrícula2 )
// faça algo
else
// faça outra coisa
}
}
O PROBLEMA DA SOLUÇÃO ANTERIOR É QUE HÁ FORTE
ACOPLAMENTO
ListaOrdenada SABE MUITA COISA DE
RegistroAluno
O FATO DE QUE A COMPARAÇÃO DE
ALUNOS É FEITO COM A MATRÍCULA
O FATO DE QUE A MATRÍCULA É OBTIDA
COM getMatrícula
O FATO DE QUE MATRÍCULAS SÃO LONG
(REPRESENTAÇÃO DE DADOS)
COMO COMPARAR MATRÍCULAS (COM <)
O QUE OCORRE SE MUDARMOS QUALQUER UMA DESSAS
COISAS?
SOLUÇÃO 2: MANDE UMA MENSAGEM PARA O PRÓPRIO
OBJETO SE COMPARAR COM OUTRO
class ListaOrdenada {
Object[] elementosOrdenados = new Object[ tamanhoAdequado ];
public void add( RegistroAluno X ) {
// código não mostrado
if ( X.lessThan( elementosOrdenados[ K ] ) )
// faça algo
else
// faça outra coisa
}
}
REDUZIMOS O ACOPLAMENTO ESCONDENDO INFORMAÇÃO
ATRÁS DE UM MÉTODO
PROBLEMA: ListaOrdenada SÓ FUNCIONA COM RegistroAluno
SOLUÇÃO 3: USE INTERFACES PARA DESACOPLAR MAIS
AINDA
Interface Comparable {
public boolean lessThan(Object outro);
public boolean greaterThan(Object outro);
public boolean equal(Object outro);
}
class RegistroAluno implements Comparable {
public boolean lessThan(Object outro) {
// compare registro de aluno com outro
}
}
class ListaOrdenada {
Object[] elementosOrdenados = new Object[ tamanhoAdequado ];
public void add( Comparable X ) {
// código não mostrado
if ( X.lessThan( elementosOrdenados[ K ] ) )
// faça algo
else
// faça outra coisa
}
}
EM C++, TERIA OUTRAS SOLUÇÕES
APONTADOR DE FUNÇÃO
APONTADOR DE FUNÇÃO COM TIPOS GENÉRICOS
(TEMPLATES)
ACOPLAMENTO DE CONTROLE
PASSAR FLAGS DE CONTROLE ENTRE OBJETOS
DE FORMA QUE UM OBJETO CONTROLE AS ETAPAS DE
PROCESSAMENTO DE OUTRO OBJETO
OCORRÊNCIA COMUM:
OBJETO A MANDA UMA MENSAGEM PARA
OBJETO B
B USA UM PARÂMETRO DA MENSAGEM
PARA DECIDIR O QUE FAZER
class Lampada {
public static final ON = 0;
public void setLampada( int valor ) {
if ( valor == ON )
// liga lampada
else if ( valor == 1 )
// desliga lampada
else if ( valor == 2 )
// pisca
}
}
Lampada lampapa = new Lampada();
lampada.setLampada(Lampada.ON);
lampada.setLampada(2);
SOLUÇÃO: DECOMPOR A OPERAÇÃO EM
MÚLTIPLAS OPERAÇÕES PRIMITIVAS
class Lamp {
public void on() { // liga lampada }
public void off() { // desliga lampada }
public void pisca() { // pisca }
}
Lampada lampada = new Lampada();
lampada.on();
lampada.pisca();
OCORRÊNCIA COMUM:
OBJETO A MANDA MENSAGEM PARA
OBJETO B
B RETORNA INFORMAÇÃO DE
CONTROLE PARA A
EXEMPLO: RETORNO DE
CÓDIGO DE ERRO
class Teste {
public int printFile(File toPrint) {
if(toPrint está corrompido )
return CORRUPTFLAG;
etc. etc.
}
}
Teste umTeste = new Teste();
int resultado = umTese.printFile( miniTeste );
if(resultado == CORRUPTFLAG) {
oh! oh!
else if(resultado == -243) {
etc. etc.
class Teste {
public int printFile(File toPrint) throws
PrintExeception {
if(toPrint está corrompido )
throw new PrintExeception();
etc. etc.
}
}
try {
Teste umTeste = new Teste();
umTeste.printFile( miniTeste );
} catch(PrintException printError) {
faça algo
}
ACOPLAMENTO DE DADOS GLOBAIS
DOIS OU MAIS OBJETOS COMPARTILHAM
ESTRUTURAS DE DADOS GLOBAIS
É UM ACOPLAMENTO MUITO RUIM POIS ESTÁ ESCONDIDO
UMA CHAMADA DE MÉTODO PODE
MUDAR UM VALOR GLOBAL E O CÓDIGO NÃO DEIXA ISSO
APARENTE
UM TIPO DE ACOPLAMENTO MUITO RUIM
ACOPLAMENTO DE DADOS INTERNOS
UM OBJETO ALTERA OS DADOS LOCAIS DE UM OUTRO OBJETO
OCORRÊNCIA COMUM:
FRIENDS EM C++
DADOS PROTECTED OU PÚBLICOS DE JAVA
USE PARCIMONIOSAMENTE!
DEFINIÇÕES DE COESÃO
"Cohesion is the degree to which the
tasks performed by a single module are
functionally related."
IEEE, 1983
"Cohesion is the "glue" that
holds a module together. It can be thought of as
the type of association among the component
elements of a module. Generally, one wants the
highest level of cohesion possible."
Bergland, 1981
"A software component is said to exhibit
a high degree of cohesion if the elements in that
unit exhibit a high degree of functional
relatedness. This means that each element in the
program unit should be essential for that unit to
achieve its purpose."
Sommerville, 1989
TIPOS DE COESÃO ENTRE MÓDULOS
COINCIDENTAL (PIOR)
LÓGICO
TEMPORAL
PROCEDURAL
DE COMUNICAÇÃO
SEQUENCIAL
FUNCIONAL (MELHOR)
COESÃO COINCIDENTAL
COESÃO LÓGICA
MÓDULO FAZ UM CONJUNTO DE FUNÇÕES
RELACIONADAS, UMA DAS QUAIS É ESCOLHIDA ATRAVÉS DE UM
PARÂMETRO AO CHAMAR O MÓDULO
SEMELHANTE A ACOPLAMENTO DE CONTROLE
CURA: QUEBRAR EM MÉTODOS DIFERENTES
public void faça(int flag) {
switch(flag) {
case ON:
// coisas para tratar de ON
break;
case OFF:
// coisas para tratar de OFF
break;
case FECHAR:
// coisas para tratar de FECHAR
break;
case COR:
// coisas para tratar de COR
break;
}
}
}
COESÃO TEMPORAL
ELEMENTOS ESTÃO AGRPADOS NO MESMO
MÓDULO PORQUE SÃO PROCESSADOS NO MESMO INTERVALO DE
TEMPO
EXEMPLOS COMUNS:
MÉTODO DE INICIALIZAÇÃO QUE
PROVÊ VALORES DEFAULTS PARA UM MONTE DE COISAS
DIFERENTES
MÉTODO DE FINALIZAÇÃO QUE
LIMPA AS COISAS ANTES DE TERMINAR
procedure inicializaDados() {
font = "times";
windowSize = "200,400";
xpto.nome = "Desligado";
xpto.tamanho = 12;
xpto.localização = "/usr/local/lib/java";
}
CURA: DEPENDER DE CONSTRUTORES E DESTRUTORES
class Xpto {
public Xpto() {
this.nome = "Desligado";
this.tamanho = 12;
this.localização = "/usr/local/lib/java";
}
}
OUTRO EXEMPLO: ARQUIVO DE CONFIGURAÇÃO
TÍPICO
[Macintosh]
EquationWindow=146,171,406,661
SpacingWindow=0,0,0,0
[Spacing]
LineSpacing=150%
MatrixRowSpacing=150%
MatrixColSpacing=100%
SuperscriptHeight=45%
SubscriptDepth=25%
LimHeight=25%
LimDepth=100%
LimLineSpacing=100%
NumerHeight=35%
DenomDepth=100%
FractBarOver=1pt
FractBarThick=0.5pt
SubFractBarThick=0.25pt
FenceOver=1pt
SpacingFactor=100%
MinGap=8%
RadicalGap=2pt
EmbellGap=1.5pt
PrimeHeight=45%
|
[General]
Zoom=200
CustomZoom=150
ShowAll=0
Version=2.01
OptimalPrinter=1
MinRect=0
ForceOpen=0
ToolbarDocked=1
ToolbarShown=1
ToolbarDockPos=1
[Fonts]
Text=Times
Function=Times
Variable=Times,I
LCGreek=Symbol,I
UCGreek=Symbol
Symbol=Symbol
Vector=Times,B
Number=Times [Sizes]
Full=12pt
Script=7pt
ScriptScript=5pt
Symbol=18pt
SubSymbol=12pt
|
COESÃO PROCEDURAL
ASSOCIA ELEMENTOS DE ACORDO COM SEUS
RELACIONAMENTOS PROCEDURAIS OU ALGORÍTMICOS
UM MÓDULO PROCEDURAL DEPENDE MUITO DA
APLICAÇÃO SENDO TRATADA
JUNTO COM A APLICAÇÃO, O
MÓDULO PARECE RAZOÁVEL
SEM ESTE CONTEXTO, O MÓDULO
PARECE ESTRANHO E MUITO DIFÍCIL DE ENTENDER
O QUE ESTÁ ACONTECENDO
AQUI!!!????!!
NÃO PODE ENTENDER O MÓDULO SEM
ENTENDER O PROGRAMA E AS CONDIÇÕES QUE EXISTEM QUANDO O
MÓDULO É CHAMADO
CURA: REPROJETE O SISTEMA
COESÃO DE COMUNICAÇÃO
TODAS AS OPERAÇÕES DE UM MÓDULO
OPERAM NO MESMO CONJUNTO DE DADOS E/OU PRODUZEM O MESMO
TIPO DE DADO DE SAÍDA
CURA: ISOLE CADA ELEMENTO NUM MÓDULO
SEPARADO
"NÃO DEVERIA" OCORRER EM
SISTEMAS OO USANDO POLIMORFISMO
COESÃO SEQUENCIAL
A SAÍDA DE UM ELEMENTO DE UM MÓDULO
SERVE DE ENTRADA PARA O PRÓXIMO ELEMENTO
CURA: DECOMPOR EM MÓDULOS MENORES
COESÃO FUNCIONAL (A MELHOR)
UM MÓDULO TEM COESÃO FUNCIONAL SE AS
OPERAÇÕES DO MÓDULO PUDEREM SER DESCRITAS NUMA ÚNICA
FRASE DE FORMA COERENTE
NUM SISTEMA OO:
CADA OPERAÇÃO NA INTERFACE
PÚBLICA DO OBJETO DEVE SER FUNCIONALMENTE COESA
CADA OBJETO DEVE REPRESENTAR UM
ÚNICO CONCEITO COESO
EXEMPLO: UM OBJETO QUE ESCONDE ALGUM
CONCEITO OU ESTRUTURA DE DADOS OU RECURSO E ONDE TODOS OS
MÉTODOS SÃO RELACIONADOS POR UM CONCEITO OU ESTRUTURA
DE DADOS OU RECURSO
MEYER CHAMA ISSO DE
"INFORMATION-STRENGTH MODULE"
tecnicas4.htm programa
anterior próxima