
Reg.ru: домены и хостинг
Крупнейший регистратор и хостинг-провайдер в России.
Более 2 миллионов доменных имен на обслуживании.
Продвижение, почта для домена, решения для бизнеса.
Более 700 тыс. клиентов по всему миру уже сделали свой выбор.

Бесплатный Курс "Практика HTML5 и CSS3"
Освойте бесплатно пошаговый видеокурс
по основам адаптивной верстки
на HTML5 и CSS3 с полного нуля.

Фреймворк Bootstrap: быстрая адаптивная вёрстка
Пошаговый видеокурс по основам адаптивной верстки в фреймворке Bootstrap.
Научитесь верстать просто, быстро и качественно, используя мощный и практичный инструмент.
Верстайте на заказ и получайте деньги.
*Наведите курсор мыши для приостановки прокрутки.
Шаблон проектирования «Фасад»
Когда дело доходит до шаблонов проектирования, то у вас может возникнуть вопрос, вроде:
"Зачем нам вообще использовать шаблоны проектирования в программировании? Наш код и так работает вполне себе хорошо."
Отвечу вам вопросом на вопрос: "Где бы вы предпочли жить: в удобном, грамотно спланированном доме или в простенькой комнате, где нет ничего кроме стен и потолка?" В конце концов, и то, и другое подходит для того, чтобы укрыться от непогоды.
Конечно, каждому будет приятнее жить в продуманном и удобном доме, который предоставляет нам лучшие условия для жизни, требует меньше ресурсов для обслуживания и позволяет избежать постоянной беготни, вроде: "А нужно бы еще вот это, и еще вон то, и еще вот это сверху..." Просто потому, что все необходимое уже предусмотрено заранее.
Подобный подход применим и к программированию: код, использующий шаблоны проектирования, легко читается, прост в обслуживании и расширении.
В этой серии статей мы рассмотрим различные шаблоны проектирования, доступные нам в мире программирования. Вы узнаете об их плюсах и минусах, а также о факторах, говорящих в пользу использования того или иного шаблона.
В процессе работы я буду демонстрировать все шаблоны на примере языка PHP, однако, на самом деле, это просто концепции, которые могут быть применены к любому языку программирования - вопрос лишь в смене синтаксиса для того или иного языка.
Все шаблоны проектирования можно разделить на 4 группы:
- шаблоны создания;
- структурные шаблоны;
- поведенческие шаблоны;
- шаблоны параллелизма.
В сегодняшней статье мы поговорим о шаблоне проектирования "Фасад".
Он относится к группе структурных шаблонов т.к. связан с тем, как должен быть структурирован ваш код для того, чтобы оставаться максимально понятным и удобным в обслуживании в длительной перспективе.
Шаблон проектирования "Фасад"
UML

