Казахстан, Караганды, Карагандинский экономический университет, 2009 |
Структурные шаблоны проектирования
Низкая связанность
Шаблон "Низкая связанность" воплощает принцип проектирования, который позволяет распределить обязанности между объектами таким образом, чтобы степень связанности между системами оставалась низкой.
Степень связанности – мера, определяющая, насколько жестко один элемент связан с другими элементами, либо каким количеством данных о других элементах он обладает.
Программный компонент с низкой степенью связанности зависит от не очень большого числа других системных элементов и имеет следующие свойства:
- Малое число зависимостей между объектами в системе.
- Слабая зависимость одной подсистемы от изменений в другом классе подсистемы.
- Высокая степень повторного использования подсистем.
Следовательно, рассматриваемый паттерн используется, чтобы обеспечить низкую связанность при создании системных экземпляров и связывании их с другими. Суть шаблона "Низкая связанность" заключается в распределении обязанностей между объектами так, чтобы степень связанности оставалась на низком уровне.
Шаблон "Низкая связанность" позволяет избежать следующих проблем:
- При изменении в связанных классах необходимо делать локальные изменения только в конкретном классе.
- Это облегчает работу по внесению изменений.
- Повторное использование становится возможным.
- Применяя принцип низкой связности, общие, абстрактные классы остаются наиболее концептуальными и применимыми для последующего внедрения. Если поддаться соблазнам высокой связности, то это приведет к тому, что придется перетянуть часть бизнес-логики системы в конкретный класс, что усложнит его понимание и поддержку в последующем.
Приспособленец
Когда необходимо обеспечить поддержку множества мелких объектов, инициализированных и используемых в информационной системе, применяют структурный шаблон проектирования – "Приспособленец".
"Приспособленец"– это экземпляр объекта, который выдает себя за группу самостоятельных экземпляров.
Смысл использования шаблона "Приспособленец" состоит в моделировании сущности, число которых велико. Имеет смысл использовать данный паттерн, если одновременно выполняются следующие условия:
- В приложении используется большое число объектов, что приводит к высоким системным затратам.
- Большую часть состояния объектов можно вынести вовне оперативного использования:
- Часть состояния объекта является контекстной и может быть легко вынесена во внешние структуры.
- После вынесения части состояния все экземпляры становятся одинаковыми и это дает возможность заменить их одним.
- Приложение не проверяет идентичность объектов, т.к. в этом случае все якобы самостоятельные экземпляры являются одним объектом.
Реализация шаблона выполняется за счет создания разделяемого объекта, который можно использовать одновременно в нескольких контекстах. В каждом контексте он должен выглядеть как независимый объект, то есть быть неотличимым от исходного экземпляра. Паттерн "Приспособленец" декларирует интерфейс, с помощью которого конкретные приспособленцы могут получить внешнее состояние или как-то воздействовать на него. Кроме прочего, экземпляр приспособленца хранит внутреннее состояние, в то время как внешнее состояние хранится или вычисляется использующими его процессами обработки.
Наличие различных вариантов внутреннего состояния приводит к необходимости создания набора приспособленцев. При запросе нового экземпляра выполняется поиск уже реализованного варианта. Если такого не находится, то порождается новый.
Таким образом, можно отметить следующих "участников" шаблона:
- "Приспособленец".
- "Пул или Фабрика приспособленцев" – объект, создающий и управляющий экземплярами приспособленцев.
- "Неразделяемый объект" – экземпляр, существующий вне рамок шаблона.
Главным моментом при реализации шаблона является правильное разделение состояния объекта на внутреннее и внешнее. Именно возможность сделать это корректно и правильно является главным фактором применимости шаблона.
Очень важно, чтобы вынесенная информация вписывалась в абстракцию ее нового хранилища.
Некоторые объекты могут иметь много различных вариантов своих состояний. Это приведет к тому, что общее число объектов не сильно уменьшится. Тогда нужно рассмотреть следующий вариант:
- Вынесенное состояние не сохраняется отдельно.
- Рассчитывается непосредственно перед вызовом (шаблон "Компоновщик").
Шаблон "Приспособленец" часто используется совместно с шаблоном "Компоновщик" для уменьшения числа экземпляров частей составных объектов. Необходимо осознавать минус такого подхода, заключающегося в отсутствии части данных, которые могут быть востребованы в дальнейшем при организации бизнес-логики разрабатываемого приложения.
При разработке набора приспособленцев стоит продумать механизм определения и освобождения неиспользуемых экземпляров.
Результатами использования шаблона "Приспособленец" являются:
- уменьшение количества экземпляров объектов, оперируемых в информационной системе;
- оптимизация процесса управления этими объектами.
Устойчивый к изменениям
Варианты решения задачи реализации или поддержки системы, в которой изменение одних элементов не сильно затрагивало другие, мы начали обсуждать в разделе о шаблоне "Низкая связанность", но при этом затронули один из возможных аспектов, описанных в соответствующем шаблоне.
Задача модификации системы наиболее актуальна в условиях динамически изменяющихся требований. Зачастую удается выделить "места неустойчивости" системы, которые наиболее часто будут подвержены изменению. Тогда сущность шаблона "Устойчивый к изменениям" заключается в устранении подобных точек путем определения их в качестве интерфейсов и реализации для них различных функциональных вариантов. Основная цель состоит в распределении обязанностей продукта таким образом, чтобы обеспечить устойчивый интерфейс.
Термин "интерфейс" используется для обозначения способа обеспечения доступа.
Шаблон"Устойчивый к изменениям"описывает ключевой принцип, на основе которого реализуются механизмы,обеспечивающие гибкость и защиту системы от влияния изменений внешних систем.
Подобными механизмами являются:
- инкапсуляция данных, универсальные интерфейсы;
- проектирование на основе данных и пр.
Определившись со способом реализации, необходимо помнить о том, когда не следует применять данный паттерн.
Говоря об устойчивости программного обеспечения, следует выделить два типа точек:
- Точки вариации:
- Места"ветвления" в существующей на данный момент системе или в требованиях к ней– например, необходимость поддержки нескольких интерфейсов для системы вычисления налоговых платежей.
- Точки эволюции:
- Предполагаемые точки ветвления, которые могут возникнуть в будущем, однако не определяемые существующими требованиями.
Сосредоточиться стоит именно на первых типах точек, инкапсулируя и повышая устойчивость функционала, востребованного в конкретный момент. Точки эволюций необходимо держать под контролем, но трата чрезмерного количества усилий на создание обобщенного и модифицируемого кода является расточительством.
В результате оптимального использования принципов шаблона "Устойчивый к изменениям" можно получить следующие преимущества:
- Легкость добавления новых расширений и вариаций.
- Возможность добавления новых реализаций.
- Слабое связывание.
- Минимизация влияния изменений.