Persistindo Modelo de Domínio Rico

3 respostas
gulira

Persistindo Modelo de Domínio Rico

Pessoa, atualmente venho me dedicando ao Pattern Domain Model e após ler o livro [Patterns of Enterprise Application Architecture] de Fowler e um artigo da revista Mundo Java N. 22 [Design Pattern para o Mundo Real - parte 2] de Rodrigo Yoshima, bateu uma grande duvida:

Como persistir um modelo de domínio que utiliza diversos Patters como State citado pelo Rodrigo ou Strategy utilizado por Fowler em seus exemplos no Domain Model.

Vamos utilizar o exemplo de Fowler:
http://martinfowler.com/eaaCatalog/domainModel.html

class Contrato{
	....
	public void calcularLancamento(){
		produto.calcularLancamentoDeReceitas(this);
	}
}
class Produto{
	private String nome;
	private EstrategiaLancamento estrategiaLancamento;

	public Produto(String nome, EstrategiaLancamento estrategia){
		this.nome = nome;
		this.estrategiaLancamento = estratégia;
	}

	public static Produto novoProduto1(String nome){
		return new Produto(nome,new EstrategiaLancamentoTotal());
	}

	Public static Produto novoProduto2(String nome){
		return new Produto(nome, new EstrategiaLancamentoEmTresEtapas(int etapa1, int etapa2));
	}

	void calculaLancamentoDeReceita(Contrato contrato){
		return estrategiaLancamento.calcularLancamentoDeReceita(contrato);
	}
}
abstract class EstrategiaLancamento{
	abstract void calcular calcularLancamentoDeReceita(Contrato contrato);
}
class EstrategiaLancamentoTotal extends EstrategiaLancamento{
	void calcularLancamentoDeReceitas(Contrato contrato){
		contrato.adicionarLancamentoDeReceitas(new LancamentoDeReceitas(contrato.lerReceita()), contrato.lerDataAssinatura());
	}
}
class EstrategiaLancamentoEmTresEtapas extends EstrategiaLancamento{
	
	private int primeiraEtapaDeLancamento;
	private int segundaEtapaDeLancamento;

	public EstrategiaLancamentoEmTresEtapas(int primeira, int segunda){
		this.primeiraEtapaDeLancamento = primeira;
		this.segundaEtapaDeLancamento = segunda;
	}

	void calcularLancamentoDeReceitas(Contrato contrato){				
		Dinheiro[] alocao = contrato.lerReceita().alocar(3);
		contrato.adicionarLancamentoDeReceitas(new LancamentoDeReceitas(alocacao[0],contrato.lerDataAssinatura()));
		contrato.adicionarLancamentoDeReceitas(new LancamentoDeReceitas(alocacao[1],contrato.adicionarDias(primeira)));
		contrato.adicionarLancamentoDeReceitas(new LancamentoDeReceitas(alocacao[2],contrato.adicionarDias(segunda)));
	}
}

quando for persistir a entidade Produto na camada de persistencia "JPA" eu devo persistir em banco de dados a classe Strategy tambem???
é ai que esta minha grande dúvida!!!!

3 Respostas

pcalcado

[eidtando] Se sua Strategy faz parte do estado do objeto a resposta é sim.

sergiotaborda

O padrão Strategy implica que a estratégia é escolhida dinamicamente. Logo, não uma injeção da estratégia no produto e o produto pode determinar a estratégia diretamente do seu estado.
Por definição, também, a estratégia é um objeto stateless, logo não faz sentido guardá-lo. Vc iria guardar o quê ? o nome da classe ?

Agora, no seu modelo - que não segue o padrão strategy completamente - vc está injetando via construtor a estratégia. Isso implica automáticamente em que quem chama o construtor sabe , ou pode saber , qual estratégia injetar. Portanto, ele pode saber isso a qualquer momento podendo recuperar a estratégia e injetá-la sempre que necessário.

O ponto é que : a estratégia não é parte do estado do sistema. é parte do comportamento do sistema. Logo ela , em si mesma, tem que ser persistivel tanto quanto um método de um classe. Ou seja, não tem que ser persistivel. Logo não ha porque se preocupar em como usar o JPA para persistir a estratégia.

Luca

Olá

O seu blog é muito bom. Parabéns!

[]s
Luca

Criado 17 de setembro de 2008
Ultima resposta 17 de set. de 2008
Respostas 3
Participantes 4