Опубликован: 12.10.2017 | Доступ: свободный | Студентов: 857 / 143 | Длительность: 07:43:00
Лекция 5:

Структурные шаблоны проектирования

< Лекция 4 || Лекция 5: 1234 || Лекция 6 >

Низкая связанность

Шаблон "Низкая связанность" воплощает принцип проектирования, который позволяет распределить обязанности между объектами таким образом, чтобы степень связанности между системами оставалась низкой.

Степень связанности – мера, определяющая, насколько жестко один элемент связан с другими элементами, либо каким количеством данных о других элементах он обладает.

Программный компонент с низкой степенью связанности зависит от не очень большого числа других системных элементов и имеет следующие свойства:

  • Малое число зависимостей между объектами в системе.
  • Слабая зависимость одной подсистемы от изменений в другом классе подсистемы.
  • Высокая степень повторного использования подсистем.

Следовательно, рассматриваемый паттерн используется, чтобы обеспечить низкую связанность при создании системных экземпляров и связывании их с другими. Суть шаблона "Низкая связанность" заключается в распределении обязанностей между объектами так, чтобы степень связанности оставалась на низком уровне.

Шаблон "Низкая связанность" позволяет избежать следующих проблем:

  • При изменении в связанных классах необходимо делать локальные изменения только в конкретном классе.
    • Это облегчает работу по внесению изменений.
  • Повторное использование становится возможным.
    • Применяя принцип низкой связности, общие, абстрактные классы остаются наиболее концептуальными и применимыми для последующего внедрения. Если поддаться соблазнам высокой связности, то это приведет к тому, что придется перетянуть часть бизнес-логики системы в конкретный класс, что усложнит его понимание и поддержку в последующем.

Приспособленец

Когда необходимо обеспечить поддержку множества мелких объектов, инициализированных и используемых в информационной системе, применяют структурный шаблон проектирования – "Приспособленец".

"Приспособленец"– это экземпляр объекта, который выдает себя за группу самостоятельных экземпляров.

Смысл использования шаблона "Приспособленец" состоит в моделировании сущности, число которых велико. Имеет смысл использовать данный паттерн, если одновременно выполняются следующие условия:

  • В приложении используется большое число объектов, что приводит к высоким системным затратам.
  • Большую часть состояния объектов можно вынести вовне оперативного использования:
    • Часть состояния объекта является контекстной и может быть легко вынесена во внешние структуры.
  • После вынесения части состояния все экземпляры становятся одинаковыми и это дает возможность заменить их одним.
  • Приложение не проверяет идентичность объектов, т.к. в этом случае все якобы самостоятельные экземпляры являются одним объектом.

Реализация шаблона выполняется за счет создания разделяемого объекта, который можно использовать одновременно в нескольких контекстах. В каждом контексте он должен выглядеть как независимый объект, то есть быть неотличимым от исходного экземпляра. Паттерн "Приспособленец" декларирует интерфейс, с помощью которого конкретные приспособленцы могут получить внешнее состояние или как-то воздействовать на него. Кроме прочего, экземпляр приспособленца хранит внутреннее состояние, в то время как внешнее состояние хранится или вычисляется использующими его процессами обработки.

Наличие различных вариантов внутреннего состояния приводит к необходимости создания набора приспособленцев. При запросе нового экземпляра выполняется поиск уже реализованного варианта. Если такого не находится, то порождается новый.

Таким образом, можно отметить следующих "участников" шаблона:

  • "Приспособленец".
  • "Пул или Фабрика приспособленцев" – объект, создающий и управляющий экземплярами приспособленцев.
  • "Неразделяемый объект" – экземпляр, существующий вне рамок шаблона.

Главным моментом при реализации шаблона является правильное разделение состояния объекта на внутреннее и внешнее. Именно возможность сделать это корректно и правильно является главным фактором применимости шаблона.

Очень важно, чтобы вынесенная информация вписывалась в абстракцию ее нового хранилища.

Некоторые объекты могут иметь много различных вариантов своих состояний. Это приведет к тому, что общее число объектов не сильно уменьшится. Тогда нужно рассмотреть следующий вариант:

  • Вынесенное состояние не сохраняется отдельно.
    • Рассчитывается непосредственно перед вызовом (шаблон "Компоновщик").

Шаблон "Приспособленец" часто используется совместно с шаблоном "Компоновщик" для уменьшения числа экземпляров частей составных объектов. Необходимо осознавать минус такого подхода, заключающегося в отсутствии части данных, которые могут быть востребованы в дальнейшем при организации бизнес-логики разрабатываемого приложения.

При разработке набора приспособленцев стоит продумать механизм определения и освобождения неиспользуемых экземпляров.

Результатами использования шаблона "Приспособленец" являются:

  • уменьшение количества экземпляров объектов, оперируемых в информационной системе;
  • оптимизация процесса управления этими объектами.

Устойчивый к изменениям

Варианты решения задачи реализации или поддержки системы, в которой изменение одних элементов не сильно затрагивало другие, мы начали обсуждать в разделе о шаблоне "Низкая связанность", но при этом затронули один из возможных аспектов, описанных в соответствующем шаблоне.

Задача модификации системы наиболее актуальна в условиях динамически изменяющихся требований. Зачастую удается выделить "места неустойчивости" системы, которые наиболее часто будут подвержены изменению. Тогда сущность шаблона "Устойчивый к изменениям" заключается в устранении подобных точек путем определения их в качестве интерфейсов и реализации для них различных функциональных вариантов. Основная цель состоит в распределении обязанностей продукта таким образом, чтобы обеспечить устойчивый интерфейс.

Термин "интерфейс" используется для обозначения способа обеспечения доступа.

Шаблон"Устойчивый к изменениям"описывает ключевой принцип, на основе которого реализуются механизмы,обеспечивающие гибкость и защиту системы от влияния изменений внешних систем.

Подобными механизмами являются:

  • инкапсуляция данных, универсальные интерфейсы;
  • проектирование на основе данных и пр.

Определившись со способом реализации, необходимо помнить о том, когда не следует применять данный паттерн.

Говоря об устойчивости программного обеспечения, следует выделить два типа точек:

  • Точки вариации:
    • Места"ветвления" в существующей на данный момент системе или в требованиях к ней– например, необходимость поддержки нескольких интерфейсов для системы вычисления налоговых платежей.
  • Точки эволюции:
    • Предполагаемые точки ветвления, которые могут возникнуть в будущем, однако не определяемые существующими требованиями.

Сосредоточиться стоит именно на первых типах точек, инкапсулируя и повышая устойчивость функционала, востребованного в конкретный момент. Точки эволюций необходимо держать под контролем, но трата чрезмерного количества усилий на создание обобщенного и модифицируемого кода является расточительством.

В результате оптимального использования принципов шаблона "Устойчивый к изменениям" можно получить следующие преимущества:

  • Легкость добавления новых расширений и вариаций.
  • Возможность добавления новых реализаций.
  • Слабое связывание.
    • Минимизация влияния изменений.
< Лекция 4 || Лекция 5: 1234 || Лекция 6 >