GRASP: различия между версиями
[непроверенная версия] | [непроверенная версия] |
Нет описания правки |
|||
Строка 1: | Строка 1: | ||
'''GRASP''' ({{lang-en|general responsibility assignment software patterns}} — общие шаблоны распределения ответственностей; также существует английское слово ''"grasp" — «контроль, хватка»'') — [[Шаблон проектирования|шаблоны]], используемые в [[Объектно-ориентированное проектирование|объектно-ориентированном проектировании]] для решения общих задач по назначению ответственностей [[Класс (программирование)|классам]] и [[Объект (программирование)|объектам]]. |
'''GRASP''' ({{lang-en|general responsibility assignment software patterns}} — общие шаблоны распределения ответственностей; также существует английское слово ''"grasp" — «контроль, хватка»'') — [[Шаблон проектирования|шаблоны]], используемые в [[Объектно-ориентированное проектирование|объектно-ориентированном проектировании]] для решения общих задач по назначению ответственностей [[Класс (программирование)|классам]] и [[Объект (программирование)|объектам]]. |
||
В книге [[Ларман, Крэг|Крэга Лармана]] «''Применение [[UML]] и шаблонов проектирования''»<ref name="larman">[[:en:Craig Larman|Larman, Craig]]. ''Applying UML and Patterns — Third Edition''. [http://authors.phptr.com/larman/uml_ooad/index.html] {{Wayback|url=http://authors.phptr.com/larman/uml_ooad/index.html |
В книге [[Ларман, Крэг|Крэга Лармана]] «''Применение [[UML]] и шаблонов проектирования''»<ref name="larman">[[:en:Craig Larman|Larman, Craig]]. ''Applying UML and Patterns — Third Edition''. [http://authors.phptr.com/larman/uml_ooad/index.html] {{Wayback|url=http://authors.phptr.com/larman/uml_ooad/index.html|date=20030630201405}}</ref> описано 9 таких шаблонов: каждый помогает решить некоторую проблему, возникающую как в [[Объектно-ориентированный анализ|объектно-ориентированном анализе]], так и в практически любом проекте по разработке [[Программное обеспечение|программного обеспечения]]. Таким образом, шаблоны «G.R.A.S.P.» — хорошо документированные, стандартизированные и проверенные временем принципы [[Объектно-ориентированное проектирование|объектно-ориентированного анализа]], а не попытка привнести что-то принципиально новое. |
||
== Каталог шаблонов == |
== Каталог шаблонов == |
||
Строка 31: | Строка 31: | ||
=== 3. Контроллер (Controller) === |
=== 3. Контроллер (Controller) === |
||
* Отвечает за операции, запросы |
* Отвечает за операции, запросы которые приходят от пользователя, и может выполнять сценарии одного или нескольких [[Прецедент (UML)|вариантов использования]] (например, создание и удаление); |
||
* Не выполняет работу самостоятельно, а делегирует компетентным исполнителям; |
* Не выполняет работу самостоятельно, а делегирует компетентным исполнителям; |
||
* Может представлять собой: |
* Может представлять собой: |
Версия от 15:53, 14 декабря 2022
GRASP (англ. general responsibility assignment software patterns — общие шаблоны распределения ответственностей; также существует английское слово "grasp" — «контроль, хватка») — шаблоны, используемые в объектно-ориентированном проектировании для решения общих задач по назначению ответственностей классам и объектам.
В книге Крэга Лармана «Применение UML и шаблонов проектирования»[1] описано 9 таких шаблонов: каждый помогает решить некоторую проблему, возникающую как в объектно-ориентированном анализе, так и в практически любом проекте по разработке программного обеспечения. Таким образом, шаблоны «G.R.A.S.P.» — хорошо документированные, стандартизированные и проверенные временем принципы объектно-ориентированного анализа, а не попытка привнести что-то принципиально новое.
Каталог шаблонов
Краткая характеристика девяти шаблонов:
1. Информационный эксперт (Information Expert)
Шаблон определяет базовый принцип распределения ответственностей:
Ответственность должна быть назначена тому, кто владеет максимумом необходимой информации для исполнения — информационному эксперту.
Этот шаблон — самый очевидный и важный из девяти. Если его не учесть — получится спагетти-код, в котором трудно разобраться.
Локализация же ответственностей, проводимая согласно шаблону:
- Повышает:
- Инкапсуляцию;
- Простоту восприятия;
- Готовность компонентов к повторному использованию;
- Снижает:
- степень зацепления.
2. Создатель (Creator)
Проблема: Кто отвечает за создание объекта некоторого класса A?
Решение: Назначить классу B обязанность создавать объекты класса A, если класс B:
- содержит(contains) или агрегирует(aggregate) объекты A;
- записывает(records) объекты A;
- активно использует объекты A;
- обладает данными для инициализации объектов A
Можно сказать, что шаблон «Creator» - это интерпретация шаблона «Information Expert» (смотрите пункт № 1) в контексте создания объектов.
Большинство порождающих шаблонов проектирования так или иначе выводятся или опираются на шаблон «Creator».
3. Контроллер (Controller)
- Отвечает за операции, запросы которые приходят от пользователя, и может выполнять сценарии одного или нескольких вариантов использования (например, создание и удаление);
- Не выполняет работу самостоятельно, а делегирует компетентным исполнителям;
- Может представлять собой:
- Систему в целом;
- Подсистему;
- Корневой объект;
- Устройство.
4. Слабое зацепление (Low Coupling)
«Степень зацепления» — мера неотрывности элемента от других элементов (либо мера данных, имеющихся у него о них).
«Слабое» зацепление является оценочной моделью, которая диктует, как распределить обязанности, которые необходимо поддерживать.
«Слабое» зацепление — распределение ответственностей и данных, обеспечивающее взаимную независимость классов. Класс со «слабым» зацеплением:
- Имеет слабую зависимость от других классов;
- Не зависит от внешних изменений (изменение в одном классе оказывает слабое влияние на другие классы);
- Прост для повторного использования.
5. Высокая связность (High Cohesion)
Высокая связность класса — это оценочная модель, направленная на удержание объектов должным образом сфокусированными, управляемыми и понятными. Высокая связность обычно используется для поддержания низкого зацепления. Высокая связность означает, что обязанности данного элемента тесно связаны и сфокусированы. Разбиение программ на классы и подсистемы является примером деятельности, которая увеличивает связность системы.
И наоборот, низкая связность — это ситуация, при которой данный элемент имеет слишком много несвязанных обязанностей. Элементы с низкой связностью часто страдают от того, что их трудно понять, трудно использовать, трудно поддерживать.
Связность класса — мера сфокусированности предметных областей его методов:
- «Высокая» связность — сфокусированные подсистемы (предметная область определена, управляема и понятна);
- «Низкая» связность — абстрактные подсистемы, затруднены:
- Восприятие;
- Повторное использование;
- Поддержка;
- Устойчивость к внешним изменениям.
6. Полиморфизм (Polymorphism)
Устройство и поведение системы:
- Определяется данными;
- Задано полиморфными операциями её интерфейса.
Пример: Адаптация коммерческой системы к многообразию систем учёта налогов может быть обеспечена через внешний интерфейс объектов-адаптеров (см. также: Шаблон «Адаптеры»).
7. Чистая выдумка (Pure Fabrication)
Не относится к предметной области, но:
- Уменьшает зацепление;
- Повышает связность;
- Упрощает повторное использование.
«Pure Fabrication» отражает концепцию сервисов в модели предметно-ориентированного проектирования.
Пример задачи: Не используя средства класса «А», внести его объекты в базу данных.
Решение: Создать класс «Б» для записи объектов класса «А» (см. также: «Data Access Object»).
8. Перенаправление (Indirection)
Слабое зацепление между элементами системы (и возможность повторного использования) обеспечивается назначением промежуточного объекта их посредником.
Пример: В архитектуре Model-View-Controller, контроллер (англ. controller) ослабляет зацепление данных (англ. model) с их представлением (англ. view).
9. Устойчивость к изменениям (Protected Variations)
Шаблон защищает элементы от изменения другими элементами (объектами или подсистемами) с помощью вынесения взаимодействия в фиксированный интерфейс, через который (и только через который) возможно взаимодействие между элементами. Поведение может варьироваться лишь через создание другой реализации интерфейса.
См. также
Ссылки
- ↑ Larman, Craig. Applying UML and Patterns — Third Edition. [1] Архивная копия от 30 июня 2003 на Wayback Machine
В статье не хватает ссылок на источники (см. рекомендации по поиску). |