Вам нужен шаблон Команда




Использование шаблонов проектирования

 

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

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

Переизданная статья

Каждые несколько недель мы перечитываем наши самые любимые посты на протяжении всей истории сайта. Этот материал был впервые опубликован в октябре 2012.

 

В этой статье рассмотрены некоторые шаблоны проектирования, описанные в книгах Роберта Мартина. Эти шаблоны являются современной интерпретацией оригинальных шаблонов их книги Банда Четырех. Шаблоны Мартина лучше работают вместе с современными техниками программирования. В действительности же примерно 15% оригинальных шаблонов было заменено на новые, а оставшиеся - немного обновлены.

Начнем с создания нескольких объектов

Использование шаблона Фабрика

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

Когда Шаблон Фабрику следует использовать тогда, когда вы начинаете писать код, цель которого - получить необходимую для создания объектов информацию.

Зачем Фабрики позволяют поместить логику создания объектов в одно место. Они помогают разорвать зависимости для создания меньшей связанности, а так же использовать инъекцию зависимостей для более удобного тестирования.

Поиск необходимых данных

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

Шаблон Шлюз

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

Когда: Когда нужно получить или сохранить данные.

Зачем: Шлюз предлагает простой публичный интерфейс для сложных операций хранения данных. Так же он инкапсулирует знания об уровне хранения данных и разъединяет бизнес логику от логики уровня хранения.

 

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

Идем через прокси

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

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

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

 

Прокси эффективно реализует схожий интерфейс с реальным объектов, которого он имитирует. Бизнес логика просто использует его так, как будто это и есть реальный объект, но в действительности прокси создает объект, если такого не существует.

Шаблоны активного объекта также сыграли свою роль в в ранних многозадачных систем.

Хорошо, хорошо. Это конечно все здорово, но как мы сможем найти объекты, которые нам нужно будет создать?

Спросим у репозитория

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

Шаблон репозиторий отличается от других шаблонов. Он является частью Проектирования по модели (DDD), и не включен в книгу Роберта Мартина.

Когда: Нужно создать несколько объектов на основе определенных критериев или когда нужно сохранить несколько объектов в слое хранения данных.

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

 

Но что будет, если репозиторий не сможет найти необходимые объекты? Одним вариантом может быть - вернуть NULL, но такой подход имеет два побочных эффекта:

  • Это приводит к отказу от наследования, когда вы попытаетесь вызвать метод у этого объекта.
  • И потребует от вас использовать огромное кол-во проверок типа if(is_null($param)) return;

Лучше вернуть null объект.

Шаблон нулевого объекта

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

Когда: Вы постоянно проверяете объекты на null.

Зачем: этот шаблон добавит прозрачности и ясности в ваш код и заставит вас обратить больше внимания на поведение ваших объектов.

 

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

Вам нужен шаблон Команда

Когда: Нужно выполнить много операций, чтобы подготовить объект к использованию.

Зачем: Чтобы переместить сложные операции из логики обработки, в логику создания.

 

Звучит заманчиво, не так ли? В действительности же, этот шаблон может оказаться весьма полезным во многих ситуаций. Шаблон команда широко используется для реализации транзакций. Если добавить простой метод undo() в шаблон команду, то он сможет выполнить все транзакции, необходимые для отмены произведенных действий, если необходимо.

Итак, сейчас у вас 10 или более объектов команд, и вам нужно чтобы они выполнялись конкурентно. Можно поместить их в активный объект.

Активный Объект

Простой и интересный активный объект имеет только одну обязанность: хранить список объектов команд и запускать их.

Когда: Несколько простых объектов необходимо выполнить в одной команде.

Зачем: этот шаблон заставляет клиентов выполнять одну единственную задачу и обрабатывать несколько объектов за раз.

 

Активный объект удаляет каждую команду из своего списка после ее выполнения; это означает, что вы можете выполнить только одну команду за раз. Вот несколько реальных примеров использования активного объекта:

Шаблоны проектирования используются для решения проблем.

  • Shopping Cart - выполняя команду buy() над каждым продуктом, удаляем его из корзины
  • Финансовые транзакции - группировка транзакций в общий список и выполнение их в простом вызове, убирают их из очереди.

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

Повторное использование

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



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2021-11-26 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: