- Шаблоны проектирования GRASP
-
GRASP (англ. General Responsibility Assignment Software Patterns (общие образцы распределения обязанностей)) - паттерны, используемые в объектно-ориентированном проектировании для решения общих задач по назначению обязанностей классам и объектам.
В книге Крейга Лармана «Применение UML и шаблонов проектирования»[1] описано 9 таких образцов. Каждый из них помогает решить некоторую проблему, возникающую при объектно-ориентированном анализе, и которая возникает практически в любом проекте по разработке программного обеспечения. Таким образом, GRASP-паттерны - это хорошо документированные, стандартизированные и проверенные временем принципы объектно-ориентированного анализа, а не попытка привнести что-то принципиально новое.
Каталог паттернов
Ниже следует краткая характеристика девяти известных паттернов.
Information Expert (Информационный эксперт)
Шаблон Information Expert определяет базовый принцип назначения обязанностей. Он утверждает, что обязанности должны быть назначены объекту, который владеет максимумом необходимой информации для выполнения обязанности. Такой объект называется информационным экспертом. Возможно, этот шаблон является самым очевидным из девяти, но вместе с тем и самым важным.
Если дизайн не удовлетворяет этому принципу, то при программировании получается спагетти-код, в котором очень трудно разбираться. Локализация обязанностей позволяет повысить уровень инкапсуляции и уменьшить уровень связанности. Кроме читабельности кода повышается уровень готовности компонент к повторному использованию.
Creator (Производитель)
Паттерн Creator решает, кто должен создавать объект. Фактически, это применение шаблона Information Expert к проблеме создания объектов. Более конкретно, нужно назначить классу B обязанность создавать экземпляры класса A, если выполняется как можно больше из следующих условий:
- Класс B содержит (contains) или агрегирует (aggregate) объекты A.
- Класс B записывает (records) экземпляры объектов A.
- Класс B активно использует (closely uses) объекты A
- Класс B обладает данными инициализации (has the initializing data) для объектов A.
Альтернативой производителю является образец Фабрика. В этом случае создание объектов концентрируется в отдельном классе.
Controller (Контроллер)
Контроллер берёт на себя ответственность за выполнение операций, приходящих от пользователя и часто выполняет сценарий одного или нескольких вариантов использования (например, один контроллер может обрабатывать сценарии создания и удаления пользователя). Как правило, контроллер не выполняет работу самостоятельно, а делегирует обязанности компетентным объектам.
Иногда класс-контроллер представляет всю систему в целом, корневой объект, устройство или важную подсистему (внешний контроллер).
Low Coupling (Слабая связанность)
Low Coupling - это оценочный образец (или принцип), который устанавливает следующие свойства:
- малое число зависимостей между классами (подсистемами)
- слабая зависимость одного класса (подсистемы) от изменений в другом классе (подсистеме)
- высокая степень повторного использования подсистем
High Cohesion (Сильное сцепление)
High Cohesion - это также оценочный образец (или принцип), который, в отличие от предыдущего, задаёт свойство сильного сцепления внутри подсистем (поэтому никакого противоречия с предыдущим паттерном нет - наоборот, они дополняют друг друга). Классы (подсистемы) таким образом получаются сфокусированными, управляемыми и понятными.
Слабая связность подсистемы означает, что она выполняет несколько разных обязанностей. Такой код трудно поддерживать и повторно использовать. Поэтому рекомендуется разбивать перегруженные обязанностями подсистемы на несколько сильно сцепленных.
Polymorphism (Полиморфизм)
Полиморфизм позволяет обрабатывать альтернативные варианты поведения на основе типа и заменять подключаемые компоненты системы. Обязанности распределяются для различных вариантов поведения с помощью полиморфных операций для этого класса. Все альтернативные реализации приводятся к общему интерфейсу.
Пример: Интеграция разрабатываемой системы с различными внешними системами учета налогов. Используются локальные программные объекты, обеспечивающие адаптацию (Адаптеры), при отправке сообщения к такому объекту выполняется обращение к внешней системе с использованием ее собственного программного интерфейса. Использование полиморфизма здесь оправдано для возможной адаптации к различным внешним системам.
Pure Fabrication (Чистая выдумка)
Чистая выдумка - это класс, не отражающий никакого реального объекта предметной области, но специально придуманный для усиления связности, ослабления связанности или увеличения степени повторного использования. Pure Fabrication отражает концепцию сервисов в модели Программирование от предметной области.
Indirection (Посредник)
Образец Indirection поддерживает слабую связанность (и возможность повторного использования) путём назначения обязанностей посредника между ними промежуточному объекту. Пример: образец посредника (контроллер), отвечающего за поведение.
Protected Variations (Сокрытие реализации)
Образец Protected Variations защищает элементы от изменения других элементов (объектов или подсистем) с помощью вынесения взаимодействия в фиксированный интерфейс. Всё взвимодействие между элементами должно происходить через него. Поведение может варьироваться лишь с помощью создания другой реализации интерфейса.
См. также
Ссылки
Wikimedia Foundation. 2010.