Перейти до основного вмісту

GRASP

· 4 хв. читання
Petro Ostapuk

GRASP (General Responsibility Assignment Software Patterns) - шаблони проектування, які використовують для вирішення загальних завдань із призначення обов'язків класам і об'єктам.

Відомо дев'ять GRASP шаблонів, спочатку описаних у книжці Крейга Лармана "Застосування UML і шаблонів проєктування". На відміну від звичних читачеві патернів із Банди Чотирьох, GRASP патерни не мають вираженої структури, чіткої сфери застосування і конкретної розв'язуваної проблеми, а лише є узагальненими підходами/рекомендаціями/принципами, які використовують під час проєктування дизайну системи.

Розглянемо характеристики основних GRASP шаблонів.

Творець (Creator)

Шаблон Creator говорить нам, яких умов треба дотриматися, щоб об'єкти правильно породжували один одного. Для цього є кілька правил.

Об'єкт А має породжувати об'єкт Б, якщо:

  • об'єкт А містить або агрегує об'єкти Б (містить у собі як властивість або колекцію)
  • об'єкт А активно використовує об'єкти Б (основний обсяг роботи з об'єктом Б відбувається за допомогою об'єкта А)
  • об'єкт А володіє даними ініціалізації об'єкта Б (щоразу при створенні об'єкта Б, дані беруться з об'єкта А)

Інформаційний експерт (Information Expert)

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

Низька зв'язаність (Low Coupling)

Низька зв'язаність відповідає за те, щоб об'єкти в системі знали один про одного якомога менше. Адже що менше об'єкт знає про інші об'єкти, то більше буде ізольовано і то менше правок необхідно буде робити, якщо в системі щось зміниться. У складних системах зв'язків буває набагато більше, і шаблон Low Coupling дає змогу уникнути таких проблем:

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

Високе зачеплення (High Cohesion)

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

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

Стійкий до змін (Protected Variations)

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

Контролер (Controller)

Ну тут усе просто. Це не що інше, як C з абревіатури MVC :) Цей шаблон відповідає за те, до кого саме мають звертатися виклики з V (View), і кому C має делегувати запити на виконання (яка модель M має їх обробити)

Поліморфізм (Polymorphism)

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

Чиста вигадка (Pure Fabrication)

Існує поняття моделі програмування за предметною галуззю, згідно з якою, кожній сутності з предметної галузі відповідає один або більше класів в додатку. При цьому, обов'язки взаємодії сутностей, як правило, накладаються на них самих. Такий підхід має очевидний недолік - висока зв'язність модулів системи. Шаблон чиста вигадка дає змогу розв'язати цю проблему шляхом введення в програмне середовище додаткового класу (що не показує реальної сутності з предметної області) і наділення його необхідними обов'язками.

Наприклад, обов'язки зі збереження Entity через EntityRepository.

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

Перенаправлення (Indirection)

Шаблон перенаправлення реалізує низьку зв'язність між класами, шляхом призначення обов'язків щодо їхньої взаємодії додатковому об'єкту - посереднику.

Прикладом цього шаблону може слугувати клас EntityRepository (див. Чиста вигадка), який є проміжним шаром між сутностями Entity і сховищем, у якому вони будуть збережені. Крім того, контролер із тріади MVC є посередником між даними та їхнім представленням.