Как java.io.Serializable шаблон Memento? - PullRequest
8 голосов
/ 07 июля 2011

Как мы знаем, шаблон памятного подарка не нарушает инкапсуляцию, захватывает и экстернализует внутреннее состояние объекта и может быть восстановлен позже без знания исходного состояния.

Мой вопрос возникает здесь, как происходит java.io.Serializableэтот шаблон, потому что когда мы сериализуем любую приватную переменную и одновременно записываем состояние объекта в файл, значение закрытой переменной открыто для всего мира, и здесь инкапсуляция кажется неудачной.

Ответы [ 3 ]

4 голосов
/ 07 июля 2011

В статье Википедии о шаблоне Memento ничего не говорится о инкапсуляции, фактически, приведенный там пример точно отражает состояние, которое содержится в закрытой переменной в Memento.

Инкапсуляция («A язык механизм для ограничения доступа к некоторым компонентам объекта») относится к тому, как вы должны писать код, чтобы изменить внутреннее состояние объекта.

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

Защита полей путем помещения их в частный доступ призвана помочь разработчику поддерживать состояния объектов в согласованном состоянии, т. Е. Избегать того, чтобы поля устанавливались в несовместимое состояние из кода вне этого класса (например, если значение поля A зависит от значения поля B).

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

0 голосов
/ 07 июля 2011

Насколько я понимаю, шаблон Memento не указывает ничего о формате / непрозрачности / безопасности самого memento / токена. Формат памятки (читаемый человеком, полностью зашифрованный или где-то посередине) не имеет отношения к самому шаблону.

Я бы сказал, что сериализация (XML или двоичная) является прекрасным примером реализации Memento. Тот факт, что он предоставляет внутренние объекты, может означать, что это не лучшая реализация для вашего проекта. Тем не менее, это все еще действительная реализация шаблона. :)

0 голосов
/ 07 июля 2011

Из статьи по инкапсуляции в Википедии: В языке программирования инкапсуляция используется для обозначения одного из двух связанных, но различных понятий, а иногда и их комбинации:

  • Языкмеханизм ограничения доступа к некоторым компонентам объекта.
  • Языковая конструкция, которая облегчает связывание данных с методами (или другими функциями), работающими с этими данными.

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

Инкапсуляция не нарушена.Шаблон memento не позволяет объекту смотрителя изменять объект memento, чтобы инициатор мог использовать его для отката или других утилит.

...