Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Dúvida Herança x Composição

Finalmente após a aula do cap5 comecei a entender o famoso Jargão "Favoreça composição no lugar de herança" pois em minha mente Herança e Composição são dois mecanismos diferentes utilizados para propósitos diferentes e neste curso me foi finalmente apresentado um exemplo prático, pois na internet as pessoas só ficam dizendo use herança no lugar de composição e nunca mostram um exemplo concreto. Tenho um sistema que fiquei tentado em usar herança, mas ai envolveria herança e JPA oque aumentaria ainda mais a minha dor de cabeça, esqueçamos a JPA, como eu implementaria a seguinte situação utilizando a composição?

Meu sistema tem as classes Licitacao, AdesaoRegistroPreco, ContratacaoDireta e RDC e a classe Contrato que pode ocorrer em razão de uma das classes citadas acima, pensei em criar um Enum Tipo Contrato, mas só isso não é suficiente pois preciso guardar o procedimento que originou o contrato.

Na minha visão de composição eu teria que ter 4 classes de contrato,cada um composto de um tipo de procedimento,por exemplo:

public class ContratoLicitacao{

private Licitacao licitacao;

public ContratoLicitacao(Licitacao licitacao){
this.licitacao = licitacao;
}
}

que na realidade implicaria em criar 4 tabelas no banco de dados ,uma para cada tipo de contrato, imagina um relatório de todos os contratos da prefeituraXpto, eu teria que percorrer 4 tabelas.

A outra alternativa mesmo e usar herança, com o discriminador do tipo de contrato, oque na pratica seria uma tabela, totalmente fora de normatização e pelo menos 3 colunas com null por linha.

Qual caminho seguir?

4 respostas

Olá Ricardo, tudo bem?

Pelo o que eu entendi, sua dúvida não é tanto em relação ao uso de composição, mas sim em relação à estratégia de herança utilizada para determinar modelo JPA, não é isso?

Acredito que o ideal, já que aparentemente você não está trabalhando com uma base de dados relacionais legada, seria você primeiramente definir o design das classes do seu modelo dentro das boas práticas de OO...

O que quero dizer é para você tentar pensar neste modelo de classes independentemente da modelagem relacional e somente depois decidir qual a melhor estratégia de herança para sua aplicação. Por exemplo, Licitacao, AdesaoRegistroPreco, ContratacaoDireta e RDC são tipos de Contrato ou elas podem ter um Contrato? Lembre-se da regra do "é-um, tem-um". Ela nos ajuda a definir quando devermos usar herança ou composição.

Espero ter ajudado. Qualquer coisa escreva... Abraço!

Olá Vinicius, obrigado por responder. O problema é que a modelagem OO no fim das contas sempre vai impactar no mundo relacional, é complicado pois são coisas distintas ,porém quando usamos JPA elas andam de mãos dadas. Quanto a problemática acima acho que não cabe a regra do "é um" , tá mais pra composição mesmo,pois Licitacao, AdesaoRegistroPreco, ContratacaoDireta e RDC podem ter 1 ou n contratos, e 1 contrato é composto ou por uma Licitacão ou AdesaoRegistroPreco, ou ContratacaoDireta ou RDC, é fogo , se vacilar nessa modelagem OO o sistema vai ficar zicado rsrs.

solução!

Olá Ricardo, tudo bem? Conforme o que você disse, já que as entidades Licitacao, AdesaoRegistroPreco, ContratacaoDireta e RDC podem ter 1 ou N Contratos(s), acredito que o ideal seria tentar criar uma abstração entre as quatro primeiras entidades (Quem sabe algo como 'DocumentoContrato'?). Com isso, aí sim você poderia ter uma composição entre esta nova superclasse e Contrato: "Contrato * - 1 DocumentoContrato", por exemplo.

Olá Vinícius, pois é criei uma abstração(e uma tabela extra na base de dados) ,o nome da classe é Processo, então licitação,contratação direta, adesão e rdc são compostas por um processo

public class RDC{ @OneToOne //uni direcional private Processo processo; } e Contrato eu teria um Enum referente ao tipo de contrato, e ligaria contrato diretamente no processo

public class Contrato{ @OneToMany //uni direcional private Processo processo; } assim guardaria o processo_id na tabela contrato, agora tenho que ver como vão ficar as essas queries

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software