На этом шаге рассмотрим понятие образца в UML.
Все хорошо структурированные системы полны образцов (patterns). Образец предлагает типичное решение типичной проблемы в данном контексте. Механизм – это образец проектирования, применяемый к сообществу классов; каркас (framework) – это, как правило, архитектурный образец, предлагающий расширяемый шаблон для приложений в некоторой предметной области.
Образцы используются для специфицирования механизмов и каркасов, образующих архитектуру системы. Вы делаете образец доступным, ясно идентифицируя все элемнты, с помощью которых пользователь настраивает образец для применения его в определенном контексте.
Построение программных систем подчиняется некоторым принципам. Всякий раз, отрывая глаза от конкретных строк кода, вы обнаруживаете типичные механизмы, которые определяют способ организации классов и других абстракций. Например, в управляемой событиями системе применение образца проектирования, известного под именем "цепочка обязанностей", – это типичный способ организации обработчика событий. Если взглянуть чуть выше уровня этих механизмов, то вы увидите типичные каркасы, формирующие архитектуру всей системы. Например, в информационных системах применение трехслойной архитектуры – распространенный способ достижения четкого разделения обязанностей между пользовательским интерфейсом, хранением информации и бизнес-объектами и правилами.
В UML вам нередко придется моделировать образцы проектирования, также называемые механизмами, которые можно представить в виде коопераций. Аналогичным образом архитектурные образцы моделируются как каркасы, представляемые в виде пакетов со стереотипами. Для образцов обоих типов в UML предусмотрено особое графическое представление (см. рис. 1).
Рис.1. Механизмы и каркасы
Образец (pattern) – это общее решение типичной проблемы в данном контексте. Механизм – это образец проектирования, применимый к сообществу классов. Каркас (framework) – это архитектурный образец, предлагающий расширяемый шаблон для приложений в некоторой предметной области.
Занимаясь разработкой архитектуры новой системы или развитием существующей, вы в любом случае никогда не начинаете с нуля. Напротив, прежний опыт и соглашения наталкивают вас на применение типичных приемов решения типичных проблем. Например, при построении системы, активно взаимодействующей с пользователем, вы можете задействовать испытанный образец "модель–представление–контроллер" (model–view–controller), который позволяет четко отделить объекты (модель) от их внешнего представления и от агента, обеспечивающего их синхронизацию (контроллер). А при создании систем дешифровки проверенным способом организации системы окажется применение архитектуры "классной доски" (blackboard), хорошо приспособленной для решения сложных задач методом проб и ошибок.
То и другое представляет пример образца – типичного решения типичных задач в данном контексте. Любая хорошо структурированная система включает в себя множество образцов на различных уровнях абстракции. Образцы проектирования описывают структуру и поведение сообщества классов, а архитектурные образцы – структуру и поведение системы в целом.
Образцы входят в UML просто потому, что являются важной составляющей словаря разработчика. Явно выделяя их в системе, вы делаете ее более понятной и простой в сопровождении. Например, если вам дадут неизвестный исходный текст и попросят его модифицировать, вы потратите много времени, пытаясь догадаться, как его части связаны друг с другом. Вместе с тем, если вам дадут тот же текст и скажут, что перечисленные классы взаимодействуют на основе механизма "публикации-и-подписки" (publish-and-subscribe), вы получите гораздо более ясное представление о том, как все работает. Та же идея применима к системе в целом. Одна лишь фраза "система организована как набор конвейеров и фильтров" очень многое говорит о системной архитектуре – понять это, глядя на код классов, было бы куда сложнее.
Образцы помогают визуализировать, специфицировать, конструировать и документировать артефакты программной системы. Можно заниматься прямым проектированием системы, выбирая подходящий набор образцов и применяя их к абстракциям, специфичным для данной предметной области, или же обратным проектированием, выявляя содержащиеся в системе образцы (хотя вряд ли этот процесс можно назвать очень продуктивным). Впрочем, при поставке системы было бы еще лучше описать характерные для нее образцы, чтобы помочь тому, кому придется в будущем повторно использовать или модифицировать ваш код.
На практике интерес представляют только два вида образцов – образцы проектирования и каркасы. В UML предусмотрены средства моделирования и тех и других. При моделировании любого образца вы обнаружите, что он, как правило, является автономным в некотором большом пакете, если не считать зависимостей, связывающих этот образец с остальными частями системы.
На следующем шаге рассмотрим понятие образца проектирования в UML.