Escolar Documentos
Profissional Documentos
Cultura Documentos
15/08/13
Objetivos
2
Discutir a necessidade, facilidades e dificuldades quando se trata do reuso de cdigo; Explorar os conceitos fundamentais acerca do uso de Herana em Java; Discutir o uso de herana com outros mecanismos de reuso de cdigo, como a Composio
Reuso de Cdigo
3
Mecanismo de Reuso:
Diminui
a necessidade de re-escrever cdigo: menos trabalho para o programador; Permite o aproveitamento de cdigo pr-existente (possivelmente livre de erros e otimizado): menos chances de cometer erros;
no mundo da POO, o termo associado com uma das formas de reutilizao de software. Atravs da herana, novas classes podem ser derivadas das classes existentes. A nova classe herda propriedades e mtodos da classe base. A nova classe tambm pode adicionar suas prprias propriedades e mtodos; Composio uma maneira alternativa de estender a funcionalidade de uma classe agregando ela, funcionalidades de outras classes.
classe Java, j desenvolvida, que realize a funo especfica (API, classe nossa, colega, etc); Escrever a classe do zero; Reutilizar uma classe existente ou estrutura (hierarquia) de classes atravs de Herana; Reutilizar uma classe existente com Composio.
Herana
Reuso com Herana em Java
Herana
7
Permite reutilizar as caractersticas de uma classe (superclasse) na definio de outra classe (subclasse);
Classe
Herana
8
mais especializada
Herana
9
A herana viabiliza a construo de sistemas a partir de componentes facilmente reutilizveis; A classe descendente no tem trabalho para receber a herana: basta usar extends e redefinir os mtodos quando necessrio (para gerar comportamentos mais especializados).
rvore de Herana
11
Herana
12
rvore de Herana
13
Unio das classes que herdam entre si gera uma rvore de herana (hierarquia de classes relacionadas)
Todos
as classes herdam caractersticas (gerais) definidas em FormaGeometrica; Elipse, Quadrado e Tringulo so especializaes de FormaGeometrica (Elipse uma FormaGeometrica);
Em todos os casos, cada subclasse possui uma nica superclasse: herana simples;
Em
algumas linguagens possvel herdar a partir de diversas superclasses mas em Java, no.
Herana
14
objetos de B suportam todas as operaes suportadas pelos objetos de A, exceto aquelas que foram sobrescritas; Os objetos de B incluem todas as varivies de instncia de B + todas as variveis de instncia de A; Mtodos e Atributos declarados como private no sero herdados;
Herana
15
classe mais abaixo na hierarquia deve especializar comportamentos ( um tipo mais especializado de); Mtodos e atributos internos so herdados por todos os objetos dos nveis abaixo (com exceo do que for declarado como private);
Herana: vantagens
16
Como o cdigo pode ser facilmente reutilizado, a quantidade de cdigo a ser adicionado em uma subclasse pode diminuir bastante;
Subclasses
Herana: vantagens
17
Quando relacionamos duas classes via herana, podemos ter polimorfismo com ligao dinmica (dynamic binding):
n
Se um trecho de cdigo usa uma referncia de uma superclasse (FormaGeometrica), ento este trecho pode manipular novos tipos concretos futuros (Retangulo, e.g.):
Novo tipo
Imagine uma modelagem de um sistema para jogo de ao com personagens; Neste jogo existem dois tipos de personagens:
Soldado; General.
public abstract class Personagem { public abstract void desenhar(); public void falar(){ /* cdigo comum para falar */ } public void arma(){ /* cdigo comum para atirar */ } }
Subclasses redefinem comportamentos especficos public class General extends Personagem { public void desenhar() { /*desenha general*/ } }
public class Soldado extends Personagem { public void desenhar() { /*desenha soldado*/ } }
implementao de falar pode ser herdada sem problemas; Agora temos comportamentos Desenhar pode ser sobrescrito; que no so mais comuns a O lutador no usa arma. todos os objetos!
public class Lutador extends Personagem { public void desenhar() { /*desenha lutador*/ } public void arma() { /*deixa em branco?*/ } }
na superclasse afetam todas as subclasses, podendo gerar um retrabalho enorme (weak base-class problem);
Problemas:
E
No estamos tendo sucesso nestes cenrios do Jogo com herana. Por que?
1.
2.
No primeiro cenrio, existem comportamentos na superclasse que no so comuns a todos os personagens do jogo; No segundo cenrio, o cdigo da arma especfica est acoplado a cada uma das classes. Isto dificulta a criao de novas armas para o jogo e no permite que um personagem mude de arma em tempo de execuo.
Soluo?
26
Composio
Reuso com Composio em Java
descobrir que algo ir mudar, a idia encapsular isso, trabalhar com uma interface e usar o cdigo sem a preocupao de ter que reescrever tudo caso surjam verses futuras (fraco acoplamento)
o polimorfismo e a ligao dinmica para usar um supertipo e poder trocar objetos distintos em tempo de execuo.
Composio
28
A composio estende uma classe pela delegao de trabalho para outro objeto:
Em
vez de codificar um comportamento estaticamente, definimos e encapsulamos pequenos comportamentos padro e usamos composio para delegar comportamentos;
Composio em Java
29
NovaClasse
Instncia de Objeto 1
Instncia de Objeto 3
Instncia de Objeto 3
class NovaClasse { Um u = new Um(); Dois d = new Dois(); Tres t = new Tres(); } Objetos podem ser inicializados no construtor; Flexibilidade: pode trocar objetos durante a execuo; Relacionamento: tem um.
Permitir o aparecimento de novas armas no Jogo sem grandes impactos negativos (if-elses) em todas as subclasses concretas; Permitir que o personagem mude de arma em tempo de execuo ao invs de definir a arma estaticamente no cdigo; Alguns comportamentos no devem ser compartilhados por todos os personagens:
Um
Os personagens concretos devem trabalhar agora como uma referncia para algo que implemente a interface de armas:
public abstract class Personagem { Arma_IF arma; public abstract void desenhar(); public void falar() { /*cdigo comum para falar*/ public void setArma (Arma_IF arma) { this.arma =arma; } public void arma() { arma.usarArma(); } }
Reduz o acoplamento de cdigo j que os personagens interagem com uma interface ao invs de uma implementao; Se um personagem deseja utilizar a arma, basta delegar esta tarefa ao objeto (que tem o mtodo usarArma) que est sendo referenciado no momento;
Ao delegada: arma.usarArma()
Comportamento Encapsulado
34
Consideraes
Composio vs Herana
Consideraes
35
Uma das principais atividades em um projeto orientado a objetos estabelecer corretamente o relacionamento entre diferentes classes;
Duas
Composio e Herana no so mutuamente exclusivas; A herana, geralmente, ocorre mais no design de tipos (uma subclasse um tipo de)
Consideraes
36
o que muda do que no muda e encapsular estes comportamentos; Trabalhar com uma interface para manipular estes comportamentos; Trocar comportamentos dinamicamente;
Programar para uma interface sempre que possvel garante um fraco acoplamento
partes devem ser agregadas ao objeto via composio; Este um relacionamento do tipo parte de;
Classifique seu objeto e tente encontrar uma semelhana de identidade com classes existentes:
Herana
s deve ser usada se voc puder comparar seu objeto A com outro B dizendo que A um tipo de B.
38
Para Discutir
O que deve ser alterado no Jogo de Ao para acomodar um personagem Drago Alado? Um drago pode falar? E qual a arma do drago?