Философия за памятью

9

Я читал на память шаблон из разных источников в Интернете. Различия в информации из разных источников привели меня в замешательство относительно того, почему эта модель действительно необходима.

Реализация dofactory говорит, что основной целью этого шаблона является восстановление состояния системы.

Вики говорит, что основное намерение состоит в том, чтобы иметь возможность восстановить изменения в системе. Это дает другое влияние, говоря о том, что система может иметь реализацию memento без необходимости восстановления. И эта способность восстановления является особенностью этого.

OODesign говорит, что

Иногда необходимо зафиксировать внутреннее состояние объекта в некоторый момент и иметь возможность восстановить объект в это состояние позднее. Такой случай полезен в случае ошибки или сбоя.

Итак, мой вопрос: почему именно мы используем этот? Это для того, чтобы спасти предыдущие штаты - или способствовать инкапсуляции между Смотрителем и Мементом? Почему этот тип инкапсуляции так важен?

Изменить: Для тех, кто посещает, проверьте эту реализацию!

Редактировать : я работаю в реализации памятного решения моей проблемы. Я опубликую еще один вопрос относительно этого и свяжу этот вопрос с этим. Спасибо всем за ответы с ценными предложениями!

Редактировать 3 : Вот ссылка на мой пример реализации

TheSilverBullet
источник

Ответы:

2

Аналогичный шаблон Memo или Memoization также хранит состояние, но часто используется в качестве оптимизации скорости программы. Если трудоемкая операция имеет ограниченное количество общих входов и выходов, наиболее распространенные (или все) могут быть сохранены в хеш-таблице. При повторном вызове с теми же входами он сначала проверяет хеш-таблицу и, если находит их, возвращает предыдущий вывод без его пересчета.

Я предполагаю, что шаблон Memento мог бы также использоваться для производительности - вместо того, чтобы делать все обратные вычисления для обратного изменения состояния, просто восстановите из предыдущего состояния. Некоторые функции являются односторонними, поэтому отмена невозможна, если вы не сохраните предыдущее состояние.

Вы можете использовать шаблон Memento для запоминания периодической или симметричной функции, такой как синус. Вычислите все значения от 0 до 180 градусов, затем пройдите их назад, чтобы получить отрицательные значения от 180 до 360. А еще лучше, рассчитать значения от 0 до 90, затем пройти назад через эти значения, чтобы получить 90-180, вперед на 180-270 и назад от 270-360.

Ctrl-Z в Word, или функция отмены любого программного обеспечения, вероятно, реализуется с помощью шаблона памяти или, в некоторых случаях, возможно, путем обратной функции, которая внесла каждое изменение. Во втором случае история вызова функций была бы памятными, поэтому я полагаю, что шаблон памяти всегда используется для отмены.

GlenPeterson
источник
шаблон запоминания, используемый для предотвращения обратного расчета и для периодических функций - спасибо за эту информацию! Ничего подобного практическому примеру, в котором просачиваются концепции!
TheSilverBullet
Это может также использоваться с чем-то вроде метода Ньютона для приближения квадратного корня, чтобы решить, когда вы закончите. mitpress.mit.edu/sicp/full-text/book/… Поскольку базовое представление с плавающей точкой имеет ограниченную точность, все числа в конечном итоге будут иметь повторяющиеся приближения. Если вы знаете, какими были старые приближения, вы можете прекратить аппроксимацию при первом повторении ответа и получить максимальную точность (за счет некоторого времени и памяти).
ГленПетерсон
8

Сам по себе шаблон Memento используется только для захвата и сохранения состояний. Инкапсуляция существует только для защиты состояний от остальной части системы - как только состояние захвачено, его необходимо тщательно контролировать. Например, не имеет смысла иметь возможность изменять предыдущее состояние после его сохранения (это изменило бы историю), и может не иметь смысла просто возвращаться в предыдущее состояние одного объекта, не затрагивая другие (чтобы предотвратить система от входа в полностью недействительное состояние).

Самое распространенное использование Memento, которое я видел, это поддержка отмены функций. Это также связано с сохранением функциональности повтора путем перемещения назад во времени.

Томас Оуэнс
источник
Я также использовал его в логике копирования и логике сериализации (для отправки объектов по проводам или сохранения состояния в файл).
Скотт Уитлок
@ScottWhitlock Сохранение состояния в файл имеет смысл для Memento. Объект Memento будет иметь возможность записывать себя в указанный формат и создавать новый, читая этот формат, в то время как Смотритель предоставит интерфейс для сохранения состояния во внешний формат или загрузки состояния из внешнего формата - это просто расширение для сохранения состояния в памяти. Однако я не вижу, как это используется в логике копирования. Я должен был бы думать об этом намного больше.
Томас Оуэнс
@ThomasOwens, спасибо за ту важную часть в вашем объяснении, что памятка в основном "сохранять" состояния. Исполнитель оставляет за собой право восстанавливать или нет! Я обнаружил, что эта часть объяснения отсутствует во всех моих ссылках !!
TheSilverBullet
@ ScottWhitlock, большое спасибо за ссылку на вашу реализацию сувенира! Я смог понять не только его основное использование, но и интуитивное использование, как вы сделали!
TheSilverBullet
1

Все эти определения направляют вас в одном направлении; все они говорят, что смысл в том, чтобы иметь возможность восстановить что-то в своем прежнем состоянии. Это может быть что-то целое или просто один объект.

Этот шаблон полезен, если запись изменяет состояние с течением времени, но у вас есть деловое требование, чтобы иметь возможность восстановить ее в любое предыдущее состояние в любое время. Или, в качестве альтернативы, если вам нужно иметь возможность просматривать записи, как это было в любой предыдущий момент времени. Эти типы требований очень распространены во многих типах систем.

hvgotcodes
источник