Pesquisar este blog

22 outubro, 2009

Herança versus Composição

Façam seus comentários

6 comentários:

Marcos R Oliveira disse...

Herança.
É o compartilhamento de atributos e método com a super classe, evitando repetir métodos e atributos na sub classe. A herança é clara no código.
Pontos negativos da Herança:
Encapsulamento é faço na herança: porque para proteger os métodos e atributos é declarado private.
Tem momento que o objeto tem que ser de classe diferente da super classe, como herança é uma relacionamento estático e não pode ser alterado em tempo de execução.
Ex. Um objeto pode mudar de um papel para papeis e isso não é possível em herança.

Composição.
Composição estende uma classe pela delegação de função.
Ex. temos um objeto papel e um objeto tipo de papel que podemos delegar ao objeto papel o tipo de papel. Podemos usar GET e SET para delegar a composição. Esta técnica e chamada de FORWARDING onde a delegação pode substituir a herança, em herança usamos this para fazer referencia na subclasse em delegação de composição a referencia fica na super com referencia do objeto original.
E a delegação pode ser alterada em tempo de execução.
Ponto negativo da composição:
Como a composição muda muito fica mais difícil o entendimento do software em relação o estático.

Athos A. Araujo disse...

Pela minha pesquisa,eu cheguei a conclusão de que a Herança esta sendo muito criticada pela maior parte dos programadores.


Os motivos de muitas criticas esta relacionado com o perigo que a herança pode gerar ao passar os atributos e métodos da classe SuperClasse,para SubClasse,uma alteração na SuperClasse ou até mesmo a sua remoção causaria um desastre tremendo no software," Erros um atrás do outro ",em conseguencia da alteração na SuperClasse.

As SubClasses obrigatoriamente necessitam de alteração para se adequar a classe SuperClasse,sendo assim a manutenção do software é mais problematica,pois uma alteração nos metodos da SuperClasse influencia diretamente a SubClasse.

Já a Composição,evita o problema citado a cima que a herança pode causar no software.
Na composição a SubClasse(se é que pode ser chamado assim na Composição) tem apenas uma referência da SuperClasse,portanto uma alteração na SuperClasse, na composição a solução do problema é bem mais fácil e ágil pois é só alterar a referencia que a SubClasse possui da SuperClasse, sendo assim não é necessário alterar os atributos e métodos das SubClasses.

Na Composição uma classe não é totalmente dependente de uma outra classe,na herança a SubClasse é obrigatoriamente dependente da SuperClasse,senão a SubClasse não existe.
Como a composição não gera dependência entre uma classe e outra, a manutenção e a atualização do sotware é bem mais rápido,fácil e pratico.

Se um objeto compartilha os atributos e métodos e fazem parte do mesmo contexto,ou visão o indicado pode ser a Herança,mas se a intenção for reaproveitar serviços de uma determinada classe sem que a classe que for reaproveitar não faz parte do mesmo contexto ou visão o indicado é a Composição.

Muitos utilizam herança para facilitar o uso do Polimorfismo,mas esta não é uma alternativa 100% seguro no contexto de POO.

Alguns utilizam Composição e Herança com o objetivo do reaproveitamento de código.

Tanto para o reaproveitamento de código e para facilitar o uso do Polimorfismo, o uso de Interfaces é a melhor opção no ponto de vista de POO.

Sendo assim concluo que o uso de Interfaces é o conceito chave para uma boa modelagem de software,evitando todos os problemas que a Composição e a Herança pode provocar no software.

Mas o bom uso de ambos,sem necessariamente abolir um ou outro também ocasiona em uma boa modelagem de software vai depender apenas do programador saber em qual momento é mais ideal para utilizar um ou outro.

Agora para falar de Interfaces,acho que é melhor um outro Post.. hehehe

Por favor me corrijam se eu estiver errado em alguma parte..,

Obrigado

Unknown disse...

