Патерни проєктування

Патерни проєктування

  • 2 серпня, 2023
  • читати 10 хв
Денис Розганяєв
Денис Розганяєв Software Engineer у Mobilunity, Викладач Комп'ютерної школи Hillel.

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

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

Що таке патерни?

В інтернеті та книжках можна знайти дуже багато різних визначень. Є легкі варіанти визначень, а є і більш академічні визначення.

Для мене найкомфортнішим визначенням є наступне:

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

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

Також варто розуміти, що патерн — це не алгоритм. Ці поняття часто плутають, хоча вони дійсно обидва описують рішення відомих проблем, але алгоритм — це чіткий набір дій, в той час як патерн — це високорівневий опис рішення, реалізація якого може відрізнятися у двох різних програмах.

Рекомендуємо публікацію по темі

Навіщо знати патерни?

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

Саме свідоме володіння інструментом відрізняє професіонала від аматора. Ви можете вкрутити саморіз за допомогою дрилі, а можете й забити його молотком. Але професіонал знає, що якщо закрутити дрилем, то тримати буде краще.

Отже, навіщо знання патернів? Я б виділив 3 основних пункти:

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

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

  • Загальний словник програмістів — достатньо вимовити назву патерну, замість того, щоб пояснювати іншим розробникам про круте рішення, яке ви знайшли.

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

Патернів проєктування досить велика кількість, вони можуть відрізнятися за рівнем складності, деталізацією та охопленням системи, що проєктується.

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

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

Також патерни відрізняються і за призначеннями (категоріями):

  • Породжуючі патерни відповідають за гнучке створення об’єктів без внесення в програму зайвих залежностей.

  • Структурні патерни показують різні способи побудови зв’язків між об’єктами.

  • Поведінкові патерни дозволяють налагодити ефективну комунікацію між об’єктами.

Які патерни використовуються в фреймворках?

Фреймворки використовують велику кількість патернів як для внутрішнього (core) функціоналу, так і для зовнішнього використання, надаючи розробниками певний інтерфейс для побудови додатків. Які ж патерни використовують фреймворки? Оскільки я працюю з Laravel фреймворком, наведу приклади саме з нього.

З коробки Laravel дає можливість використовувати функціонал, який вже є частиною патернів:

  • Facade класи для швидкого доступу до певного функціоналу
  • Builder, який активно використовується в моделях, роутерах і інших компонентах
  • Observer, фреймворк, який дає можливість створювати свої івенти і, наприклад, стежити за подіями моделей. Навіть створюючи middleware, ми використовуємо патерн Proxy.

Це далеко не всі патерни, котрі можна побачити в фреймворку. Всі описані патерни є частиною функціоналу фреймворку, який надається розробникам для створення додатків.

Під капотом Laravel використовує більше патернів.

Висновок

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

Для більш детального ознайомлення з цією темою я б порадив прочитати книгу «Gangs of Four (GoF) Design Patterns». В книжці дуже детально розказується про патерни, оскільки автори і придумали більшість з них. Якщо книжка з академічними термінами складно вам дається, то найкращим варіантом буде мій улюблений сервіс RefactoringGuru. Це чудовий сайт, де ви можете знайти все про патерни та рефакторинг.

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

Рекомендуємо публікацію по темі