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 для записи логов, не является объектом из реального мира, но играет важную роль в системе для логирования.
Подборка материалов по GRASP
- ООП для ООП: GRASP
- GRASP паттерны проектирования
- GRASP принципы
- О GRASP
- Проектирование объектно-ориентированного приложения
- Анемичная и «Богатая» модель в контексте GRASP шаблонов
- G.R.A.S.P | шаблоны проектирования
- Принципы хорошей архитектуры
- Базовые шаблоны проектирования
- Объектно-ориентированное проектирование
- Шпаргалка по шаблонам проектирования
- Лекция про ООПроектирование
- Объектно-ориентированный дизайн и как его использовать для проектирования систем (про интерфейсы)
- Объектно-ориентированный подход при проектировании цифрового офиса сотрудника
- История объектно-ориентированного проектирование. Возникновение DDD
- Объектно-ориентированный анализ BABOK
- Способы отображения: существует ли связь между DDD и ООП
- Применение ООП при проектировании ER-диаграмм
- Шаблоны проектирования "банды четырёх (GoF)"
Видео
- Введение в GRASP-шаблоны, Low Coupling, High Cohesion
- Шаблоны GRASP. Лекция
- Цикл коротких видео: GRASP Design Patterns
- Шаблоны GRASP // Демо-занятие курса «Архитектура и шаблоны
- Объектно-ориентированное проектирование, как проектируются классы
- Декомпозиция, объектно-ориентированное проектирование
Книги
- UML 2 и Унифицированный процесс, практический объектно-ориентированный анализ и проектирование - Арлоу Джим, Нейштадт Айла
- Погружение в Паттерны Проектирования - Александр Швец
- Объектно-ориентированное мышление - Мэтт Вайсфельд
- Приемы объектно-ориентированного проектирования. Паттерны проектирования. Хелм Ричард, Влиссидес Джон
- Объектно-ориентированный анализ и проектирование с примерами приложений - Грэди Буч
- Методы объектно-ориентированного анализа и программирования в управлении экономическими системами - Д. Е. Толмачев, А. А. Тарасьев, В. Ф. Турыгина