HERANÇA
Através da herança podem se criada uma família de classes (uma hierarquia entre classes) onde os dados já definidos para um determinada classe podem ser herdados por outras classes da
família. As classes geradas à partir de outras classes são chamadas classes filhas e herdam propriedades da classe mais geral, chamada classe pai. As classes filhas podem, além de herdar as características da classe pai, possuir novas características ou funcionalidades e por isso são mais especializadas do que aquelas.
- Assim, pode-se criar uma nova classe programando somente as diferenças desta para a classe pai. A classe filha herda a interface da classe pai e um objeto da classe filha pode substituir um objeto da classe pai.
- Identifica-se a possibilidade de herança através da seguinte
expressão típica: é um tipo de...
- A herança é um mecanismo estático, não permitindo assim a reconfiguração dinâmica de um sistema;
- A herança cria um forte acoplamento entre uma classe e as suas classes ancestrais, diminuindo assim a possibilidade de reutilização de uma classe em um outro projeto.


COMPOSIÇÃO:
- A composição nos permite obter funcionalidades complexas através da colaboração de vários objetos que implementam funções mais simples.
- A composição é um mecanismo de reutilização caixa preta, pois os detalhes internos dos objetos não precisam ser expostos.
- A composição permite a reconfiguração dinâmica de um sistema.
- Uma instância da classe existente é usada como componente da nova classe. Quando se quer as características de uma classe, mas não seus campos e métodos.
- Objetos podem ser inicializados no construtor
- Flexibilidade.
- Pode trocar objetos durante a execução.

COMPOSIÇÃO E HERANÇA
- Composição e herança não são mutuamente exclusivas.
- As técnicas podem ser usadas em conjunto para obter os melhores resultados de cada uma.
- No desenvolvimento, composição é a técnica predominante
- Herança geralmente ocorre mais no design de tipos 8

QUANDO VOCÊ PRECISA DE UMA CLASSE, VOCÊ PODE:
- Usar uma classe que faz exatamente o que você deseja fazer.
- Escrever uma classe do zero.
- Reutilizar uma classe existente com composição
- Reutilizar uma classe existente ou estrutura de classes com herança.


Quando usar?
Composição ou herança?

Herança – estrutura é um tipo de.
Composição – estrutura contém.

Identifique os componentes do objeto, suas partes. Essas partes devem ser agregadas ao objeto via composição (é parte de)

Classifique seu objeto e tente encontrar uma semelhança de identidade com classes existentes.

Herança só deve ser usada se você puder comparar seu objeto A com outro B dizendo, que A "é um tipo de..." B.

Tipicamente, herança só deve ser usada quando você estiver construindo uma família de tipos (relacionados entre si)

Conclusão: Grande parte dos especialistas criticam o abuso da utilização de heranças.

Unknown disse...

Herança e Composição são dois mecanimos utilizados para reutilizar funcionalidades.

Na Herança, as classes estendem métodos e atributos da classe Pai, já a composição estende uma classe pela delegação de trabalho para outro objeto.
Um exemplo de composição: um controle de domínios de uma empresa!! Uma empresa "tem um" endereço. Podemos deixar o objeto empresa responsável pelo objeto endereço e temos aí uma agregação composta ou em outras palavras composição.
Herança é quando classes possuem atributos e métodos em comum. Esses métodos e atributos em comum vão para a superclasse. Um exemplo é um sistema de uma empresa onde é realizado um cadastro de funcionários. Podemos criar uma classe Funcionário com seus métodos e atributos. Mas devemos pensar que uma Secretária, um Diretor, um Gerente são Funcionários.

Na Composição um objeto "tem outro". E já na Herança uma classe "é" outra (Diretor é um Funcionário).

Nas pesquisas que fiz o que mais se diz é que composição é superior à herança, porque mudanças nas classes Pai podem afetar todo o funcionamento das filhas.

Cristiane A. Souza

Debora disse...

