PHP Manual

Шаблони проектування в PHP

13. 02. 2020

Патерни проектування - це способи мислення про програмування.

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

Переваги - навіщо використовувати патерни проектування?

У програмуванні розв'язання певних типів задач повторюється, тому є сенс вибрати один метод розв'язання цих задач і постійно повторювати його.

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

MVC - приклад використання паттерну проектування

Мій улюблений патерн проектування - MVC (від англ. Model View Controller), який говорить, що додаток ділиться на 3 незалежні шари, які послідовно викликають один одного і передають один одному дані.

Наприклад, при рендерингу сторінки може виглядати так, що вона спочатку вирішує, який це тип сторінки (наприклад, деталізація категорії), тому викликає CategoryController з методом detail.

Конкретний приклад (я дуже спрощую):

class CategoryController
{
public CategoryManager $categoryManager;
public function actionDetail(string $id): void
{
$this->template->id = $id;
$this->template->category = $this->categoryManager->getById($id);
}
}

Примітка: Примітка:.

Це лише приклад коду, який пояснює принцип роботи шаблону проектування MVC.

У реальній реалізації довелося б додатково розібратися, як, наприклад, отримати екземпляр CategoryManager і як передати його у власність. Як правило, для цього типу завдань використовується "ін'єкція залежності".

Перед рендерингом сторінки для реквізиту категорії спочатку викликається CategoryController для отримання власне запиту (тобто ми рендеримо реквізит категорії з певним ID, який отримується маршрутизатором, наприклад, в URL), отримання даних (запитом до відповідної Model) і передачі фінальних даних шаблону для рендерингу.

Величезною перевагою цього принципу є те, що ми можемо писати багато моделей (логіка програми), які не залежать від способу представлення даних (шаблону), що призводить до багаторазового використання коду. Фактично, якщо ми хочемо використати CategoryManager в іншому проекті, ми просто передаємо дані через Controller певним чином, які будуть відображені за шаблоном, визначеним самим проектом, при цьому логіка додатку залишається незмінною і нікого не хвилює, тому що програмний рівень виконав свій узгоджений інтерфейс та обов'язки.

Практична порада:.

Паттерн проектування "MVC" використовується більшістю сучасних фреймворків, таких як Nette, Symfony, Laravel та інших.

Ми також можемо зіткнутися з "MVC" при розробці мобільних додатків та інших типів програмного забезпечення, де нам потрібно отримати дані та відобразити їх у шаблоні відповідно до типу сторінки або подання.

Важливі шаблони дизайну для веб-розробки

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

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

  • MVC** - Принцип поділу додатку на "Модель" (логіка і дані додатку), "Подання" (шаблон і представлення даних) і "Контролер" (зв'язування "Моделі" і "Подання").
  • Ін'єкція залежностей - замість створення екземплярів класів ми визначаємо так звані сервіси, які ми автоматично ін'єктуємо. Код допускає всі залежності, окремі частини можна міняти місцями, і ми будуємо додаток динамічно.
  • Одиночний (Singleton) - кожен клас має тільки один екземпляр (особисто я використовую це в поєднанні з "ін'єкцією залежностей", де кожен сервіс має тільки один екземпляр, який передається по всьому додатку).
  • Лінива ініціалізація (Delayed Initialization)** - ми створюємо екземпляр об'єкту тоді, коли це потрібно в першу чергу.
  • Адаптер** - Якщо нам потрібно забезпечити зв'язок між двома несумісними класами, то Adapter перетворює дані з одного типу в інший (як правило, перетворює нативні типи даних PHP в типи даних бази даних і назад).
  • Команда - замість того, щоб безпосередньо виконати певне завдання (наприклад, відправити електронного листа), ми просто згадуємо, що це мало відбутися. Потім інший або той самий процес підхопить запит і обробить його. Основна перевага полягає в тому, що ми можемо обробляти заявку ліниво (і тому дуже швидко), повторювати невдалі дії і просто зберігати параметри дзвінка. Водночас, це дозволить нам отримувати запити від різних клієнтів, через API тощо. Надіслані дії також можуть бути поставлені в чергу, визначені пріоритети та, можливо, скасовані до оцінки.
  • Стратегія - інкапсулює якісь алгоритми або об'єкти, які потрібно змінити так, щоб вони були взаємозамінні для клієнта.

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

Анти-шаблон

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

Типовим прикладом є використання глобальних змінних.

Jan Barášek   Více o autorovi

Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.

Rád vám pomůžu:

Související články

1.
4.
Status:
All systems normal.
2024