Программирование >>  Разработка устойчивых систем 

1 ... 148 149 150 [ 151 ] 152 153 154 ... 196


Классификация паттернов

в БЧ описаны 23 паттерна, разделенных на три категории (в соответствии с выбором переменной составляюшей).

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

Структурные паттерны. Паттерны этой категории относятся к взаимодействиям между объектами, чтобы при изменениях в системе не приходилось модифицировать связи между объектами. Применение структурных паттернов часто обусловлено офаничениями проекта. Примеры - Посредник и Адаптер.

Поведенческие паттерны. Объекты, выполняюшие некоторые типы действий внутри программы. В них инкапсулируются такие процессы, как интерпретация языка, выполнение запроса, перебор элементов (как при использовании итераторов) или реализация алгоритма. В этой главе будут представлены поведенческие паттерны Команда, Шаблонный метод. Состояние, Стратегия, Цепочка ответственности. Наблюдатель, Множественная диспетчеризация и Посетитель.

Каждому из 23-х паттернов в БЧ посвящен специальный раздел с одним или несколькими примерами. Большинство примеров написано на С++, но иногда также встречается Smalltalk. Мы не будем повторять все подробности, приводимые в БЧ - эта книга заслуживает того, чтобы прочитать ее отдельно. Описания и примеры этой главы всего лишь дают начальное представление об паттернах, чтобы вы поняли, что такое паттерны и почему они так важны.

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

За последней информацией обращайтесь по адресу http: hillside.net/pattems.

Один из канонов экстремального программирования (ХР) гласит: Выберите самое простое решение, которое может работать . Иногда композиция радикально упрошает архитектуры, в которых кажется уместным наследование, а полученная архитектура становится более гибкой; вы убедитесь в этом, изучая некоторые из представленных паттернов. Итак, продумывая новую архитектуру, спросите себя: Так ли здесь необходимо наследование, что оно мне дает? Не упростится ли решение при использовании композиции?



Упрощение идиом

Прежде чем браться за более сложные вопросы, стоит рассмотреть некоторые базовые приемы, которые делают программу более простой и прямолинейной.

Посыльный

Самым тривиальным из этих приемов является прием, воплощенный в паттерне Посыльный (Messenger); вместо того, чтобы передавать разнородную информацию по частям, вы упаковываете ее в объекте. Так, в следующем примере применения Посыльного существенно упрощает код функции translate():

: C10:MessengerDemo.cpp linclude <iostreani> linclude <string> using namespace std:

class Point { Посыльный public: int X. y. z:

Point(int xi. int yi. int zi) : x(xi). y(yi). z(zi) {} Point(const Points p) : x(p.x). y(p.y). z(p.z) {} Points operator=(const Points rhs) {

X = rhs.x:

у = rhs.у:

z = rhs.z:

return *this:

friend ostreamS

operator (ostreamS os. const Points p) { return OS x= p.x у = p.у z= p.z:

class Vector { Математический вектор public:

Название предложено Биллом Веннерсом (Bill Venners); в других местах также встречаются другие названия.

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

Еще один неудачный пример встречается в языке Java: разработчики спецификации JavaBeans решили назвать простую схему выбора имен get/set паттерном проектирования (например, метод getInfo() возвращает свойство Info, а setInfo() изменяет его). Но речь идет всего лишь о распространенной схеме формирования имен, которая ни в коем случае не является паттерном.



int magnitude, direction:

Vector(int m. int d) : magnitude(m). direction(d) {}

class Space { public:

static Point translate(Point p. vector v) { Копирующий конструктор предотвращает модификацию оригинала. Фиктивные вычисления: р.х +- V.magnitude + v.direction: p.у += V.magnitude + v.direction p.z += V.magnitude + v.direction return p:

int mainO { Point pKl. 2. 3):

Point p2 = Space::translate(pi. Vector(11. 47)): cout pi: pi p2: p2 endl: } III:-

Пример намеренно упрощен, чтобы не отвлекать читателя от содержательной стороны дела.

Так как единственной задачей Посыльного является передача данных, ради упрощения доступа эти данные объявлены открытыми. Возможно, у вас найдзпгся причины для того, чтобы ограничить доступ к данным.

Накопитель

Накопитель (Collecting parameter) является старшим братом Посыльного. Он предназначен для сохранения информации из функции, которой он передается при вызове. Как правило. Накопитель поочередно передается нескольким функциям; он напоминает пчелу, которая перелетает с цветка на цветок и собирает пыльцу.

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

: СЮ:Col 1 ectingParameterDemo.срр linclude <iostream> linclude <string> linclude <vector> using namespace std:

class CollectingParameter : public vector<string> {}:

class Filler { public:

void f(CollectingParameter& cp) { cp.push back( accumulati ng );

void g(CollectingParameter& cp) { cp.push back( items );

void f(CollectingParameter& cp) { cp.push back( as we go ):



1 ... 148 149 150 [ 151 ] 152 153 154 ... 196

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика