Шаблони проектування в PHP
Патерни проектування - це способи мислення про програмування.
Вони є збіркою порад, готових практик, передового досвіду та інсайтів щодо розвитку. Для кожної парадигми програмування та типу завдань існують певні шаблони проектування, які найкраще підходять.
Переваги - навіщо використовувати патерни проектування?
У програмуванні розв'язання певних типів задач повторюється, тому є сенс вибрати один метод розв'язання цих задач і постійно повторювати його.
Oсновна перевага виникає особливо під час командної розробки, коли всі знають, як буде розроблятися додаток (за яким шаблоном проектування) і просто застосовують його. Це позбавляє від зайвих десятків годин налагодження незрозуміло написаного коду і спроб зрозуміти принципи, які мав на увазі автор.
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** - Принцип поділу додатку на "Модель" (логіка і дані додатку), "Подання" (шаблон і представлення даних) і "Контролер" (зв'язування "Моделі" і "Подання").
- Ін'єкція залежностей - замість створення екземплярів класів ми визначаємо так звані сервіси, які ми автоматично ін'єктуємо. Код допускає всі залежності, окремі частини можна міняти місцями, і ми будуємо додаток динамічно.
- Oдиночний (Singleton) - кожен клас має тільки один екземпляр (особисто я використовую це в поєднанні з "ін'єкцією залежностей", де кожен сервіс має тільки один екземпляр, який передається по всьому додатку).
- Лінива ініціалізація (Delayed Initialization)** - ми створюємо екземпляр об'єкту тоді, коли це потрібно в першу чергу.
- Aдаптер** - Якщо нам потрібно забезпечити зв'язок між двома несумісними класами, то
Adapterперетворює дані з одного типу в інший (як правило, перетворює нативні типи даних PHP в типи даних бази даних і назад). - Команда - замість того, щоб безпосередньо виконати певне завдання (наприклад, відправити електронного листа), ми просто згадуємо, що це мало відбутися. Потім інший або той самий процес підхопить запит і обробить його. Oсновна перевага полягає в тому, що ми можемо обробляти заявку ліниво (і тому дуже швидко), повторювати невдалі дії і просто зберігати параметри дзвінка. Водночас, це дозволить нам отримувати запити від різних клієнтів, через API тощо. Надіслані дії також можуть бути поставлені в чергу, визначені пріоритети та, можливо, скасовані до оцінки.
- Стратегія - інкапсулює якісь алгоритми або об'єкти, які потрібно змінити так, щоб вони були взаємозамінні для клієнта.
Існує набагато більше шаблонів дизайну, це були найважливіші, про які вам варто знати.
Aнти-шаблон
Деякі методи розробки програм вважаються "антипаттернами", що є повною протилежністю паттерну проектування. Зазвичай це техніка, яка виробляє дивний код, що не піддається налагодженню, підтримці та поводиться "магічно".
Типовим прикладом є використання глобальних змінних.