Você está na página 1de 38

ANALISE E PROJETO DE SISTEMAS DE INFORMAO II REUSO DE CDIGO EM JAVA: HERANA VS COMPOSIO

15/08/13

Francisco Barretto kikobarretto@gmail.com

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;

Em linguagens orientadas a objeto permite a criao de um banco (biblioteca) de classes reutilizveis.

Reuso de Cdigo em POO


4

Reuso de Classes em POO:


Herana

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.

Reuso de Cdigo em Java


5

Quando voc precisa de uma clase em Java, podemos escolher entre:


Uma

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

mais generalizada: superclasse; Classe mais especializada: subclasse;

Classes ligadas uma hierarquia.

Herana
8

Relacionamento hierrquico entre classes:


(super)classe ou ancestral

(sub)classe ou classe herdeira

A subclasse herda da classe:


todos os atributos n todos os mtodos
n

mais especializada

A subclasse pode conter atributos e mtodos adicionais

Herana
9

Propriedades, conexes a objetos e mtodos comuns ficam na superclasse (classe de generalizao):


Estendemos

os atributos e mtodos nas subclasses (classes de especializao);

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).

Herana Pura vs Extenso


10

Herana Pura: mtodos genricos sobrepostos

Extenso: novos comportamentos adicionados

rvore de Herana
11

Interface original automaticamente duplicada nas classes derivadas

Atributos tambm so automaticamente duplicados

Se mtodo derivado no for sobrescrito, implementao original utilizada

Herana
12

Assinatura do mtodo sobrescrito deve ser idntico ao declarado na superclasse.

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

Se B uma subclasse de A, ento:


Os

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;

Construtores tambm no sero herdados:


Devero

ser chamados (em cascata) na construo de objetos especializados via super();

Herana
15

Tcnica para prover suporte a especializao:


Uma

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

provem comportamentos especializados, tomando como base os elementos comuns;

Potencializa a manuteno de sistemas:


Maior

legibilidade do cdigo existente; A herana vista facilmente no cdigo.

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

Ligao dinmica void abrir(FormaGeometrica f) { f.draw(); } abrir(new Retangulo());

Cenrio de Uso 1: Jogo de Ao


18

Imagine uma modelagem de um sistema para jogo de ao com personagens; Neste jogo existem dois tipos de personagens:

Soldado; General.

Cenrio de Uso 1: Jogo de Ao


19

public abstract class Personagem { public abstract void desenhar(); public void falar(){ /* cdigo comum para falar */ } public void arma(){ /* cdigo comum para atirar */ } }

Classe abstrata que possui a interface comum a todos os personagens

Subclasses redefinem comportamentos especficos public class General extends Personagem { public void desenhar() { /*desenha general*/ } }

public class Soldado extends Personagem { public void desenhar() { /*desenha soldado*/ } }

Cenrio de Uso 1: Jogo de Ao


20

Adicionando um novo personagem: um LUTADOR;


A

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?*/ } }

Cenrio de Uso 1: Jogo de Ao


21

E se retirarmos o mtodo arma() da superclasse?


Define-se,

ento, o mtodo arma() em cada uma das subclasses?


public class Lutador extends Personagem { public void desenhar() { /*desenha lutador*/ } public void luta() { /*karat!*/ } } Agora temos uma duplicao desnecessria de cdigo!

Problemas com a Herana


22

O encapsulamento entre classes e subclasses fraco, gerando forte acoplamento;


Mudanas

na superclasse afetam todas as subclasses, podendo gerar um retrabalho enorme (weak base-class problem);

Outro problema a mudana de comportamento dinamicamente (em tempo de execuo)

Cenrio de Uso 2: Jogo de Ao


23

Mesma modelagem com General e Soldado usando armas de fogo distintas:


public class Soldado extends Personagem { public void desenhar() { /*desenha soldado*/ } public void arma() { println(Tiro); } } public class General extends Personagem { public void desenhar() { /*desenha general*/ } public void arma() { println(Rajada); } }

Subclasses redefinem mtodos para um comportamento especfico

Cenrio de Uso 2: Jogo de Ao


24

Problemas:
E

se quisermos adicionar novas armas? Como trocar a arma dinmicamente?


public class UsaPersonagem { public static void main (String[] args) { Personagem p; public class Soldado extends Personagem { p = new Soldado(); public void desenhar() { p.arma(); //imprime Tiro: /*desenha soldado*/ } } public void arma() { public void arma(int arma) { println(Tiro); if (arma==0) } println(Tiro); } else if (arma==1) A arma est acoplada no println(Rajada); cdigo da classe soldado! }

Problemas com Herana


25

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

Como melhorar o reuso?


27

Separar as partes que podem mudar, das partes que no mudam:


Ao

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)

Programe para uma interface, no para uma implementao concreta:


Explorar

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.

Qual a idia para este Cenrio?


30

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

lutador no deve atirar, por exemplo.

Cenrio de Uso 3: Jogo de Ao


31

Se as armas podem mudar, devemos ento separlas das classes concretas:


class Desarmado implements Arma_IF { public void usarArma() { /* imprime desarmado */ } } class Revolver implements Arma_IF { public void usarArma() { /* imprime tiro */ } } class Fuzil implements Arma_IF { public void usarArma() { /* imprime rajada */

Interface Arma_IF { void usarArma(); }

Cenrio de Uso 3: Jogo de Ao


32

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;

Cenrio de Uso 3: Jogo de Ao


33

Diagrama de Classes Final:

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

formas bsicas de relacionar classes so herana e composio;

Composio e Herana no so mutuamente exclusivas; A herana, geralmente, ocorre mais no design de tipos (uma subclasse um tipo de)

Consideraes
36

No desenvolvimento, porm, a composio de objetos a tcnica predominante:


Separar

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

Quando usar Herana e Composio?


37

Identifique os componentes do objeto (suas partes)


Estas

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?

Você também pode gostar