Você está na página 1de 8

Padro Bsico de Projeto: Herana versus Composio

Composio e Herana

Composio e herana so dois mecanismos para reutilizar funcionalidade Alguns anos atrs (e na cabea de alguns programadores ainda!), a herana era considerada a ferramenta bsica de extenso e reuso de funcionalidade A composio estende uma classe pela delegao de trabalho para outro objeto a herana estende atributos e mtodos de uma classe Hoje, considera-se que a composio muito superior herana na maioria dos casos A herana deve ser utilizada em alguns (relativamente poucos) contextos Vamos portanto desinflar um pouco a bola da herana ...

Um exemplo de composio

Use composio para estender as responsabilidades pela delegao de trabalho a outros objetos Um exemplo no domnio de endereos Uma empresa tem um endereo (digamos s um) Uma empresa "tem" um endereo Podemos deixar o objeto empresa responsvel pelo objeto endereo e temos agregao composta (composio)

Um exemplo de herana

Atributos, conexes a objetos e mtodos comuns vo na superclasse (classe de generalizao) Adicionamos mais dessas coisas nas subclasses (classes de especializao) Trs situaes comuns para a herana (figura abaixo) Uma transao um momento notvel ou intervalo de tempo

Exemplo no domnio de reserva e compra de passagens de avio

Benefcios da herana

Captura o que comum e o isola daquilo que diferente A herana vista diretamente no cdigo

Problemas da herana

O encapsulamento entre classes e subclasses fraco (o acoplamento forte) Mudar uma superclasse pode afetar todas as subclasses The weak base-class problem Isso viola um dos princpios bsicos de projeto O-O (manter fraco acoplamento) s vezes um objeto precisa ser de uma classe diferente em momentos diferentes Com herana, a estrutura est parafusada no cdigo e no pode sofrer alteraes facilmente em tempo de execuo A herana um relacionamento esttico que no muda com tempo

Cenrio: pessoas envolvidas na aviao (figura abaixo)

o o

Problema: uma pessoa pode mudar de papel a assumir combinaes de papeis Fazer papeis mltiplos requer 7 combinaes (subclasses)

Solucionando o problema com composio: uma pessoa e vrios papeis possveis

Estamos estendendo a funcionalidade de Pessoa de vrias formas, mas sem usar herana Observe que tambm podemos inverter a composio (uma pessoa tem um ou mais papeis) Pense na implicao para a interface de "pessoa" Aqui, estamos usando delegao: dois objetos esto envolvidos em atender um pedido (digamos setNome) O objeto tripulao (digamos) delega setNome para o objeto pessoa que ele tem por composio Tcnica tambm chamada de forwarding semelhante a uma subclasse delegar uma operao para a superclasse (herdando a operao) Delegao sempre pode ser usada para substituir a herana Se usssemos herana, o objeto tripulao poderia referenciar a pessoa com this Com o uso de delegao, tripulao pode passar this para Pessoa e o objeto Pessoa pode referenciar o objeto original se quiser Em vez de tripulao ser uma pessoa, ele tem uma pessoa A grande vantagem da delegao que o comportamento pode ser escolhido em tempo de execuo e vez de estar amarrado em tempo de compilao A grande desvantagem que um software muito dinmico e parametrizado mais difcil de entender do que software mais esttico

O resultado de usar composio

Em vez de codificar um comportamento estaticamente, definimos pequenos comportamentos padro e usamos composio para definir comportamentos mais complexos De forma geral, a composio melhor do que herana normalmente, pois: Permite mudar a associao entre classes em tempo de execuo; Permite que um objeto assuma mais de um comportamento (ex. papel); Herana acopla as classes demais e engessa o programa

5 regras para o uso de herana (Coad)


O objeto " um tipo especial de" e no "um papel assumido por" O objeto nunca tem que mudar para outra classe A subclasse estende a superclasse mas no faz override ou anulao de variveis e/ou mtodos No uma subclasse de uma classe "utilitria" No uma boa idia fazer isso porque herdar de, digamos, HashMap deixa a classe vulnervel a mudanas futuras classe HashMap

O objeto original no "" uma HashMap (mas pode us-la) No uma boa idia porque enfraquece a encapsulao Clientes podero supor que a classe uma subclasse da classe utilitria e no funcionaro se a classe eventualmente mudar sua superclasse Exemplo: x usa y que subclasse de vector x usa y sabendo que um Vector Amanh, y acaba sendo mudada para ser subclasse de HashMap x se lasca! Para classes do domnio do problema, a subclasse expressa tipos especiais de papeis, transaes ou dispositivos

Exemplo da aplicao das regras

Considere Agente, Tripulao e Passageiro como subclasses de Pessoa Regra 1 (tipo especial): no passa. Um Passageiro no um tipo especial de Pessoa: um papel assumido por uma Pessoa Regra 2 (mutao): no passa. Um Agente pode se transformar em Passageiro com tempo Regra 3 (s estende): ok. Regra 4: ok. Regra 5: no passa. Passageiro est sendo modelado como tipo especial de Pessoa e no como tipo especial de papel

Outro exemplo: transaes

Reserva e Compra podem herdar de Transao?

Regra 1 (tipo especial): ok. Uma Reserva um tipo especial de Transao e no um papel assumido por uma Transao Regra 2 (mutao): ok. Uma reserva sempre ser uma Reserva, e nunca se transforma em Compra (se houver uma compra da passagem, ser outra transao). Idem para Compra: sempre ser uma Compra Regra 3 (s estende): ok. Ambas as subclasses estendem Transao com novas variveis e mtodos e no fazem override ou anulam coisas de Transao Regra 4 (no estende classe utilitria): ok. Regra 5 (tipo especial de papel/transao/dispositivo): ok. So tipos especiais de Transao

Para terminar ...

Veremos muitos exemplos das vantagens da composio sobre a herana em Design Patterns, adiante

Exerccio para casa

Neste exemplo, que tal modelar as fitas de vdeo como mostrado na figura abaixo?

Você também pode gostar