Herança ou Composição?

2 respostas
davilima81

Caros Javaneses,

Qual das modelagens é a correta?

Estou tendo dificuldades em entender padrões de Projetos :shock:
Não sei se penso na perfomance do sistema ou na ótima modelagem do sistema.




2 Respostas

davilima81

Tentarei ser mais específico, existe a modelagem de um sistema OO com banco OO(exemplo:Caché) e a outra com banco Relacional(PostgreSQL) que é o meu caso.
Ai veio a dúvida usar ou não usar Herança ?

package com.frutacor.producao;

/**

  • @author DAVI FERREIRA DE LIMA
  • @author CRISTIANO SALES

*/

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Basic;

import javax.persistence.Column;

import javax.persistence.DiscriminatorColumn;

import javax.persistence.DiscriminatorType;

import javax.persistence.Entity;

import javax.persistence.EnumType;

import javax.persistence.Enumerated;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import <a href="http://javax.persistence.Id">javax.persistence.Id</a>;

import javax.persistence.Inheritance;

import javax.persistence.SequenceGenerator;

import javax.persistence.Table;

import com.frutacor.enums.EnuTipoUnidadePeso;
import com.frutacor.seguranca.BtpUsuario;

/**
*
*

  • ENTIDADE QUE REPRESENTA O CONJUNTO DE FRUTAS DA EMPRESA
*/

@Entity

@Inheritance

@Table(name = ““FRU_FRUTA””)

@DiscriminatorColumn(name = ““FRU_NOME_FRUTA””, discriminatorType = DiscriminatorType.STRING)

@SequenceGenerator(name = ““seqFruta””, sequenceName = ““seqFruta””, allocationSize = 1)

public abstract class Fruta implements Cloneable,Serializable{
/**
 * 
 */
private static final long serialVersionUID = -4460758749463077394L;


/**
 * É UTILIZADO ID DEVIDO AO MAPEAMENTO DO BANCO DE DADOS RELACIONAL
 */
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "\"seqFruta\"")
@Column(name = "\"FRU_SEQ_FRUTA\"", nullable = false)
protected Long fruSeqFruta;

/**
 * NOME DA FRUTA
 */
@Column(name = "\"FRU_NOME_FRUTA\"", nullable = false, length = 60)
protected String fruNomeFruta;

/**
 * TIPO DA UNIDADE DE PESO
 */
@Basic(optional = false)
@Enumerated(EnumType.ORDINAL)
@Column(name = "\"FRU_UNIDADE_PESO_FRUTA\"", nullable = false, length = 2, columnDefinition = "NUMBER", precision = 0)
protected EnuTipoUnidadePeso fruTipoUnidadePesoFruta;	


public Fruta(Long fruSeqFruta, String fruNomeFruta,
		EnuTipoUnidadePeso fruTipoUnidadePesoFruta,
		Date fruDatCadastroFruta,
		BtpClassificacaoCientifica btpClassificacaoCientifica,
		BtpUsuario btpUsuario) {
	super();
	this.fruSeqFruta = fruSeqFruta;
	this.fruNomeFruta = fruNomeFruta;
	this.fruTipoUnidadePesoFruta = fruTipoUnidadePesoFruta;		
}

public Long getFruSeqFruta() {
	return fruSeqFruta;
}

public void setFruSeqFruta(Long fruSeqFruta) {
	this.fruSeqFruta = fruSeqFruta;
}

public String getFruNomeFruta() {
	return fruNomeFruta;
}

public void setFruNomeFruta(String fruNomeFruta) {
	this.fruNomeFruta = fruNomeFruta;
}

public EnuTipoUnidadePeso getUnidadePesoProducao() {
	
	return fruTipoUnidadePesoFruta;
}


public void setUnidadePesoProducao(EnuTipoUnidadePeso enuTipoUnidadePeso) {
	
	this.fruTipoUnidadePesoFruta = enuTipoUnidadePeso;
}

}

package com.frutacor.producao;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;

import javax.persistence.DiscriminatorValue;

import javax.persistence.Entity;

import javax.persistence.EnumType;

