GRASP: различия между версиями
[непроверенная версия] | [отпатрулированная версия] |
E scorp13 (обсуждение | вклад) Coupling= связанность, Cohesion = связность |
Пушёк (обсуждение | вклад) Нет описания правки |
||
(не показано 27 промежуточных версий 20 участников) | |||
Строка 1: | Строка 1: | ||
'''GRASP''' ({{lang-en| |
'''GRASP''' (от {{lang-en|General Responsibility Assignment Software Patterns}} — общие шаблоны распределения ответственностей; также отсылает к {{lang-en|grasp}} — «способность быстрого восприятия, понимание, схватывание») — [[Шаблон проектирования|шаблоны]], используемые в [[Объектно-ориентированное проектирование|объектно-ориентированном проектировании]] для решения общих задач по назначению ответственностей [[Класс (программирование)|классам]] и [[Объект (программирование)|объектам]]. |
||
В книге [[Ларман, Крэг|Крэга Лармана]] « |
В книге [[Ларман, Крэг|Крэга Лармана]] «Применение [[UML]] и шаблонов проектирования»<ref name="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 таких шаблонов: каждый помогает решить некоторую проблему, возникающую как в [[Объектно-ориентированный анализ|объектно-ориентированном анализе]], так и в практически любом проекте по разработке [[Программное обеспечение|программного обеспечения]]. Таким образом, шаблоны «GRASP» — хорошо документированные, стандартизированные и проверенные временем принципы объектно-ориентированного анализа, а не попытка привнести что-то принципиально новое. |
||
== Каталог шаблонов == |
== Каталог шаблонов == |
||
Краткая характеристика девяти шаблонов: |
Краткая характеристика девяти шаблонов: |
||
=== |
=== 1. Информационный эксперт (Information Expert) === |
||
Шаблон определяет базовый принцип распределения ответственностей |
Шаблон определяет базовый принцип распределения ответственностей. Обязанности должны быть назначены объекту, который владеет максимумом необходимой информации для выполнения обязанности. Такой объект называется ''информационным экспертом''. |
||
Этот шаблон — самый очевидный и важный из девяти. Если его не учесть — получится [[спагетти-код]], в котором трудно разобраться. |
|||
Локализация же ответственностей, проводимая согласно шаблону: |
Локализация же ответственностей, проводимая согласно шаблону: |
||
Строка 13: | Строка 15: | ||
** [[Инкапсуляция (программирование)|Инкапсуляцию]]; |
** [[Инкапсуляция (программирование)|Инкапсуляцию]]; |
||
** Простоту восприятия; |
** Простоту восприятия; |
||
** Готовность компонентов к повторному использованию; |
** Готовность компонентов к повторному использованию; |
||
* Снижает: |
* Снижает: |
||
** степень [[Зацепление (программирование)|зацепления]]. |
** степень [[Зацепление (программирование)|зацепления]]. |
||
=== 2. Создатель (Creator) === |
=== 2. Создатель (Creator) === |
||
'''Проблема:''' Кто отвечает за создание объекта некоторого класса A? |
|||
{{см. также|Абстрактная фабрика (шаблон проектирования)}} |
|||
Класс должен создавать экземпляры тех классов, которые он может: |
|||
⚫ | |||
* Записывать; |
|||
* Использовать; |
|||
* Инициализировать, имея нужные данные. |
|||
'''Решение:''' Назначить классу B обязанность создавать объекты класса A, если класс B: |
|||
Так применяется шаблон «''Информационный эксперт''» (смотрите пункт №1) в вопросах создания объектов. |
|||
⚫ | |||
* записывает(records) объекты A; |
|||
* активно использует объекты A; |
|||
* обладает данными для инициализации объектов A |
|||
Можно сказать, что шаблон «''Creator''» — это интерпретация шаблона «''Information Expert''» (смотрите пункт № 1) в контексте создания объектов. |
|||
Альтернатива — шаблон «[[Абстрактная фабрика (шаблон проектирования)|Фабрика]]» (создание объектов концентрируется в отдельном классе). |
|||
Большинство [[Порождающие шаблоны проектирования|порождающих шаблонов проектирования]] так или иначе выводятся или опираются на шаблон «''Creator''». |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
* Не выполняет работу самостоятельно, а делегирует компетентным исполнителям; |
* Не выполняет работу самостоятельно, а делегирует компетентным исполнителям; |
||
* Может представлять собой: |
* Может представлять собой: |
||
** Систему в целом; |
** Систему в целом; |
||
** Подсистему; |
** Подсистему; |
||
** Корневой объект; |
** Корневой объект; |
||
** Устройство. |
** Устройство. |
||
=== 4. Слабое зацепление (Low Coupling) === |
=== 4. Слабое (низкое) зацепление (Low Coupling) === |
||
{{ |
{{main|Зацепление (программирование)}} |
||
Зацепление — мера того, насколько взаимозависимы разные подпрограммы или модули<ref name="ISO_24765">{{Cite web |url=https://standards.iso.org/ittf/PubliclyAvailableStandards/c071952_ISO_IEC_IEEE_24765_2017.zip |title=ISO/IEC/IEEE 24765-2017 Systems and software engineering — Vocabulary |access-date=2021-11-01 |archive-date=2022-03-31 |archive-url=https://web.archive.org/web/20220331214951/https://standards.iso.org/ittf/PubliclyAvailableStandards/c071952_ISO_IEC_IEEE_24765_2017.zip |deadlink=no }}</ref>. |
|||
«'''Степень зацепления»''' — мера ''неотрывности'' элемента от других элементов (либо мера данных, имеющихся у него о них). |
|||
«'''Слабое» зацепление''' является оценочной моделью, которая диктует, как распределить обязанности, которые необходимо поддерживать. |
|||
«'''Слабое» зацепление''' — распределение ответственностей и данных, обеспечивающее взаимную независимость классов. Класс со «слабым» зацеплением: |
|||
* Имеет слабую зависимость от других классов; |
|||
* Не зависит от внешних изменений (изменение в одном классе оказывает слабое влияние на другие классы); |
|||
*Прост для повторного использования. |
|||
Сильное зацепление рассматривается как серьёзный недостаток, поскольку затрудняет понимание логики модулей, их модификацию, автономное тестирование, а также переиспользование по отдельности. Слабое зацепление, напротив, является признаком хорошо структурированной и хорошо спроектированной системы. |
|||
⚫ | |||
⚫ | |||
'''Высокая связность класса''' — это оценочная модель, направленная на удержание объектов должным образом сфокусированными, управляемыми и понятными. Высокая связность обычно используется для поддержания низкого зацепления. Высокая связность означает, что обязанности данного элемента тесно связаны и сфокусированы. Разбиение программ на классы и подсистемы является примером деятельности, которая увеличивает связность системы. |
|||
⚫ | |||
И наоборот, низкая связность — это ситуация, при которой данный элемент имеет слишком много несвязанных обязанностей. Элементы с низкой связностью часто страдают от того, что их трудно понять, трудно использовать, трудно поддерживать. |
|||
⚫ | |||
Связность — мера силы взаимосвязанности элементов внутри [[Модуль (программирование)|модуля]]; способ и степень, в которой задачи, выполняемые некоторым программным модулем, связаны друг с другом<ref name="ISO_24765"/>. |
|||
Сильная связность класса / модуля означает, что его элементы тесно связаны и сфокусированы. |
|||
'''Связность''' '''класса''' — мера сфокусированности предметных областей его методов: |
|||
Слабая (низкая) связность класса / модуля означает, что он не сфокусирован на одной цели, его элементы предназначены для слишком многих несвязанных обязанностей. Такой модуль трудно понять, использовать и поддерживать. |
|||
* «'''Высокая»''' связность — ''сфокусированные'' подсистемы (предметная область определена, управляема и понятна); |
|||
* «'''Низкая»''' связность — ''абстрактные'' подсистемы затруднены: |
|||
** Восприятие; |
|||
** Повторное использование; |
|||
** Поддержка; |
|||
** Устойчивость к внешним изменениям. |
|||
=== |
=== 6. Полиморфизм (Polymorphism) === |
||
{{См. также|Полиморфизм (информатика)}} |
{{См. также|Полиморфизм (информатика)}} |
||
Устройство и поведение системы: |
Устройство и поведение системы: |
||
* Определяется данными; |
* Определяется данными; |
||
* Задано [[Полиморфизм (программирование)|полиморфными операциями]] её интерфейса. |
* Задано [[Полиморфизм (программирование)|полиморфными операциями]] её интерфейса. |
||
'''Пример:''' Адаптация коммерческой системы к ''многообразию'' систем учёта налогов может быть обеспечена через внешний интерфейс объектов-адаптеров (см. также: Шаблон «[[Адаптер (шаблон проектирования)|Адаптеры]]»). |
'''Пример:''' Адаптация коммерческой системы к ''многообразию'' систем учёта налогов может быть обеспечена через внешний интерфейс объектов-адаптеров (см. также: Шаблон «[[Адаптер (шаблон проектирования)|Адаптеры]]»). |
||
=== 7. Чистая выдумка (Pure Fabrication) === |
=== 7. Чистая выдумка (Pure Fabrication) === |
||
Не относится к [[Предметная область|предметной области]], но: |
Не относится к [[Предметная область|предметной области]], но: |
||
* Уменьшает зацепление; |
* Уменьшает зацепление; |
||
* Повышает |
* Повышает связность; |
||
* Упрощает [[Повторное использование кода|повторное использование]]. |
* Упрощает [[Повторное использование кода|повторное использование]]. |
||
«''Pure Fabrication''» отражает концепцию сервисов в модели [[ |
«''Pure Fabrication''» отражает концепцию сервисов в модели [[Предметно-ориентированное проектирование|предметно-ориентированного проектирования]]. |
||
'''Пример задачи:''' Не используя средства класса «А», внести его объекты в [[База данных|базу данных]]. |
'''Пример задачи:''' Не используя средства класса «А», внести его объекты в [[База данных|базу данных]]. |
||
'''Решение:''' Создать класс «Б» для записи объектов класса «А» (см. также: ''« |
'''Решение:''' Создать класс «Б» для записи объектов класса «А» (см. также: ''«'''[[Data Access Object]]'''''»). |
||
=== 8. |
=== 8. Перенаправление (Indirection) === |
||
{{см. также|Посредник (шаблон проектирования)}} |
{{см. также|Посредник (шаблон проектирования)}} |
||
Слабое зацепление между элементами системы (и возможность повторного использования) обеспечивается назначением промежуточного объекта их '''посредником'''. |
Слабое зацепление между элементами системы (и возможность повторного использования) обеспечивается назначением промежуточного объекта их '''посредником'''. |
||
Строка 89: | Строка 79: | ||
'''Пример:''' В архитектуре [[model-view-controller|Model-View-Controller]], ''контроллер'' ''(англ. controller)'' ослабляет зацепление данных ''(англ. model)'' с их представлением ''(англ. view)''. |
'''Пример:''' В архитектуре [[model-view-controller|Model-View-Controller]], ''контроллер'' ''(англ. controller)'' ослабляет зацепление данных ''(англ. model)'' с их представлением ''(англ. view)''. |
||
=== |
=== 9. Устойчивость к изменениям (Protected Variations) === |
||
Шаблон защищает элементы от изменения другими элементами (объектами или подсистемами) с помощью вынесения взаимодействия в фиксированный [[Интерфейс (объектно-ориентированное программирование)|интерфейс]], через который (и только через который) возможно взаимодействие между элементами. Поведение может варьироваться лишь через создание другой реализации интерфейса. |
Шаблон защищает элементы от изменения другими элементами (объектами или подсистемами) с помощью вынесения взаимодействия в фиксированный [[Интерфейс (объектно-ориентированное программирование)|интерфейс]], через который (и только через который) возможно взаимодействие между элементами. Поведение может варьироваться лишь через создание другой реализации интерфейса. |
||
Строка 95: | Строка 85: | ||
* [[Паттерны проектирования]] |
* [[Паттерны проектирования]] |
||
== |
== Примечания == |
||
{{примечания}} |
{{примечания}} |
||
Текущая версия от 04:19, 29 октября 2023
GRASP (от англ. General Responsibility Assignment Software Patterns — общие шаблоны распределения ответственностей; также отсылает к англ. grasp — «способность быстрого восприятия, понимание, схватывание») — шаблоны, используемые в объектно-ориентированном проектировании для решения общих задач по назначению ответственностей классам и объектам.
В книге Крэга Лармана «Применение UML и шаблонов проектирования»[1] описано 9 таких шаблонов: каждый помогает решить некоторую проблему, возникающую как в объектно-ориентированном анализе, так и в практически любом проекте по разработке программного обеспечения. Таким образом, шаблоны «GRASP» — хорошо документированные, стандартизированные и проверенные временем принципы объектно-ориентированного анализа, а не попытка привнести что-то принципиально новое.
Каталог шаблонов
[править | править код]Краткая характеристика девяти шаблонов:
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)
[править | править код]Зацепление — мера того, насколько взаимозависимы разные подпрограммы или модули[2].
Сильное зацепление рассматривается как серьёзный недостаток, поскольку затрудняет понимание логики модулей, их модификацию, автономное тестирование, а также переиспользование по отдельности. Слабое зацепление, напротив, является признаком хорошо структурированной и хорошо спроектированной системы.
5. Сильная (высокая) связность (High Cohesion)
[править | править код]Связность — мера силы взаимосвязанности элементов внутри модуля; способ и степень, в которой задачи, выполняемые некоторым программным модулем, связаны друг с другом[2].
Сильная связность класса / модуля означает, что его элементы тесно связаны и сфокусированы.
Слабая (низкая) связность класса / модуля означает, что он не сфокусирован на одной цели, его элементы предназначены для слишком многих несвязанных обязанностей. Такой модуль трудно понять, использовать и поддерживать.
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
- ↑ 1 2 ISO/IEC/IEEE 24765-2017 Systems and software engineering — Vocabulary . Дата обращения: 1 ноября 2021. Архивировано 31 марта 2022 года.
В статье не хватает ссылок на источники (см. рекомендации по поиску). |