1.2 Мир шаблонов
За последние пару лет шаблоны стали одной из самых горячих тем в объектном сообществе. Они быстро становятся передовым увлечением, вызывая огромный интерес и присущую этому шумиху. Мы также наблюдаем внутреннюю борьбу за определение важных тем для сообщества, включая многочисленные споры о том, что именно представляет собой шаблон. Конечно, трудно найти какое-либо общее определение шаблона.
Корни исследования паттернов берут начало из разных источников. В последние годы все больше людей чувствовали, что мир программирования не очень хорош в описании и распространении хороших практик проектирования. Методологий было много, но они определяли язык для описания дизайна, а не описывали реальный дизайн. Существовала (и до сих пор существует) нехватка технических документов, описывающих полезные дизайн-решения основанные на практике, которые можно было бы использовать для обучения и вдохновения. Как выразились Ральф Джонсон и Уорд Каннингем: «Проекты проваливаются, несмотря на новейшие технологии, из-за отсутствия обычных решений» [4],
Шаблоны появились в результате нескольких инициатив. Кент Бек и Уорд Каннингэм, два пионера Smalltalk, познакомились с идеями Кристофера Александера (Christopher Alexander), который разработал теорию и коллекцию паттернов в архитектуре. Брюс Андерсон проводил семинары в OOPSLA в начале 1990-х годов, на которых рассматривалась возможность создания руководства для архитекторов программного обеспечения. В книге Джима Коплиена по C++ [3] описывались идиомы, полезные в C++. Некоторые из этих людей сформировали группу Hillside Group для дальнейшего изучения этих идей.
Широкая общественность узнала об этом движении благодаря публикации основополагающей книги «Банды четырех» [6] и конференции PLoP, начатой группой Hillside в 1994 году [4].
У меня практически не было контактов с этим растущим сообществом. Я давно хотел прочитать книги, описывающие концептуальные модели, потому что чувствовал, что такие книги дадут мне хорошие идеи. У меня не было уверенности, что смогу писать о таких вещах, пока не соберу достаточно моделей для создания стоящей книги. Я заинтересовался сообществом шаблонов и нашел многие из их принципов привлекательными, но меня отталкивало кликушество группы, их одержимость Кристофером Александером и очень формализованным описанием паттернов. За последний год я стал больше общаться с ними и посетил второй PLoP. Наиболее заметным аспектом сообщества шаблонов является то, что это довольно разнообразная группа. Да, есть те, кто относится к работам Александера как к священному тексту, с альтернативными интерпретациями, о которых можно спорить. Есть и те, кто отвергает Александера как не имеющего отношения к делу. Есть те, кто видит в шаблонах мистическую силу, и те, кто не выносит «трогательных» аспектов шаблонов. Есть те, кто видит в паттернах переворот методов анализа и проектирования, те, кто считает концептуальное моделирование пустой тратой времени, и те, кто побудил меня выпустить эту книгу, чтобы показать, какими могут быть аналитические (или концептуальные) шаблоны.
Идея шаблонов не ограничивается объектно-ориентированным сообществом; Дэвид Хэй написал ценную книгу о паттернах моделей данных [7]. Модели следуют стилю реляционного моделирования данных, но это очень концептуальные модели. Это делает модели ценными, даже если вы используете объектную технологию.
1.2.1 Кристофер Александр
Для многих людей слово «паттерн» появилось в разработке ПО практически полностью благодаря работам Кристофера Александера, профессора архитектуры Калифорнийского университета в Беркли. Александер разработал ряд теорий о паттернах в архитектуре и опубликовал их в серии книг. Его книга «Язык паттернов» [1], каталог паттернов в архитектуре, рассматривается как прототип книг о шаблонах в программном обеспечении. Его стиль описания паттернов в той или иной степени используется многими авторами шаблонов. Его фраза «качество [характеристика] без названия» часто цитируется как атрибут, которым должны обладать все хорошие паттерны.
Многие, однако, отрицают центральную роль Александера как вдохновителя программных шаблонов. Питер Коад (Peter Coad) отмечает, что понятие паттернов используется многими авторами в других областях, многие из которых, по его мнению, являются лучшими примерами, чем даёт Александер. Многие ставят под сомнение авторитет Александера в архитектурной профессии: его идеи отнюдь не являются общепризнанными. Книга «Банда четырех» оказала гораздо большее влияние на паттерны ПО, чем работа Александера, и трое из этих четырех авторов не читали Александера до написания своей книги.
1.2.2 Литературная форма
Одна из самых характерных особенностей написания паттернов — это форма, в которой они записываются. Часто паттерны пишутся в определенном формате. Однако единого формата не существует, что подтверждает беглый взгляд на работы PLoP. Многие вдохновляются стилем Александера, другие следуют формату из «Банды четырех».
Обычно говорят, что паттерн, как бы он ни был написан, состоит из четырех основных частей: изложение контекста, в котором паттерн полезен, проблемы, которую паттерн решает, сил, участвующих в формировании решения, и решения, упорядочивающего эти силы. Эта форма встречается как с конкретными заголовками, так и без них, но лежит в основе многих опубликованных паттернов. Это важная форма, потому что она поддерживает определение паттерна как «решения проблемы в контексте», что задаёт границы паттерна одной парой «проблема-решение».
Для многих людей использование фиксированного формата, будь то «банда четырех» или форма «контекст-проблема-силы-решение», является одним из определяющих признаков шаблона. Использование общепринятой формы шаблона явно отличает его от обычного технического изложения.
Однако фиксированная форма имеет свои недостатки. В этой книге, например, я не обнаружил, что пара «проблема-решение» всегда является хорошей единицей для паттерна. Несколько паттернов в этой книге показывают, как одна и та же проблема может быть решена более чем одним способом, в зависимости от различных компромиссов. Хотя это всегда можно выразить в виде отдельных паттернов для каждого решения, идея обсуждения нескольких решений вместе кажется мне не менее элегантной, чем обычная практика описания паттернов. Конечно, содержание форм шаблонов имеет большой смысл — любой технический текст обычно включает контекст, проблему, силы и решение. Но вот превращает ли это каждый технический текст в паттерн — это уже другой вопрос.
Один из принципов формирования шаблонов, с которым я безоговорочно согласен, заключается в том, что они должны иметь название. Одно из преимуществ работы с паттернами заключается в том, как они могут обогатить словарь разработки. Просто сказав «используйте здесь прокси для защиты или «мы использовали наблюдения для записи метрик продукта», мы можем очень эффективно передать наши идеи дизайна ПО. Опять же, в паттернах нет ничего уникального; это обычная практика для технического описания — придумывать новые термины для понятий, но поиск паттернов поощряет этот процесс.
1.2.3 Авторский уровень абстракции
Для многих людей, занимающихся шаблонами, одним из ключевых элементов паттернов является то, что они открываются путем наблюдения за тем, что происходит в повседневной работе, а не путем академического изобретения. Этот элемент я считаю особенно важным. Все паттерны в этой книге являются результатом одного или нескольких реальных проектов и описывают полезные практические находки.
Для этой книги я выбрал те паттерны, которые, по моему мнению, могут быть полезны другим разработчикам. Эти паттерны полезны не только для разработчиков в той же области, что и паттерн, но часто он полезен и в других областях. Хорошим примером этого является паттерн портфолио (см. раздел 9.2). Изначально этот паттерн был создан как способ группировки финансовых контрактов. Его можно использовать для группировки объектов любого типа, определив неявный запрос, и он достаточно абстрактен, чтобы его можно было использовать в любой области. Я убедился в этом на собственном опыте: После того как были написаны первые черновики этой книги, мы использовали этот шаблон в нескольких местах в другом проекте, совершенно независимом от трейдинга.
Передо мной стоит вопрос, насколько широкой должна быть эта абстракция. Если я натыкаюсь на паттерн, который, как мне кажется, может быть полезен в большем количестве областей, чем изначальная, насколько абстрактным я должен сделать этот паттерн? Проблема с абстрагированием шаблона за пределы его первоначальной области заключается в том, что я не могу быть так же уверен в его валидности. Проект, в котором появился паттерн, проверил его на прочность путем долгих обсуждений, внедрения и (прежде всего) знаний экспертов домена. Как только я абстрагируюсь дальше, я оставляю эти безопасные гавани позади и гадаю, как мое открытие поведет себя в открытом море. Там много неизвестных. Поэтому мое мнение (которое, похоже, разделяют многие специалисты по паттернам) заключается в том, что вы сами должны определить, полезен ли паттерн для вашей области, которую вы знаете бесконечно лучше, чем я. Или у вас есть доступ к соответствующим экспертам в этой области, которые могут помочь с определением валидности. В этой книге я использую примеры, чтобы показать более широкую применимость паттерна. Любой пример, выходящий за рамки первоначальной области применения паттерна, является условным, но он нужен для того, чтобы разжечь ваше воображение и заставить вас задаться вопросом: «Полезно ли это для меня?».