Filosofia por trás do padrão de lembranças

9

Eu tenho lido sobre o padrão de lembranças de várias fontes da Internet. Informações diferentes de fontes diferentes me deixaram confuso a respeito de por que esse padrão é realmente necessário.

A implementação dofactory diz que a principal intenção desse padrão é restaurar o estado do sistema.

O Wiki diz que a intenção principal é poder restaurar as alterações no sistema. Isso causa um impacto diferente - dizendo que é possível que um sistema tenha implementação de memento sem a necessidade de restauração. E essa capacidade de restauração é uma característica disso.

OODesign diz que

Às vezes, é necessário capturar o estado interno de um objeto em algum momento e ter a capacidade de restaurar o objeto para esse estado mais tarde. Esse caso é útil em caso de erro ou falha.

Então, minha pergunta é por que exatamente usamos este? É para salvar estados anteriores - ou para promover o encapsulamento entre o zelador e o Memento? Por que esse tipo de encapsulamento é tão importante?

Edit: Para quem visita, confira esta Implementação!

Edit : Estou trabalhando na implementação de uma solução de lembrança para o meu problema. Vou postar outra pergunta sobre isso e vincular essa pergunta a esta. Obrigado a todos por responder com sugestões valiosas!

Edit 3 : Aqui está o link para minha implementação de amostra

TheSilverBullet
fonte

Respostas:

2

Um padrão semelhante, Memo ou Memoization, também armazena o estado, mas é frequentemente usado como uma otimização da velocidade do programa. Se uma operação demorada tiver um número limitado de entradas e saídas comuns, as mais comuns (ou todas elas) poderão ser armazenadas em uma hashtable. Quando chamado novamente com as mesmas entradas, ele primeiro verifica a hashtable e, se as encontrar, retorna a saída anterior sem recalculá-la.

Eu imagino que um padrão Memento também possa ser usado para desempenho - em vez de fazer todos os cálculos reversos para uma mudança de estado reverso, basta restaurar a partir do estado anterior. Algumas funções são unidirecionais, portanto, não há desfazer, a menos que você armazene o estado anterior.

Você pode usar um padrão Memento para memorizar uma função periódica ou simétrica como seno. Calcule todos os valores de 0 a 180 graus e depois retroceda para obter os valores negativos de 180 a 360. Melhor ainda, calcule valores de 0 a 90 e, em seguida, volte a esses valores para obter 90-180, avance para 180-270 e avance de 270-360.

Ctrl-Z no Word, ou a função desfazer de qualquer software, provavelmente é implementada usando o padrão de lembrança, ou em alguns casos, possivelmente por uma reversão da função que fez cada alteração. No segundo caso, o histórico de quais funções foram chamadas seria lembranças, então suponho que o padrão de lembrança seja sempre usado para desfazer.

GlenPeterson
fonte
padrão de memorização usado para evitar o cálculo reverso e para funções periódicas - obrigado por esta informação! Nada como um exemplo prático para introduzir os conceitos!
TheSilverBullet
Também pode ser usado com algo como o método de Newton para aproximação de raiz quadrada para decidir quando você termina. mitpress.mit.edu/sicp/full-text/book/… Como a representação de ponto flutuante subjacente tem precisão limitada, todos os números eventualmente terão aproximações repetidas. Se você souber quais eram as aproximações antigas, pode parar de se aproximar da primeira vez em que repete uma resposta e obtém a máxima precisão (às custas de algum tempo e memória).
precisa saber é o seguinte
8

Por si só, o Padrão de Memento é usado apenas para capturar e salvar estados. O encapsulamento existe apenas para proteger os estados do resto do sistema - uma vez que um estado é capturado, ele precisa ser controlado com cuidado. Por exemplo, não faz sentido poder alterar um estado anterior depois que ele é salvo (isso mudaria o histórico) e pode não fazer sentido simplesmente retornar ao estado anterior de um objeto sem afetar outros (para impedir o sistema entre em um estado totalmente inválido).

O uso mais comum de um Memento que eu já vi é dar suporte à funcionalidade de desfazer. Também está relacionado ao armazenamento da funcionalidade de refazer retornando no tempo.

Thomas Owens
fonte
Eu também o usei na lógica de cópia e na lógica de serialização (para enviar objetos por uma ligação ou salvar o estado em um arquivo).
Scott Whitlock
@ScottWhitlock Salvar o estado em um arquivo faz sentido para o Memento. O objeto Memento teria a capacidade de se escrever em um formato especificado e criar um novo lendo esse formato, enquanto o Caretaker forneceria a interface para salvar o estado em um formato externo ou carregar o estado no formato externo - é apenas uma extensão para salvar o estado na memória. Eu realmente não consigo ver o seu uso na lógica da cópia. Eu teria que pensar muito mais sobre isso.
Thomas Owens
11
Aqui está um exemplo de como usá-lo na lógica de cópia no VB6 .
27112 Scott Scottlock
@ Thomashowens, obrigado por essa parte importante de sua explicação de que a lembrança é basicamente "salvar" estados. É critério do implementador restaurar ou não! Achei essa parte da explicação ausente de todas as minhas referências !!
TheSilverBullet
@ScottWhitlock, muito obrigado pelo link para a implementação da sua lembrança! Consegui entender não apenas seu uso básico, mas também o uso intuitivo, como você fez!
TheSilverBullet
1

Todas essas definições direcionam você na mesma direção; todos estão dizendo que o ponto é poder restaurar algo ao seu estado anterior. Que algo pode ser o sistema inteiro, ou apenas um único objeto.

Esse padrão é útil se um registro mudar de estado ao longo do tempo, mas você tem o requisito de negócios para poder restaurá-lo para qualquer estado anterior a qualquer momento. Ou, alternativamente, se você precisar visualizar o registro como estava em qualquer momento anterior. Esses tipos de requisitos são muito comuns em muitos tipos de sistemas.

hvgotcodes
fonte