Eu acho meio hipócrita do Gosling ou qualquer outro envolvido com a criação de Java falar mal de herança. O grande problema é que Java não oferece nenhum mecanismo para reuso de código comparável a herança. Se houvessem mixins ao menos…
Não dá para dizer. Sem conhecer o domínio e a implementação qualquer exemplo é falho. O que é uma Transação neste contexto? Eu já trabalhei para alguns bancos e cada um tem um conceito diferente, mesmo várias definições dentro da mesma instituição.
Eu não sou xiita quanto a isso simplesmente porque já vi muita besteira sendo feita em nome de “herança é ruim, use composição”. Isso é uma rule of thumb e não uma lei. Como falei antes o design de Java faz com que seja muito difícil resolvermos problemas comuns sem heranças ou gambiarras (strategy de uma implementação só e o fim).
Para mim, a decisão entre delegação e herança passa pelo domínio e este é o principal juiz. Esta delegação faz sentido no domínio? Eu dificilmente criaria uma classe extra na Camada de Negócios só para satisfazer uma rule of thumb.
Desculpe :oops: … Você acreditaria se eu dissesse que pensei mil vezes antes de fazer isso? Fiz porque a rotatividade do Java Básico é muito alta, e também porque não encontrei outra opção de torná-lo visível novamente.
Entendo. Aparentemente trata-se de uma transação financeira e não bancária. O contexto no qual o exemplo se encaixa é muito vago, não dá mais detalhes sobre o domínio.
Pois é… Eu estava falando justamente isso pra um amigo meu que leu sobre isso há pouquíssimo tempo, e ficou xiita quanto à herança. Quando algumas pessoas se deparam com esse "mantra" pela primeira vez, ficam tão impressionadas que passam a abominar totalmente seu uso. Isso ocorre porque elas vinham utilizando herança em todas as situações que requeriam apenas composição ( o caso Pessoa -> PessoaFisica é clássico ).
um exemplo de composição a partir de interfaces você pode visualizar a partir deste modelo abaixo pelo padrão observer:
já para um modelo com classes abstratas, seria o mesmo padrão utilizando as classes no pacote java.util, como Observable. neste caso prefiro o 1º caso.