Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvida Aula 3 | Atividade ( 3 , 4 )

Pessoal,

Sobre o design pattern memento, efetuei a implementação utilizando o State em conjunto, está certo?

public class Contrato
    {
        public DateTime Data { get; private set; }
        public string Cliente { get; private set; }
        public ITipoContrato Tipo { get; set; }
        public ContratoHistorico Historico { get; set; }

        public Contrato(DateTime data, string cliente)
        {
            Data = data;
            Cliente = cliente ?? throw new ArgumentNullException(nameof(cliente));
            Tipo = new StatusContratoNovo();
            Historico = new ContratoHistorico();
        }

        private Contrato(DateTime data, string cliente, ITipoContrato tipo) : this(data, cliente)
        {
            Tipo = tipo;
        }

        public void Avanca()
        {
            Historico.Adiciona(SalvaHistoricoContrato());
            Tipo.Avanca(this);
        }

        private Contrato SalvaHistoricoContrato()
        {
            return new Contrato(this.Data, this.Cliente, this.Tipo);
        }

        public override string ToString()
        {
            return $"Data: {Data}; Cliente: {Cliente}; Tipo: {Tipo}";
        }
    }
    public interface ITipoContrato
    {
        void Avanca(Contrato contrato);
    }

 public class StatusContratoNovo : ITipoContrato
    {
        public void Avanca(Contrato contrato)
        {
            contrato.Tipo = new StatusContratoEmAndamento();
        }

        public override string ToString()
        {
            return "Novo";
        }
    }

  public class StatusContratoEmAndamento : ITipoContrato
    {
        public void Avanca(Contrato contrato)
        {
            contrato.Tipo = new StatusContratoAcertado();
        }

        public override string ToString()
        {
            return "EmAndamento";
        }
    }

public class StatusContratoConcluido : ITipoContrato
    {
        public void Avanca(Contrato contrato)
        {
            throw new Exception("Contratos concluídos não pode ser avançado!");
        }

        public override string ToString()
        {
            return "Concluído";
        }
    }

public class StatusContratoAcertado : ITipoContrato
    {
        public void Avanca(Contrato contrato)
        {
            contrato.Tipo = new StatusContratoConcluido();
        }

        public override string ToString()
        {
            return "Acertado";
        }
    }

public class ContratoHistorico
    {
        public IList<Contrato> Contratos { get; private set; }

        public ContratoHistorico()
        {
            Contratos = new List<Contrato>();
        }

        public void Adiciona(Contrato contrato)
        {
            Contratos.Add(contrato);
        }

        public Contrato GetContratoHistorico(int index)
        {
            return Contratos[index];
        }
    }

public class Program
    {
       public  static void Main(string[] args)
        {
            var contrato = new Contrato(DateTime.Now, "luis");
            Console.WriteLine(contrato);
            contrato.Avanca();
            Console.WriteLine(contrato);
            contrato.Avanca();
            Console.WriteLine(contrato);
            contrato.Avanca();
            Console.WriteLine(contrato);

            Console.WriteLine("\n================================");
            foreach (var item in contrato.Historico.Contratos)
            {
                Console.WriteLine(item);
            }

        }
}
1 resposta
solução!

Oi, tudo bem?

Pela resolução do instrutor:

https://cursos.alura.com.br/course/design-patterns-2-dot-net/task/4292

O instrutor está:

  • avança o estado do contrato (Novo-> EmAndamento -> Encerrado)
  • e depois salva o estado

Mas pelo que reparei no seu código, você

  • avança o estado do contrato (Novo-> EmAndamento -> Encerrado)
  • e depois imprime o estado no console

Reparei que você está salvando o estado dentro do método Avanca(). Não está errado, porém o problema é que esse método está fazendo duas coisas (avançando o estado e salvando o estado). Acho que o exemplo do instrutor é mais adequado por não acumular funcionalidades no método Avanca(). Assim, você pode deixar a responsabilidade de salvar ou não fora do método.