GRASP: краткий обзор
Проектирование ПО начинается с определения архитектуры высокого уровня (HLA - High Level Architecture). В HLA надо определить объекты или процессы, для чего создаём приложение. Существуют подходы:
- Функциональный (структурный)
- Объектно‑ориентированный
- Включает принципы GRASP
- Может быть реализован с помощью DDD
Функциональный подход
В функциональном подходе выделяют компоненты системы, их функции и способы взаимодействия, без привязки к объектам.
Пример:
- Выделяем модули для управления товарами (добавление, удаление), обработки заказов (создание, обработка оплаты). Модуль управления товарами может вызывать функции модуля обработки для оформления заказа.
Объектно-ориентированный подход
ОО основан на мо делировании системы в виде взаимосвязанных объектов, у которых есть свойства и поведение, а также учитывает принципы объектно-ориентированного программирования.
- Класс — шаблон, который определяет структуру и поведение объектов. Содержит атрибуты (данные) и методы (функции).
- Объект — конкретный экземпляр класса, содержащий значения атрибутов и способный выполнять определённые методы.
Пример:
- Рассматриваем систему как набор объектов (Задача, Пользователь), каждый из которых имеет свои свойства и методы, и взаимодействует через них.
GRASP
GRASP (General Responsibility Assignment Software Patterns) — набор рекомендаций и принципов проектирования ПО для определения архитектуры и отношений между объектами.
- Сфокусирован не на решении прикладных задач, а на распределении какому объекту назначить то или иное поведение.
- GRASP может рассматриваться в рамках объектно-ориентированного проектирования, помогает в реализации его принципов.
- Применяется в веб-разработке и мобильной разработке, автоматизации процессов и т. д.
- Может использоваться в сочетании с различными типами паттернов проектирования. Например, чтобы определить, какие объекты будут создавать методы / определить роли классов в компонентах.
Зачем GRASP аналитику?
- Помогает разрабатывать четкие и понятные структуры системы.
- Определять обязанности каждого объекта и устанавливать связи между ними.
Паттерны GRASP
Используются для:
- Создания объектов.
- Определения ответственностей классов.
- Управления связями между объектами и др.
Сначала определяют бизнес-правила и требования к системе. Затем выбираются подходящие паттерны для реализации этих требований. Ка ждый паттерн решает конкретную проблему проектирования и имеет свои рекомендации по применению.
Популярные принципы GRASP
-
Controller (Контроллер): координирует работу между объектами и обрабатывает внешние запросы. Объект, который принимает пользовательский ввод, делегирует его другим объектам для выполнения операций.
- Пример: контроллер веб-приложения обрабатывает запросы от клиентов и вызывает методы для выполнения бизнес-логики.
-
Creator (Создатель): отвечает за создание экземпляров других классов.
- Пример: если есть класс Order, который создает экземпляры Item, то метод создания объекта Item должен быть внутри класса Order.
-
Expert (Эксперт): объект, больше всех знает, как выполнить определенную операцию, должен быть ответственным за её выполнение.
- Пример: класс управления заказами может быть экспертом по созданию и обработке заказов.
-
High Cohesion (Высокая связность): класс выполняет только одну задачу или ответственность. Каждый класс должен быть организован вокруг единой цели.
- Пример: класс EmailSender должен заниматься только отправкой электронных писем, а класс PaymentProcessor - только обработкой платежей.
-
Low Coupling (Низкая связность): классы должны быть слабо связаны друг с другом. Изменения в одном классе не должны приводить к изменениям в другом классе.
- Пример: если меняется способ оплаты в классе PaymentProcessor, класс Order и Customer не должны быть затронуты.
-
Pure Fabrication (Чистая фабрикация): используется для создания объектов, которые не имеют аналога в предметной области, но служат для снижения связанности и увеличения гибкости системы.
- Пример: класс Logger для записи логов, не является объектом из реального мира, но играет важную роль в системе для логирования.