Проблема
Предположим, что у нас есть несколько операций, которые должны быть последовательно выполнены, и что одно и то же действие требуется выполнить в разных частях вашего приложения.
Вам придется вставлять один и тот же код снова и снова в разных местах. Ок, вы сделали это, однако через несколько дней обнаружили, что кое-что в этом коде требует доработки.
Есть проблема? Нам придется вносить изменения в код во всех местах, где вы его ранее разместили. Неудобно, долго и можно забыть все места, где требуется внести изменения? Абсолютно точно.
Решение
В качестве решения нам нужно создать главный контроллер, который обрабатывает весь повторяющийся код. Мы будем вызывать его с разными параметрами и именно от них будет зависеть результат на выходе.
Теперь, если нам нужно внести какие-то изменения в процесс, то всё, что нам нужно править - это главный контроллер, вместо того, чтобы выискивать все кусочки кода в разных местах приложения.
Пример
Рассмотрим на чем-нибудь жизненном для понимания общей концепции. Скажем, у вас есть задание спланировать свадьбу лучшего друга.
Если вы будете делать все сами, то только представьте себе, сколько всего вам нужно держать в фокусе внимания, сколько вещей охватить!
Все это создаст высокую вероятность ошибки и повысит шансы того, что вы сделаете нечто, что сильно испортит вашему другу это радостное событие.
В этом случае, вместо того, чтобы все делать самому, вам нужно использовать свадебный планировщик и убедиться в том, что все процессы протекают в правильно организованной манере и соблюдается нужный порядок действий, что значительно снижает вероятность ошибки.
Таким образом, вы ведете себя как "клиент", инициирующий процесс, а свадебный планировщик работает для вас как "Фасад", выполняя работу, исходя из заданного вами направления.
Пример кода
Сейчас давайте рассмотрим пример, который куда ближе к программистской реальности. Посмотрим на то, как можно применить шаблон "Фасад" во время такого процесса, как выписка счета в интернет-магазине.
Но перед тем, как мы посмотрим на пример хорошего кода, давайте посмотрим на код, который не лишен проблем.
Простой процесс оформления заказа выглядит примерно так:
1. Добавление товара в корзину
2. Подсчет стоимости доставки
3. Подсчет скидки
4. Создание счета на оплату.
Проблема
// Простой процесс оформления заказа $productID = $_GET['productId']; $qtyCheck = new productQty(); if($qtyCheck->checkQty($productID) > 0) { // Добавление товара в корзину $addToCart = new addToCart($productID); // Подсчет стоимости доставки $shipping = new shippingCharge(); $shipping->updateCharge(); // Подсчет скидки $discount = new discount(); $discount->applyDiscount(); // Создание счета на оплату $order = new order(); $order->generateOrder(); }
В коде выше вы можете видеть, что процесс формирования заказа включает в себя создание ряда объектов, необходимых для полноценной работы всего механизма.
Представьте, что вам нужно реализовать этот механизм сразу в нескольких местах. Если это так, то проблема возникнет в том случае, когда вам понадобится что-то изменить. Итак, давайте посмотрим на решение.
Решение
Напишем то же самое с использованием шаблона "Фасад", получив на выходе более удобный в поддержке и расширении код.
class productOrderFacade { public $productID = ''; public function __construct($pID) { $this->productID = $pID; } public function generateOrder() { if($this->qtyCheck()) { // Добавление товара в корзину $this->addToCart(); // Подсчет стоимости доставки $this->calulateShipping(); // Подсчет скидки $this->applyDiscount(); // Создание счета на оплату $this->placeOrder(); } } private function addToCart () { /* .. Добавление товара в корзину .. */ } private function qtyCheck() { $qty = 'Получаем кол-во товара из базы данных'; if($qty > 0) { return true; } else { return true; } } private function calulateShipping() { $shipping = new shippingCharge(); $shipping->calculateCharge(); } private function applyDiscount() { $discount = new discount(); $discount->applyDiscount(); } private function placeOrder() { $order = new order(); $order->generateOrder(); } }
Итак, наш код с использованием шаблона проектирования "Фасад" готов. И теперь посмотрите на тот объем кода, который потребуется для того, чтобы мы могли использовать механизм создания заказа в нескольких местах.
// Примечание: Так делать не нужно во избежание SQL-инъекций. // Проверяйте переменную перед передачей ее в запрос к базе. $productID = $_GET['productId']; // Всего 2 строчки кода в тех местах, где вам необходим механизм // создания заказа вместо кучи кода из первого примера $order = new productOrderFacade($productID); $order->generateOrder();
Теперь представьте, что вам нужно внести изменения в процесс формирования заказа. Все, что вам нужно - это однократно внести изменения в класс productOrderFacade вместо того, чтобы править код во всех местах, где мы его использовали.
Вывод
Шаблон проектирования "Фасад" следует использовать для создания единого интерфейса для обслуживания одинаковых процедур в разных частях нашего приложения.
Можно также сказать, что он обеспечивает так называемую инкапсуляцию, т.е. скрытие сложности системы путем сведения всех возможных вызовов к одному объекту, делегирующему их соответствующим объектам системы.
Следующий материал из этой серии вы можете прочитать здесь.
Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!
Смотрите также: