Статті

Що таке шаблони проектування: навіщо їх використовувати, класифікація, плюси і мінуси

У розробці програмного забезпечення шаблони проектування є оптимальними рішеннями проблем, які зазвичай виникають у розробці програмного забезпечення.

Вони як попередні проектиdefiкінцеві перевірені інструменти, які можна налаштувати для вирішення повторюваних проблем проектування у вашому коді.

Приблизний час читання: 6 хвилин

Що таке шаблон проектування

Патерн проектування — це не код, який ми можемо скопіювати та вставити в нашу програму, як це можна зробити зі стандартними функціями чи бібліотеками. Шаблон проектування - це загальна концепція, здатна вирішити певну проблему. В основному це модель, деталі якої ми можемо слідувати та реалізувати рішення, яке відповідає реальності нашої програми.

Моделі часто плутають з алгоритмами, оскільки обидві концепції описують типові рішення деяких відомих проблем. Поки алгоритм defiЯкщо завжди є чіткий набір дій, які можуть досягти певної мети, модель є описом рішення вищого рівня. Код однієї моделі, застосований до двох різних програм, може відрізнятися.

Бажаючи провести аналогію, можна згадати рецепт приготування: в обох є чіткі кроки для досягнення мети. Однак модель більше схожа на проект, результат і характеристики якого можна побачити, але точний порядок реалізації залежить від нас, хто пише код.

З чого складається шаблон дизайну?

Більшість шаблонів описуються дуже формально, щоб люди могли відтворювати їх у багатьох контекстах. Нижче розглянемо елементи, які присутні в описі моделі:

  • Намір моделі коротко описує як проблему, так і рішення.
  • Мотивація далі пояснює проблему та рішення, яке дає модель.
  • Структура класів показує кожну частину моделі та те, як вони пов’язані.
  • Приклад коду однією з найпопулярніших мов програмування, що полегшує розуміння ідеї моделі.

Навіщо їх використовувати?

Програміст може розробляти програмне забезпечення, не знаючи про існування шаблонів проектування. Багато так і роблять, і тому самі того не знаючи, реалізують якісь схеми. Але навіщо тоді витрачати час на їх вивчення?

  • Патерни проектування - це набір випробувані рішення до типових проблем у розробці програмного забезпечення. Навіть якщо ви ніколи не стикаєтеся з цими проблемами, знання шаблонів все одно буде корисним, оскільки воно навчить вас вирішувати всілякі проблеми за допомогою принципів об’єктно-орієнтованого проектування.
  • Дизайн моделей defiВони створюють спільну мову, яку ви та ваша команда можете використовувати для більш ефективного спілкування. Ви можете сказати: «О, просто використовуйте Singleton для цього», і всі зрозуміють ідею вашої пропозиції. Немає необхідності пояснювати, що таке синглтон, якщо ви знаєте шаблон і його назву.

Класифікація шаблонів проектування

Патерни проектування відрізняються за складністю, рівнем деталізації та масштабом застосовності в усій розробленій системі.

За аналогією можна зробити перехрестя безпечнішим, встановивши кілька світлофорів або побудувавши цілу багаторівневу розв'язку з підземними переходами для пішоходів.

Найпростішими називають моделі низького рівня ідіоми . Зазвичай вони застосовуються лише до однієї мови програмування.

Найбільш універсальними і високорівневими є моделі архітектурні моделі . Розробники можуть реалізувати ці шаблони практично будь-якою мовою. На відміну від інших шаблонів, їх можна використовувати для розробки архітектури всієї програми.

Крім того, всі моделі можна класифікувати відповідно до їх намагався або мета. Три основні класи:

Інноваційний бюлетень
Не пропустіть найважливіші новини про інновації. Підпишіться, щоб отримувати їх електронною поштою.
  • Креативні моделі вони забезпечують механізми створення об’єктів, які підвищують гнучкість і повторне використання існуючого коду.
  • Структурні моделі вони пояснюють, як збирати об’єкти та класи у більші структури, зберігаючи ці структури гнучкими та ефективними.
  • Поведінкові моделі вони мають справу з ефективним спілкуванням і розподілом обов'язків між об'єктами.

Приклад шаблону дизайну в Laravel: Фасад

фасад це структурний шаблон проектування, який забезпечує спрощений інтерфейс для бібліотеки, фреймворку або будь-якого іншого складного набору класів.

проблема

Припустімо, що нам потрібно змусити програмне забезпечення працювати на основі великого набору об’єктів, які належать до складної бібліотеки чи фреймворку. Зазвичай нам потрібно ініціалізувати всі ці об’єкти, стежити за залежностями, виконувати методи в правильному порядку тощо.

У результаті бізнес-логіка класів буде тісно пов’язана з деталями реалізації сторонніх класів, що ускладнить їх розуміння та керування.

Рішення

Una facade це клас, який забезпечує простий інтерфейс для складної підсистеми, яка містить багато рухомих частин. А facade може надавати обмежену функціональність порівняно з роботою безпосередньо з підсистемою. Однак він містить лише ті функції, які дійсно цікаві клієнтам.

Є один facade це корисно, коли нам потрібно інтегрувати програму зі складною бібліотекою, яка має десятки функцій, але нам потрібна лише невелика частина її функціональності.

