1
resposta

Fiz esse código baseado no Memento. Gostaria de saber se está ok ???

  public class Livro
    {
        private string _isbn;
        private string _title;
        private string _author;
        private DateTime ultimaData;

        public string ISBN
        {
            get { return _isbn; }
            set
            {
                _isbn = value;
                UltimaData();
            }
        }

        public string Title
        {
            get { return _title; }
            set
            {
                _title = value;
                UltimaData();
            }
        }

        public string Author
        {
            get { return _author; }
            set
            {
                _author = value;
                UltimaData();
            }
        }

        public Livro()
        {
            UltimaData();
        }


        private void UltimaData()
        {
            ultimaData = DateTime.UtcNow;
        }


        public Memento CreateUndo()
        {
            return new Memento(_isbn, _title, _author, ultimaData);
        }

        public void RestoreFromUndo(Memento memento)
        {
            _title = memento.Title;
            _author = memento.Author;
            _isbn = memento.ISBN;
            ultimaData = memento.UltimaData;
        }

        public void ShowBook()
        {
            Console.WriteLine("{0} - '{1}' por {2}, editado em {3}.", ISBN, Title, Author,ultimaData);
        }

    }

  public class Memento
    {

        public string ISBN { get; private set; }
        public string Title { get; private set; }
        public string Author { get; private set; }
        public DateTime UltimaData { get; private set; }

        public Memento(string isbn, string title, string author, DateTime ultimaData)
        {
            ISBN = isbn;
            Title = title;
            Author = author;
            UltimaData = ultimaData;
        }

    }

  public class Historico
    {

        public Memento Memento { get; set; }

    }

  class Program
    {
        static void Main(string[] args)
        {
            Historico historico = new Historico();

            // Inicia um livro
            Livro livro = new Livro();

            livro.ISBN = "0450488357";
            livro.Title = "The Tommyknockers";
            livro.Author = "Stephen King";
            livro.ShowBook();
            System.Threading.Thread.Sleep(2000);

            Console.WriteLine();

            // define o ponto para desfazer
            historico.Memento = livro.CreateUndo();

            // Modifica o livro
            livro.ISBN = "0330376144";
            livro.Title = "The Rats";
            livro.Author = "James Herbert";
            livro.ShowBook();

            Console.WriteLine();

            // Desfaz
            livro.RestoreFromUndo(historico.Memento);
            livro.ShowBook();

            Console.WriteLine();

        }
    }
1 resposta

Olá, Maurício

Aparentemente está tudo certo: você criou uma classe Memento, que armazena uma cópia do estado de Livro. Então você gera uma instância de Memento, como um "checkpoint" para salvar os dados, modifica os dados do livro e depois restaura os dados "salvos" no Memento. Não rodei o código aqui, mas acho que você poderia:

  • Adicionar algumas instruções Console.WriteLine(livro) para imprimir o estado do livro algumas vezes ao longo do seu código, para checar as alterações. Assim fica claro se seu código funcionou ou não.

  • Criar um override para o método ToString() na classe Livro, para gerar um texto com detalhes do livro

  • O campo ultimaData está sem o underscore, ao contrário dos outros campos (apenas para padronizar a nomenclatura)