Шаблон Хранитель в АОП реализации

Вторым на очереди в описании оказался шаблон проектирования Хранитель (Memento). На мой взгляд этот шаблон достаточно просто реализовать, по крайней мере его идеологическая суть ясна многим без детальных объяснений.

Для реализации шаблона в АОП стиле я буду использовать коммерческий продукт PostSharp. Скорее всего описанные подходы вы сможете использовать и с другими АОП фреймворками, просто это будет чуть более многословное и не столь удобное в вопросе продолжительного использования решение.

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

Общая информация

Для полноты картины, я считаю, что надо все так же привести основные характеристики и назначение шаблона.

Хранитель относится к категории Поведенческих шаблонов.

Намерение

В вашей системе необходимы точки отката данных. Например, вы разрабатываете приложение, которое позволяет пользователям активно редактировать данные. Хорошим тоном является дать возможность пользователю откатывать назад сделанные изменения и не один раз, а последовательно, один за одним, до предыдущего явно сохраненного состояния данных. Фактически это всем знакомый функционал undo/redo.

Суть

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

Очень важным моментом является — «не раскрывая своего содержимого внешнему миру» — это суть инкапсуляции и ООП. В качестве быстрого примера, могу привести пример с объектом, который получает при конструировании уникальный номер. Этот номер нельзя никак задать с помощью публичного API. При восстановлении объекта из Memento есть доступ к внутренним полям и эта операция пройдет абсолютно честно и просто.

Реализация

Классическая реализация говорит о следующих особенностях реализации шаблона:

  • Необходимо создать класс-хранитель «мгновенных снимков» целевого класса
  • Целевой класс должен уметь сохранять и принимать свои «мгновенные снимки»

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

memento

Подробнее

АОП и шаблоны проектирования GoF

Давно меня занимает тема аспектно-ориентированного программирования в виду моей исключительной профессиональной лени. Мне не нравится писать тупой и повторяющийся код. Однако это словно родовое проклятье, когда дело касается разных инфраструктурных вещей при написании кода. Начиная с банального и уже набившего оскомину при упоминании АОП – логировния и заканчивая кэшировнием и реализацией особенного процесса по перехвату исключений. Аспекты могут быть применены к гораздо большему спектру задач. К неочевидному на первый взгляд спектру задач, о котором большинство даже не задумывается. Например, шаблоны проектирования «банды четырех».

Конкретная реализация с помощью аспектов сильно зависит от АОП фреймворка. Например, к какому типу он относится: прокси или внедрения в код. Я свой выбор остановил на PostSharp, с которым знаком с версии 1.2 или 1.3, мне кажется было что-то около этого. И то, что было тогда и есть сейчас — значительно отличается по функционалу и простоте использования. Не в малой степени благодаря эволюции самого языка C#.

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

Подробнее