Herança
Uma classe pode herdar de outra classe seu estado e comportamento.
Na herança o acoplamento é forte, mudar uma superclasse pode afetar todas as subclasses, às vezes, um objeto precisa fazer coisas diferentes em momentos diferentes e a herança é um relacionamento estático.
Seus benefícios são: captura o que é comum eo isola daquilo que é diferente e ela é vista diretamente no código.

Composição
Em vez de codificar um comportamento estaticamente, definimos pequenos comportamentos padrão e usamos composição para definir comportamentos mais complexos.
A composição é melhor do que a herança normalmente, pois: permite mudar a associação entre classes em tempo de execução e permite que um objeto assuma mais de um comportamento.

Marco Thúlio A. Rezende disse...

Herança versus Composição

Composição e Herança
Composição e herança são dois mecanismos para reutilizar funcionalidade.
Alguns anos atrás (e na cabeça de alguns programadores ainda!), a herança era considerada a ferramenta básica de extensão e reuso de funcionalidade.
A composição estende uma classe pela delegação de trabalho para outro objeto a herança estende atributos e métodos de uma classe.
Hoje, considera-se que a composição é muito superior à herança na maioria dos casos
• A herança deve ser utilizada em alguns (relativamente poucos) contextos.
Um exemplo de composição
Use composição para estender as responsabilidades pela delegação de trabalho a outros objetos.
Um exemplo no domínio de endereços.
• Uma empresa tem um endereço (digamos só um).
• Uma empresa "tem" um endereço.
• Podemos deixar o objeto empresa responsável pelo objeto endereço e temos agregação composta (composição).
Um exemplo de herança
Atributos, conexões a objetos e métodos comuns vão na superclasse (classe de generalização).
Adicionamos mais dessas coisas nas subclasses (classes de especialização).
Três situações comuns para a herança (figura abaixo).
• Uma transação é um momento notável ou intervalo de tempo.

Benefícios da herança

Captura o que é comum e o isola daquilo que é diferente. A herança é vista diretamente no código.
Problemas da herança
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 princípios básicos de projeto O-O (manter fraco acoplamento)
Às vezes um objeto precisa ser de uma classe diferente em momentos diferentes
• Com herança, a estrutura está parafusada no código e não pode sofrer alterações facilmente em tempo de execução
• A herança é um relacionamento estático que não muda com tempo
• Cenário: pessoas envolvidas na aviação.
Problema: uma pessoa pode mudar de papel a assumir combinações de papeis.
Fazer papeis múltiplos requer 7 combinações (subclasses)
Solucionando o problema com composição: uma pessoa e vários papeis possíveis
Estamos estendendo a funcionalidade de Pessoa de várias formas, mas sem usar herança
Observe que também podemos inverter a composição (uma pessoa tem um ou mais papeis)
• Pense na implicação para a interface de "pessoa"
Aqui, estamos usando delegação: dois objetos estão envolvidos em atender um pedido (digamos setNome)
• O objeto tripulação (digamos) delega setNome para o objeto pessoa que ele tem por composição
• Técnica também chamada de forwarding
• É semelhante a uma subclasse delegar uma operação para a superclasse (herdando a operação)
• Delegação sempre pode ser usada para substituir a herança
• Se usássemos herança, o objeto tripulação poderia referenciar a pessoa com this
• Com o uso de delegação, tripulação pode passar this para Pessoa e o objeto Pessoa pode referenciar o objeto original se quiser
• Em vez de tripulação ser uma pessoa, ele tem uma pessoa
• A grande vantagem da delegação é que o comportamento pode ser escolhido em tempo de execução e vez de estar amarrado em tempo de compilação
• A grande desvantagem é que um software muito dinâmico e parametrizado é mais difícil de entender do que software mais estático. O resultado de usar composição.
Em vez de codificar um comportamento estaticamente, definimos pequenos comportamentos padrão e usamos composição para definir comportamentos mais complexos.
De forma geral, a composição é melhor do que herança normalmente, pois:
• Permite mudar a associação entre classes em tempo de execução;
• Permite que um objeto assuma mais de um comportamento (ex. papel);
• Herança acopla as classes demais e engessa o programa.