пятница, 13 февраля 2009 г.

Основные шаблоны проектирования.

В тексте будут использоваться следующие обозначения. A, B, C - классы (или объекты). (X), (Y) - действия, обязанности или методы. Рассматриваются следующие шаблоны:
  • Expert
  • Creator
  • Low Coupling
  • High Cohesion
  • Controller
  • Polymorphism
  • Pure Fabrication
  • Indirection
  • Protected Variations
Expert Шаблон Expert предполагает следующее: обязанность объекту назначается из способности объекта выполнить эту обязанность. Другими словами, когда встаёт вопрос "Кто должен предоставлять эти данные?", обязанность о предоставлении переходит к объекту, который имеет возможность их предоставить (имеет знания или имеет выход на объекты, которые помогут получить эти знания). Пример: А знает о В; необходимо произвести действие (X); если А имеет всю необходимую информацию для выполнения (X) (в том числе ту, которая содержится в подчинённом классе B), то он и будет его выполнять. Creator Паттерн Creator распределяет обязанности о создании объектов. A будет являться создателем экземпляров B в том случае, если подразумевается, что: он включает в свой состав экземпляры В; обращается к их методам. Нередко роль создателя отдаётся более высшему элементу по иерархии (например, клетка будет создателем попугайчиков). Low Coupling Шаблон Low Coupling исповедует принцип низкой степени связывания. Связывание определяется как знание класса о других классах (например, тех, которые являются его атрибутами). Чем меньше связан объект А с объектами {B, C...}, тем более податлив он. В обратном случае - создание супер-класса, обладающего знаниями о множестве других классах - возникает эффект зависимости (необходимо отслеживать изменения в подчинённых объектах) и неповоротливости (сложность расширения возможностей или перестраивания логики). Как это выглядит: объект А создаёт экземпляр класса В и добавляет этот экземпляр в хранилище С. В этом случае А должен знать о В и С. В одном случае он - создатель В, во другом он - эксперт С. Если, например, класс А делегирует С о создании экземпляра В, то он будет обладать меньшей степенью связывания. Цепочка будет: А делегирует С создание В; В создаёт С. High Cohesion Шаблон High Cohesion звучит как большая степень зацепления. Это значит, что объект должен стремиться к функциональной обособленности и узкой специализации. Необходимо избегать раздутых интерфейсов путём их дробления на малые интерфейсы. Правда существуют ситуации, когда в интерфейсах царит функциональный хаос и когда это оправданно. А оправданно это может быть лишь с точки доступности и лёгкости использования. При этом создаётся супер-интерфейс, в который включаются разнородные методы и свойства, но, поскольку они собраны в одном месте, для некоторых лиц это скорее достоинство. Данный шаблон связан с Low Coupling: необходимо стремится с одной стороны к функциональному разграничению обязанностей, а с другой - к такому распределению обязанностей, чтобы связывание оставалось на низком уровне. Controller Шаблон Controller подразумевает создание такого интерфейса (или класса), который сам не обрабатывает запросы, а делегирует их. Как правило, используется сценарный подход: под прецедент разрабатывается интерфейс, который включает все методы, необходимые для его выполнения. Например, контроллер может быть промежуточным слоем между интерфейсом пользователя и логическим уровнем программы. Сюда же может быть применим принцип High Cohesion. Polymorphism Нужно заложить основу - абстрактные классы и интерфейсы - на базе которой будет наращиваться весь функционал. Жёсткая логика (if-then-else) заменяется на логику реализаций. Что это даёт: каждая реализация уникальна, прорабатывается в соответствии с намерениями разработчика; изменение части кода программы не обязывает вносить исправления в других частях. Pure Fabrication Шаблон предполагает введение искусственного объекта, которые не является частью предметной области, но несёт вспомогательный функционал. Используется для повышения степени зацепления. Indirection Когда необходимо связать два класса, которые относятся к различным аспектам, то в этом случае используется шаблон Indirection. В самом простом случае шаблон может работать так: А знает о В (знает о интерфейсе), но не подозревает о С (реализации этого интерфейса); А делает запрос у В, а реализация С, проделав некоторые вычисления, возвращает результат А. Protected Variations Этот шаблон гласит: распоряжайся только своими знаниями, а к чужим не смей обращаться. Если объект А в числе своих атрибутов содержит В, который в свою очередь включает С, то А следует работать исключительно с В, но не лезть в дела С ("вассал моего вассала - не мой вассал"). Что это даёт: прыжки через головы вложенных зависимостей выходят боком при изменении логики программы. Если что-то поменяется, то не исключена переработка этой цепочки взаимодействия. Кроме того, такая ситуация своего рода повышение смыслового связывания, а оно как и простое недопустимо.

Комментариев нет: