Ну привіт!
Настав і мій час завести книжку статтю про патерни проектування. Зачєм? Бо треба щоб самому структурувати те що я вже давно знаю і використовую, але в назвах, що називається, плаваю. Та і загалом, треба жити інтєрєсно: читати книжки, бути шпіоном, дресірувать любіму обізяну і ходить в оперу з красівими тьолками, получать удовольствіє.
Це буде розділ в рамках мого блогу, де можна прочитати все що я писав на цю тему, а в цьому дописі можна прочитати загальну інформацію про те що таке патерни, які вони бувають, та яка від них користь.
Патерни чи шаблони?
Мені не подобається як слово pattern переклали українською. Я обидва слова розумію по різному, і мені ближче слово pattern.
Pattern - reusable solution. Шаблон - зразок, взятий для наслідування.
Що таке патерн
Патерни програмування, як я написав вище, це підхід до вирішення тієї чи іншої задачі в програмуванні в типовий спосіб. Давайте ще раз: патерн має описувати підхід до вирішення, він не описує саме рішення.
Пара прикладів не повʼязаних з програмуванням
Ось наприклад, ви чистите цибулю. Все життя ви розрізаєте цибулину навпіл і знімаєте шари з кожної половини. Це патерн. Кожна почищена цибулина це реалізація патерна.
Або інший приклад: ви з другом сидите в барі. Ваш друг бачить гарного мужчину за барною стійкою, і ви розказуєте другу що зробити для того, щоб той гарний мужчіна наступного ранку пив каву вдома у друга. Оце все що ви розказали це патерн. Якщо воно ще й спрацює, це корисний патерн. Реалізація вашого плану другом - це реалізація патерна. (Я хотів без сексізму)
Якщо серйозно, мені більше подобається перекладати pattern як “мотив” (той що в музиці або в мистецтві або моді). Мотиви програмування, звучить? 😅
А що не є патерном
Патерн ≠ код. Патерн – це ідея, яка живе поза кодом. Інакше кажучи: патерн можна розповісти на папері без жодного рядка коду, і розробник зрозуміє що робити.
Які патерни бувають
Прийнято розділяти патерни на три групи: породжуючі, структурні, поведінкові.
Породжуючі
Беруть на себе забовʼязання щодо створення нових обʼєктів в коді.
Породжуючі патерни контролюють народження об’єктів. Без них: new User(), new User(), new User() по всьому коду - хаос. З ними: одне місце знає як створювати користувачів, решта коду просто просить “дай мені користувача”.
- Singleton
- Factory Method
- Abstract Factory
- Builder
- Object Pool
- Lazy Initialization
Структурні
Беруть відповідальність за взаємодію між обʼєктами. Обʼєкти типу А можуть повертати обʼєкти типу Б, і оця вся мішанина якраз тут. Уявіть як ви хочете описати дитину вашої племіниці (ви → брат/сестра → племінниця → її дитина). Структурні патерни описують саме такі ієрархії та відносини між об’єктами.
- Адаптер
- Bridge
- Composite
- Decorator
- Facade
- Flyweight
- Private Class Data
- Module
Поведінкові
Відповідають за комунікацію та розподіл обов’язків між об’єктами. Описують, як об’єкти взаємодіють і передають повідомлення один одному. Знову до сімʼї: будильник дзвенить → батько прокидається → будить маму → мама будить дітей → діти йдуть снідати. Кожен реагує на дію попереднього.
- Chain of Responsibility
- Command
- Iterator
- Mediator
- Memento
- Observer
- State
- Стратегія
- Template Method
- Visitor
- Interpreter
- Null Object
- Specification