Стандарты и паттерны для создания и развития программного обеспечения
Алгоритм использования стандартов для задач в программировании (АИСТ-2010-Паттерн)
Перевод паттернов на язык элементов
Паттерны используются для решения задач проектирования в области объектно-ориентированного программирования, следовательно, абстракции, которыми они оперируют - это объекты и классы.
Предполагается, что паттерны проектирования могут помогать в решении задач более высокого архитектурного уровня абстракции, где элементами являются классы и объекты, объединенные в новые структуры - конгломераты. Примером может служить клиент-серверная архитектура.
Понятие объект в этом разделе используется как синоним к понятию элемент. Наследование предполагает, что элемент и его наследники имеют одинаковые свойства и функциональность. Запрос - обращение к элементу с целью выполнения им некоторых действий. Интерфейс отражает множество всех запросов, на которые может отвечать элемент.
Итак, попытаемся перевести паттерны из [1] на язык более высокого уровня абстракции, чем язык классов и объектов, не выходя за пределы описанной в книге классификации, и параллельно выделяя предназначения конкретных паттернов.
Порождающие паттерны
Задает абстрактный способ создания порождающим элементом абстрактного объекта. Порождающий элемент предает ответственность за создание конкретного объекта связанному с ним элементу-потомку, наследующему его структуру и переопределяющему конкретный способ создания.
Признаки применения:
· Порождающему элементу заранее неизвестно, какие конкретные объекты ему нужно создавать, поскольку предполагается много различных вариантов функционирования системы;
· Порождающий элемент определен так, чтобы объекты, которые он создает, устанавливались только в его наследниках;
· Порождающий элемент передает свои обязанности одному из нескольких вспомогательных наследников, т.е. функциональность логически разделена между ним и вспомогательными элементами, каждый из которых выполняет свою конкретную функцию. Паттерн предоставляет возможность легко заменять эти вспомогательные элементы.
Предоставляет способ для создания группы объектов. Элемент (абстрактная фабрика) содержит абстрактный способ для создания семейства абстрактных объектов-продуктов. Конкретные способы создания конкретных семейств определяются в элементах-наследниках (конкретных фабриках). В процессе работы создается только один наследник, который создает конкретное семейство объектов-продуктов.
Признаки применения:
· Система не должна зависеть от того, как создаются объекты.
· Конкретный вариант требуемого поведения системы дают не отдельные объекты, а четко выраженное семейство связанных объектов. Объекты одного семейства должны использоваться вместе.
· Для функционирования системы необходимо одно из таких семейств взаимосвязанных объектов.
· Одиночка
Гарантирует, что у элемента будет не более одного созданного экземпляра, предоставляет к нему доступ.
Признаки применения:
Должен быть ровно один легко доступный экземпляр некоторого элемента.
· Прототип
Определяет, задает виды создаваемых объектов с помощью некоторого элемента-прототипа и создает новые объекты путем его копирования (клонирования).
Признаки применения:
· Порождаемые объекты определяются в процессе функционирования системы;
· Для того чтобы избежать построения иерархий конкретных фабрик, параллельных иерархии объектов-продуктов;
· Создаваемые объекты могут находиться в одном из небольшого числа различных состояний, так что может оказаться целесообразней устанавливать соответствующее число прототипов и клонировать их.
Строитель – паттерн, конструирующий объекты.
Если нужно создавать различные сложные объекты, при этом процесс создания их всех протекает очень схожими этапами, так что можно выделить общий единый алгоритм, включающий выполнение всех возможных действий. При этом конструируемые объекты в общем случае не схожи между собой, т.е. их невозможно обобщить все в единую иерархию, объединить общие свойства и т.д.
Тогда чтобы не дублировать действия при создании этот процесс можно объединить в единый алгоритм, за выполнение которого отвечает некоторый элемент, способный создать любой из сложных объектов.
Так как объекты совершенно разные, необходимо чтобы каждый из них имел свою конкретную структуру. Для этого следует выделить еще один элемент, отвечающий непосредственно за создание отдельных частей. Эта сущность будет своя для каждого сложного объекта, который может быть построен.
Признаки применения:
· Алгоритм создания сложного объекта не должен зависеть от того, из каких частей он состоит, и как они стыкуются между собой.
· Процесс должен позволять создавать различные виды конечного объекта.
Структурные паттерны.
Структурные паттерны помогают найти способ оптимального получения более крупных структур и образований из уже имеющихся элементов.
· Адаптер
Адаптер обеспечивает совместную работу элементов с несовместимыми интерфейсами, которая без него была бы невозможна. Адаптер класса представляет собой элемент - потомок элементов с несовместимыми интерфейсами, наследующий их функциональности. Адаптер объекта наследует требуемый интерфейс и содержит в себе экземпляр элемента с адаптируемым интерфейсом, тем самым имея доступ к его функциональности.
Признаки применения:
· Необходимо использовать существующий элемент, но его интерфейс не соответствует потребностям;
· Необходимо создать повторно используемый элемент, который должен взаимодействовать с заранее неизвестными или не связанными с ним объектами, имеющими несовместимые интерфейсы;
Декоратор - паттерн, структурирующий элементы, расширяя их функциональность.
Динамически расширяет функциональность элемента, добавляет ему новые обязанности.
Признаки применения:
· Для динамического добавления новых возможностей элементам;
· Для реализации возможностей, которые нужны не всем элементам и не всегда, которые потом можно легко исключить;
· Когда расширение функциональности путем порождения элементов-потомков с новой функциональностью по каким-то причинам неудобно или невозможно.
Заместитель - паттерн, контролирующий доступ к элементам, предоставляя более оптимальное их взаимодействие.
Разумно управлять доступом к элементу, поскольку тогда можно отложить расходы на его создание до момента, когда элемент действительно понадобится. Таким образом, выявляются элементы, функционирование которых проходит не совсем оптимально, и вводятся объекты-заместители, которые, дублируя внешний вид и поведение «проблемных» элементов, переадресуют им запросы лишь тогда, когда это действительно необходимо, либо после некоторых оптимизационных действий.
Признаки применения:
· Когда требуется удаленный функционал
Удаленный заместитель предоставляет локального представителя вместо целевого объекта, находящегося в другом (адресном) пространстве.
· Когда нужен виртуальный заместитель
Виртуальный заместитель создает «тяжелые» элементы по требованию.
· Когда нужно контролировать доступ к исходному элементу
Защищающий заместитель контролирует доступ к исходному элементу.
Компоновщик - паттерн, структурирующий элементы таким образом, что появляется возможность одинаковым образом обращаться с каждым из них. Позволяет единообразно трактовать индивидуальные и составные элементы.
Признаки применения:
· Нужно представить иерархию различных элементов так, чтобы с каждой ее веткой можно было работать одинаково, как с одной и той же сущностью.
· Чтобы можно было единообразно трактовать составные и индивидуальные элементы.
· Мост (только для ООП)
Главное назначение - отделить абстракцию от ее реализации так, чтобы то и другое можно было изменять независимо. Польза данного разделения появляется в случае, когда для некоторой абстракции возможно несколько реализаций.
Признаки применения:
· Нужно избежать постоянной привязки абстракции к реализации.
· Когда конкретную реализацию необходимо выбирать во время функционирования системы.
· Нужно разделить одну и ту же реализацию между несколькими элементами.
Приспособленец - паттерн, структурирующий элементы таким образом, что из них создается всего лишь ограниченный необходимый набор экземпляров вместо всего большого множества.
У элементов из множества выделяется фиксированное число их состояний, которые они принимают в процессе своей деятельности, на каждое такое состояние создается по специальному объекту и далее в процессе функционирования в программе создается и фигурирует только это ограниченное количество экземпляров.
Эффективность паттерна приспособленец во многом зависит от того, как и где он используется. Следует применять этот паттерн, когда выполнены все нижеперечисленные условия:
· Используется большое число элементов.
· Большую часть состояния элементов можно вынести вовне системы.
· Система не зависит от идентичности элемента.
· Фасад
Фасад - паттерн, структурирующий элементы, предоставляя ко всем ним доступ через единый элемент.
Предоставляет единый, унифицированный интерфейс ко всей некоторой подсистеме вместо набора отдельных и многочисленных интерфейсов.
Признаки применения:
· Нужно предоставить простой интерфейс к сложной подсистеме
· Между элементами, использующими подсистему, и элементами системы существует много зависимостей. Нужно изолировать подсистему.
· Нужно разложить систему на отдельные слои.
Паттерны поведения.
Паттерны поведения связаны с алгоритмами, способами взаимодействия, связями и распределением обязанностей между элементами.
В ряде случаев система на разных этапах использует одни и те же алгоритмы, строящиеся из более простых, элементарных неизменяющихся подалгоритмов.
Паттерн интерпретатор предлагает составлять лишь некоторую схему компоновки новых алгоритмов этими элементарными составляющими и далее передавать ее в некоторый элемент, который собирает полноценную архитектуру данного алгоритма.
Шаблонный метод - паттерн поведения объектов, определяющий функциональность конкретных методов в рамках абстрактных сущностей.
Шаблонный метод определяет основу алгоритма в рамках абстрактных элементов и методов, а элементам-потомкам позволяет переопределять отдельные шаги этого алгоритма (или все сразу), не изменяя, таким образом, его структуру и последовательность в целом.
Признаки применения
· Чтобы однократно использовать инвариантные части алгоритма.
· Когда нужно вычленить и локализовать в одном элементе поведение.
· Итератор
Итератор – паттерн поведения объектов, предоставляющий последовательный доступ ко всем элементам составного объекта, не раскрывая его внутреннего представления.
Признаки применения:
· Для доступа к содержимому агрегированных элементов без раскрытия их внутреннего представления.
· Для поддержки нескольких видов активных обходов одного и того же агрегированного элемента.
· Команда
Представляет запрос на выполнение конкретного алгоритма в виде элемента, позволяя тем самым задавать параметры для обработки соответствующих запросов, ставить запросы в очередь или протоколировать их, а также поддерживать отмену операций.
Признаки применения:
· Нужно параметризовать объекты выполняемым действием.
· Определять, ставить в очередь и выполнять запросы в разное время.
· Поддержать отмену операций.
· Поддержать протоколирование изменений.
Наблюдатель - паттерн поведения объектов, устанавливающий систему оповещения объектами своих соседей в процессе их деятельности.
Удобно иметь такую структуру, в которой каждый элемент, если он заинтересован в каких-либо событиях системы, мог бы самостоятельно «подписаться» на эти изменения независимо от других заинтересованных участникам и, таким образом, получая уведомления об этих событиях, выполнять требуемые действия.
Наблюдатель определяет зависимость типа «один ко многим» между объектами таким образом, что при изменении состояния одного объекта все зависящие от него оповещаются об этом и автоматически обновляются.
Признаки применения:
· Когда у элементов существуют параметры, один из которых зависит от другого.
· Когда при модификации одного объекта требуется изменить и другие, но неизвестно, сколько именно объектов нужно изменить.
Когда один объект должен оповещать других, не владея информацией об уведомляемых объектах.
Посредник - паттерн поведения элементов, предоставляющий единый центр взаимодействия определенной группы элементов, которые должны быть взаимосвязаны друг с другом. Определяет элемент, содержащий сведения о способах взаимодействия множества элементов.
Посредник обеспечивает слабую связанность системы, избавляя объекты от необходимости явно ссылаться друг на друга, и позволяя тем самым независимо изменять взаимодействия между ними.
Признаки применения:
· Имеются элементы, связи между которыми сложны и четко определены.
· Нельзя повторно и независимо использовать элемент (например, в другом контексте), поскольку он обменивается информацией со многими другими элементами.
Посетитель - паттерн поведения объектов, задающий стратегии обхода.
Описывает операцию, которая должна быть выполнена над каждым элементом из некоторой произвольной структуры.
Признаки применения:
· В структуре присутствуют объекты с различными интерфейсами и нужно выполнять операции, не зависящие от интерфейсов
· Над элементами, входящими в состав структуры, надо выполнять разнообразные, не связанные между собой
· Классы, устанавливающие структуру объектов, изменяются редко, но новые операции над этой структурой добавляются часто.
Состояние - паттерн поведения объектов, задающий разную функциональность в зависимости от состояния элемента.
Позволяет элементу варьировать свое поведение в зависимости от внутреннего состояния. Поскольку поведение может меняться совершенно произвольно без каких-либо ограничений, извне создается впечатление, что изменился элемент.
Признаки применения
· Когда поведение элемента зависит от его состояния и при этом должно изменяться во время функционирования.
· Когда существует множество условий и выбор ветви зависит от состояния. Паттерн позволяет трактовать состояние элемента как самостоятельный элемент, который может изменяться независимо от других.
Если в системе фигурируют различные алгоритмы, которые часто могут использоваться повторно в других частях, удобно поместить каждый из них в отдельный элемент, параметризовать и запускать их там, где понадобится. Стратегия определяет семейство алгоритмов и делает их взаимозаменяемыми.
Признаки применения:
· Имеется много родственных элементов, отличающихся только поведением.
· Нужно иметь несколько разных вариантов алгоритма.
· В элементе определено много поведений.
Хранитель - паттерн поведения элементов, сохраняющий состояния.
Фиксирует и выносит за пределы элемента его внутреннее состояние так, чтобы позднее можно было восстановить в нем элемент.
Признаки применения:
Необходимо сохранить мгновенный снимок состояния элемента (или его части), чтобы впоследствии элемент можно было восстановить в том же состоянии.
Цепочка обязанностей - паттерн поведения, выстраивающий элементы составных частей системы связанными между собой по цепочке, для передачи запроса на обработку от более низких, детализированных слоев системы к более высоким глобальным. Позволяет избежать привязки отправителя запроса к его получателю, связывает элементы-получатели в цепочку и передает запрос вдоль этой цепочки, пока его один из получателей его не обработает.
Признаки применения:
· Есть более одного элемента, способного обработать запрос, при этом настоящий обработчик заранее неизвестен и должен быть найден в соответствие с какой-либо логикой.
· Нужно отправить запрос одному из нескольких элементов, не указывая явно, какому именно.
Таким образом паттерны проектирования удалось перевести на общесистемный язык, а значит их возможно использовать в едином алгоритме решения задач программирования на ряду с стандартами ТРИЗ.