import javax.persistence.Enumerated;

import javax.persistence.SequenceGenerator;

import javax.persistence.Table;

import javax.persistence.Temporal;

import javax.persistence.TemporalType;

import com.frutacor.enums.EnuTipoUnidadePeso;
import com.frutacor.seguranca.BtpUsuario;

@Entity

@Table(name = ““BAN_BANANA””)

@DiscriminatorValue(BANANA)

@SequenceGenerator(name = seqBanana, sequenceName = seqBanana, allocationSize = 1)

public class Banana extends Fruta implements Serializable,IBanana{
private static final long serialVersionUID = 3195685501727132993L;

@Enumerated(EnumType.ORDINAL)
@Column(name = "\"BAN_UNIDADE_PROUCAO_BANANA\"", nullable = false, length = 2, columnDefinition = "NUMBER", precision = 0)
protected EnuTipoUnidadePeso banUnidadeProducaoBanana;

@Column(name = "\"BAN_DAT_CADASTRO_BANANA\"", columnDefinition = "DATE")
@Temporal(TemporalType.DATE)
protected Date banDataCadastroBanana;

@Column(name = "\"BAN_PESO_MEDIO_BANANA\"", precision = 10, scale = 2)
protected Double banPesoMedioBanana;

@Column(name = "\"BAN_CICLO_BANANA\"", nullable = false, length = 2, columnDefinition = "NUMBER", precision = 0)
protected Long banCicloBanana;

@Column(name = "\"BAN_CICLO_PROUCAO_BANANA\"", nullable = false, length = 2, columnDefinition = "NUMBER", precision = 0)
protected Long banCicloProducaoBanana;	


public Banana(Long fruSeqFruta, String fruNomeFruta,
		EnuTipoUnidadePeso fruTipoUnidadePesoFruta,
		Date fruDatCadastroFruta,
		BtpClassificacaoCientifica btpClassificacaoCientifica,
		BtpUsuario btpUsuario,
		EnuTipoUnidadePeso banUnidadeProducaoBanana,
		Date banDataCadastroBanana, Double banPesoMedioBanana,
		Long banCicloBanana, Long banCicloProducaoBanana) {
	super(fruSeqFruta, fruNomeFruta, fruTipoUnidadePesoFruta,
			fruDatCadastroFruta, btpClassificacaoCientifica, btpUsuario);		
	this.banUnidadeProducaoBanana = banUnidadeProducaoBanana;
	this.banDataCadastroBanana = banDataCadastroBanana;
	this.banPesoMedioBanana = banPesoMedioBanana;
	this.banCicloBanana = banCicloBanana;
	this.banCicloProducaoBanana = banCicloProducaoBanana;
}


public Date getDataCadastro() {
	
	return banDataCadastroBanana;
}


public void setDataCadastro(Date dataCadastro) {
	this.banDataCadastroBanana = dataCadastro;
	
}	

@Override
public Long getCiclo() {
	
	return banCicloBanana;
}

@Override
public void setCiclo(Long ciclo) {
	this.banCicloBanana = ciclo;
	
}

@Override
public Long getCicloProducao() {
	
	return banCicloProducaoBanana;
}

@Override
public void setCicloProducao(Long cicloProducao) {
	this.banCicloProducaoBanana = cicloProducao;
	
}


@Override
public Double getPesoMedio() {		
	return banPesoMedioBanana;
}


@Override
public void setPesoMedio(Double pesoMedio) {
	this.banPesoMedioBanana = pesoMedio;
	
}

}

Jemerson

Pelo que você postou,não consegui captar nenhuma forma de estruturar as suas classes a não ser por herança.
Por falar em estruturação,você inverteu a seta que indica que a classe Banana herda de fruta( e para as demais).
Mas se houvesse alguma forma de você estruturar esse modelo colocando composição, seria o mais indicado.
Vamos esperar para ver se alguém posta alguma sugestão que encaixe no seu modelo
Abraços.

Criado 28 de julho de 2011
Ultima resposta 19 de nov. de 2011
Respostas 2
Participantes 2