Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Dúvida no Ex. 2 da Aula 5 - Estados que variam e o State

Olá,

Pra mim ficou super claro sobre o DesignPattern State e quando usar. Porém, estou com uma dúvida:

Como faço para salvar no banco de dados o estado do objeto?

E como faço para carregar o estado? Visto que no vídeo, o estado do objeto é setado de forma incondicional no construtor.

5 respostas

Oi Renan,

Ótima pergunta! É sempre difícil pensar em como persistir as coisas, certo?

E vc pode persistir como preferir! Vc pode guardar o nome da classe (getClass()), por exemplo. Aí, quando trazer do banco, basta instanciar esse objeto.

Se usar um ORM, como o Hibernate, a estratégia dele é parecida!

O que acha?

Oi Mauricio, Andei pesquisando bastante a respeito do que você disse a respeito da persistência do estado do objeto.

Uma coisa que encontrei em diversos fóruns, são sugestões para serializar o estado do objeto e depois carregá-lo.

Você considera isso uma boa prática para persistir o estado do objeto?

Existe alguma outra opção? Consegue me dar algum exemplo disso aplicado ao C#?

Abraços

Oi Renan,

O que vc quer dizer por "serializar" o objeto? Vc tem um banco de dados, certo? Imagina que vc tem isso:

class NF {
  double valor ;
  Estado e;
}

class Ativo : Estado { ... }
class Inativo : Estado { ... }

Na sua tabela NF, vc pode ter um schema (double, varchar) e salvar os dados assim: (1000, 'Ativo'), (2000, 'Inativo').

Quando carregar a linha do banco, fará (em pseudo-codigo):

double valor = rs.GetCampoDoBanco("valor");
String nomeDoEstado = rs.GetCampoDoBanco("estado");

var nf = new NF(valor, InstanciaPorReflection(nomeDoEstado);

Dei uma rápida googlada por "NHibernate State Pattern" e vi que tem muito post que exemplifica com nhibernate. Dá uma olhada!

Conseguiu entender?

Um abraço!

solução

Oi Mauricio,

Segui sua sugestão de usar reflection e funcionou perfeitamente para mim.

Vou compartilhar o código abaixo, caso alguém também esteja com a mesma dúvida:

        public void Aprova(Orcamento orcamento)
        {
            orcamento.EstadoAtual = new Reprovado();
            //Salvando o state em string
            string NomeDoEstado = orcamento.EstadoAtual.ToString();
            //Instanciando a interface a partir da string
            EstadoDeUmOrcamento estadocarregado = (EstadoDeUmOrcamento)Activator.CreateInstance(Assembly.GetExecutingAssembly().GetType(NomeDoEstado));
        }

Muito obrigado mesmo. Sem dúvidas, esse padrão será de muita ajuda para mim a partir de agora.

Abraços

Boa, Renan!

Última dica: esconda essa reflection dentro de um DAO. Não deixa isso na sua classe de domínio.

PS: Se vc usar NHibernate, ele faz isso automático pra vc! :)

Um abraço!

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