Наприклад, програма, яка завантажує короткі веселі відео з котами в соціальні мережі, потенційно може використовувати професійну бібліотеку перетворення відео. Однак все, що нам дійсно потрібно, це клас з єдиним методом encode(filename, format). Створивши такий клас і підключивши його до бібліотеки перетворення відео, у нас буде наш перший facade.

Наприклад, телефоніст кол-центру схожий на a facade. Насправді, коли ми дзвонимо в телефонну службу магазину, щоб зробити замовлення по телефону, оператор є нашим facade на всі служби та відділи магазину. Оператор надає простий голосовий інтерфейс для системи замовлення, платіжних шлюзів і різних служб доставки.

Реальний приклад на PHP

Думай про фасад як простий адаптер для деяких складних підсистем. Facade ізолює складність в межах одного класу та дозволяє іншому коду програми використовувати простий інтерфейс.

У цьому прикладі Facade приховує складність API YouTube і бібліотеки FFmpeg від коду клієнта. Замість того, щоб працювати з десятками класів, клієнт використовує простий метод на Facade.

<?php

namespace RefactoringGuru\Facade\RealWorld;

/**
 * The Facade provides a single method for downloading videos from YouTube. This
 * method hides all the complexity of the PHP network layer, YouTube API and the
 * video conversion library (FFmpeg).
 */
class YouTubeDownloader
{
    protected $youtube;
    protected $ffmpeg;

    /**
     * It is handy when the Facade can manage the lifecycle of the subsystem it
     * uses.
     */
    public function __construct(string $youtubeApiKey)
    {
        $this->youtube = new YouTube($youtubeApiKey);
        $this->ffmpeg = new FFMpeg();
    }

    /**
     * The Facade provides a simple method for downloading video and encoding it
     * to a target format (for the sake of simplicity, the real-world code is
     * commented-out).
     */
    public function downloadVideo(string $url): void
    {
        echo "Fetching video metadata from youtube...\n";
        // $title = $this->youtube->fetchVideo($url)->getTitle();
        echo "Saving video file to a temporary file...\n";
        // $this->youtube->saveAs($url, "video.mpg");

        echo "Processing source video...\n";
        // $video = $this->ffmpeg->open('video.mpg');
        echo "Normalizing and resizing the video to smaller dimensions...\n";
        // $video
        //     ->filters()
        //     ->resize(new FFMpeg\Coordinate\Dimension(320, 240))
        //     ->synchronize();
        echo "Capturing preview image...\n";
        // $video
        //     ->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(10))
        //     ->save($title . 'frame.jpg');
        echo "Saving video in target formats...\n";
        // $video
        //     ->save(new FFMpeg\Format\Video\X264(), $title . '.mp4')
        //     ->save(new FFMpeg\Format\Video\WMV(), $title . '.wmv')
        //     ->save(new FFMpeg\Format\Video\WebM(), $title . '.webm');
        echo "Done!\n";
    }
}

/**
 * The YouTube API subsystem.
 */
class YouTube
{
    public function fetchVideo(): string { /* ... */ }

    public function saveAs(string $path): void { /* ... */ }

    // ...more methods and classes...
}

/**
 * The FFmpeg subsystem (a complex video/audio conversion library).
 */
class FFMpeg
{
    public static function create(): FFMpeg { /* ... */ }

    public function open(string $video): void { /* ... */ }

    // ...more methods and classes... RU: ...дополнительные методы и классы...
}

class FFMpegVideo
{
    public function filters(): self { /* ... */ }

    public function resize(): self { /* ... */ }

    public function synchronize(): self { /* ... */ }

    public function frame(): self { /* ... */ }

    public function save(string $path): self { /* ... */ }

    // ...more methods and classes... RU: ...дополнительные методы и классы...
}


/**
 * The client code does not depend on any subsystem's classes. Any changes
 * inside the subsystem's code won't affect the client code. You will only need
 * to update the Facade.
 */
function clientCode(YouTubeDownloader $facade)
{
    // ...

    $facade->downloadVideo("https://www.youtube.com/watch?v=QH2-TGUlwu4");

    // ...
}

$facade = new YouTubeDownloader("APIKEY-XXXXXXXXX");
clientCode($facade);

Ercole Palmeri

Інноваційний бюлетень
Не пропустіть найважливіші новини про інновації. Підпишіться, щоб отримувати їх електронною поштою.

Останні статті

Veeam пропонує найповнішу підтримку програм-вимагачів, від захисту до реагування та відновлення

Coveware від Veeam продовжить надавати послуги реагування на інциденти кібервимагання. Coveware запропонує криміналістику та можливості відновлення…

Квітень 23 2024

Зелена та цифрова революція: як прогнозне технічне обслуговування трансформує нафтову та газову промисловість

Прогнозне технічне обслуговування революціонізує нафтогазовий сектор завдяки інноваційному та проактивному підходу до управління заводом.…

Квітень 22 2024

Британський антимонопольний регулятор викликає тривогу BigTech через GenAI

CMA Великобританії випустило попередження щодо поведінки Big Tech на ринку штучного інтелекту. Там…

Квітень 18 2024

Casa Green: енергетична революція для сталого майбутнього в Італії

Указ «Case Green», розроблений Європейським Союзом для підвищення енергоефективності будівель, завершив свій законодавчий процес з…

Квітень 18 2024

Читайте Innovation своєю мовою

Інноваційний бюлетень
Не пропустіть найважливіші новини про інновації. Підпишіться, щоб отримувати їх електронною поштою.

Слідуйте за нами