Persistindo Modelo de Domínio Rico

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); } }

[code]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);
}

}[/code]

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()); } }

[code]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)));
}

}[/code]

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!!!

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

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.

Olá

O seu blog é muito bom. Parabéns!

[]s
Luca