Reg.ru: домены и хостинг

Крупнейший регистратор и хостинг-провайдер в России.

Более 2 миллионов доменных имен на обслуживании.

Продвижение, почта для домена, решения для бизнеса.

Более 700 тыс. клиентов по всему миру уже сделали свой выбор.

Перейти на сайт->

Бесплатный Курс "Практика HTML5 и CSS3"

Освойте бесплатно пошаговый видеокурс

по основам адаптивной верстки

на HTML5 и CSS3 с полного нуля.

Начать->

Фреймворк Bootstrap: быстрая адаптивная вёрстка

Пошаговый видеокурс по основам адаптивной верстки в фреймворке Bootstrap.

Научитесь верстать просто, быстро и качественно, используя мощный и практичный инструмент.

Верстайте на заказ и получайте деньги.

Получить в подарок->

Бесплатный курс "Сайт на WordPress"

Хотите освоить CMS WordPress?

Получите уроки по дизайну и верстке сайта на WordPress.

Научитесь работать с темами и нарезать макет.

Бесплатный видеокурс по рисованию дизайна сайта, его верстке и установке на CMS WordPress!

Получить в подарок->

*Наведите курсор мыши для приостановки прокрутки.


Шаблон проектирования «Фасад»

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

"Зачем нам вообще использовать шаблоны проектирования в программировании? Наш код и так работает вполне себе хорошо."

Отвечу вам вопросом на вопрос: "Где бы вы предпочли жить: в удобном, грамотно спланированном доме или в простенькой комнате, где нет ничего кроме стен и потолка?" В конце концов, и то, и другое подходит для того, чтобы укрыться от непогоды.

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

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

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

В процессе работы я буду демонстрировать все шаблоны на примере языка 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 вместо того, чтобы править код во всех местах, где мы его использовали.

Вывод

Шаблон проектирования "Фасад" следует использовать для создания единого интерфейса для обслуживания одинаковых процедур в разных частях нашего приложения.

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

Следующий материал из этой серии вы можете прочитать здесь.

Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!


Смотрите также:

PHP: Получение информации об объекте или классе, методах, свойствах и наследовании

PHP: Получение информации об объекте или классе, методах, свойствах и наследовании

CodeIgniter: жив или мертв?

CodeIgniter: жив или мертв?

Функции обратного вызова, анонимные функции и механизм замыканий

Функции обратного вызова, анонимные функции и механизм замыканий

Применение функции к каждому элементу массива

Применение функции к каждому элементу массива

Слияние массивов. Преобразование массива в строку

Слияние массивов. Преобразование массива в строку

Деструктор и копирование объектов с помощью метода __clone()

Деструктор и копирование объектов с помощью метода __clone()

Эволюция веб-разработчика или Почему фреймворк - это хорошо?

Эволюция веб-разработчика или Почему фреймворк - это хорошо?

Магические методы в PHP или методы-перехватчики (сеттеры, геттеры и др.)

Магические методы в PHP или методы-перехватчики (сеттеры, геттеры и др.)

PHP: Удаление элементов массива

PHP: Удаление элементов массива

Ключевое слово final (завершенные классы и методы в PHP)

Ключевое слово final (завершенные классы и методы в PHP)

50 классных сервисов, программ и сайтов для веб-разработчиков

50 классных сервисов, программ и сайтов для веб-разработчиков

Наверх