2. Язык UML. Руководство пользователя. Буч_ Рамбо_ Якобсон (2-е издание) (2006) (1185732), страница 77
Текст из файла (страница 77)
Явно выделяя их в системе, выделаете ее более понятной и простой в сопровождении. Например,если вам дадут неизвестный исходный текст и попросят его модифицировать, вы потратите много времени, пытаясь догадаться, какего части связаны друг с другом. Вместе с тем, если вам дадут тот жетекст и скажут, что перечисленные классы взаимодействуют на основе механизма «публикацииFиFподписки» (publishFandFsubscribe),вы получите гораздо более ясное представление о том, как все работает. Та же идея применима к системе в целом. Одна лишь фраза«система организована как набор конвейеров и фильтров» оченьмногое говорит о системной архитектуре – понять это, глядя на кодклассов, было бы куда сложнее.Образцы и каркасы404Образцы помогают визуализировать, специфицировать, конструировать и документировать артефакты программной системы.
Можно заниматься прямым проектированием системы, выбирая подходящий набор образцов и применяя их к абстракциям, специфичнымдля данной предметной области, или же обратным проектированием, выявляя содержащиеся в системе образцы (хотя вряд ли этотпроцесс можно назвать очень продуктивным). Впрочем, при поставке системы было бы еще лучше описать характерные для нееобразцы, чтобы помочь тому, кому придется в будущем повторноиспользовать или модифицировать ваш код.На практике интерес представляют только два вида образцов –образцы проектирования и каркасы. В UML предусмотрены средства моделирования и тех и других. При моделировании любогообразца вы обнаружите, что он, как правило, является автономнымв некотором большом пакете, если не считать зависимостей, связывающих этот образец с остальными частями системы.Базовые понятияШаблонныеклассырассматриваютсяв главе 9.405некоторого типичного поведения, представляющего интерес.
Такиемеханизмы моделируются в виде параметризованных коопераций,которые изображаются в UML подобно шаблонным классам. Еслираскрыть такую кооперацию, можно увидеть ее структурные и поведенческие аспекты. Если свернуть ее, то можно увидеть, как образец применяется к системе, связывая шаблонные части кооперациис существующими абстракциями системы.
При моделировании механизма в виде параметризированной кооперации вы описываетевсе эти «вилки», «розетки», «кнопки» и «циферблаты», с помощьюкоторых можно адаптировать образец, меняя значение его параметров. Подобные кооперации могут появляться в разных частяхсистемы и связываться с различными абстракциями.
В приведенном примере классы образца Subject (Субъект) и Observer (Наблюдатель) связаны с конкретными классами CallQueue (ОчередьЗадач)и SlideBar (Ползунок) соответственно.параметрышаблонаопределение образцаМеханизмыМеханизм – это образец проектирования, примененный к сообществу классов. Например, существует типичная проблема проектирования, с которой сталкивается программист, пишущий на языкеJava: как изменить класс, который умеет реагировать на некотороемножество событий, таким образом, чтобы он реагировал на события иного рода, не затрагивая исходного кода этого класса? Типичное решение проблемы – применение образца адаптера (adaptorpattern), структурного образца проектирования, который конвертирует один интерфейс в другой.
Этот образец является настолькообщим, что имеет смысл дать ему название, а затем использоватьв моделях всякий раз, когда возникает аналогичная проблема.При моделировании механизмы проявляют себя двойственно.ВоFпервых, как было показано на рис. 29.1, механизм простоКооперацииобсуждают- именует набор абстракций, работающих вместе для реализации тися в главе 28 пичного поведения, представляющего некоторый интерес. Такиемеханизмы моделируются как простые кооперации, поскольку ониявляются всего лишь именами для сообщества классов. Раскрывтакую кооперацию, можно увидеть ее структурные аспекты (обычно изображаемые на диаграмме классов), а также поведенческиеаспекты (обычно изображаемые на диаграммах взаимодействия).Кооперации подобного типа охватывают разные уровни абстракции системы, то есть какойFто конкретный класс, вероятно, будетучаствовать в нескольких кооперациях.ВоFвторых, как показано на рис.
29.2, механизм именует шаблондля набора абстракций, работающих совместно для обеспеченияObserverPatternSubject,Observerпараметрыsubject: Subjectкооперацияobserver: Observernotify()getState()update()роликооперацииаргументCallQueueаргументсвязывание образцаObserverSubjectObserverPatternqueue:CallListрасширениеCallQueuequeue:CallListnotify()getState()subjectSliderBarreading:Realcolor:Colorrange:IntervalSliderBarobserver reading:Realcolor:Colorrange:Intervalupdate()Рис. 29.2. МеханизмыОбразцы и каркасы406На заметку.
Решение о моделировании механизма в видепростой или параметризованной кооперации достаточноочевидно. Если нужно просто именовать сообщество совместно работающих классов в системе, следует применитьпростую кооперацию. Если же необходимо абстрагироватьсущественные структурные и поведенческие аспекты механизма способом, не зависящим от конкретной предметнойобласти, а затем связать их с абстракциями в данном контексте, следует применять параметризованную кооперацию.Типичные приемы моделирования«407»КаркасыПять представленийархитектуры обсуждаютсяв главе 2.Пакетырассматриваютсяв главе 12,стереотипы –в главе 6.Событияобсуждаютсяв главе 21.Каркас (framework) – это архитектурный образец, предлагающий расширяемый шаблон для приложений в некоторой предметной области. Например, в системах реального времени часто можно встретить архитектурный образец «циклический исполнитель»(cyclic executive), который разделяет время на кадры и подкадры,где обработка происходит в строгих временных рамках.
Выбор этого образца вместо управляемой событиями архитектуры оказываетвлияние на всю систему. Данный образец (как и его альтернатива)является настолько общим, что имеет смысл назвать его каркасом.Каркас – это нечто большее, чем механизм. Фактически можносчитать каркас разновидностью микроархитектуры, включающейв себя множество механизмов, совместно работающих над решением типичной проблемы для типичной предметной области. Специфицируя каркас, вы тем самым описываете «скелет» архитектурывместе со всеми ее органами управления, которые применяютсяпользователем для адаптации к нужному контексту.В UML каркас моделируется в виде пакета со стереотипом.
Заглянув внутрь этого пакета, можно увидеть механизмы, существующие в любом из представлений системной архитектуры. Например, там обнаружатся не только параметризованные кооперации,но также варианты использования (которые объясняют, как надоработать с этим каркасом), а также простые кооперации (представляющие набор абстракций, на базе которых можно строитьсистему, – например, путем порождения классовFпотомков).Рис. 29.3 показывает такой каркас, названный CyclicExecutive(ЦиклическийИсполнитель).
Помимо прочего, этот каркас включает кооперацию CommonEvents (ОбщиеСобытия), охватывающую множество классов событий, и механизм EventHandler (ОбработчикСобытий), предназначенный для циклической обработки событий.Клиент, построенный на базе этого каркаса, – к примеру, Pacemaker(СердечныйСтимулятор), – может пользоваться абстракциями изкооперации CommonEvents путем порождения производных классов,а также применять механизм EventHandler.Рис.
29.3. КаркасыНа заметку. Каркасы отличаются от обычных библиотек классов. Библиотека классов содержит абстракции, конкретизируемые или вызываемые другими абстракциями программы.Каркас же содержит абстракции, которые сами вызываютили конкретизируют другие абстракции. Оба вида соединений образуют те самые «вилки», «розетки», «кнопки» и «циферблаты», посредством которых каркас настраивается на используемый вами контекст.Типичные приемы моделированияМоделирование образцов проектированияВ числе прочего образцы используются для моделирования типичных ситуаций, возникающих при проектировании. При моделировании подобного механизма следует принимать во внимание еговнутренний и внешний вид.При взгляде снаружи образец проектирования изображаетсяв виде параметризованной кооперации.
Будучи кооперацией, образец представляет собой набор абстракций, структура и поведениекоторых призваны в ходе совместной работы выполнить некоторуюполезную функцию. Параметры кооперации именуют те элементы, которые пользователь образца должен с чемFто связать. Такимобразом, образец проектирования превращается в шаблон, которыйиспользуется в конкретном контексте путем подстановки элементов, соответствующих параметрам шаблона.Образцы и каркасы408При взгляде изнутри образец проектирования представляетсяпростой кооперацией и отображается со своими структурной и поведенческой составляющими. Обычно кооперация моделируетсяс помощью диаграмм классов (для структурной составляющей)и диаграмм взаимодействий (для поведенческой составляющей).Параметры кооперации именуют некоторые из структурных элементов, которые при связывании с какимFто определенным контекстом конкретизируются абстракциями из этого контекста.Чтобы смоделировать образец проектирования, необходимо: Идентифицировать типичное решение типичной проблемыПрименениеи материализовать его в виде механизма.коопераций Смоделировать механизм как кооперацию, описав ее струкдля модетурный и поведенческий аспекты.лирования Идентифицировать те элементы образца проектирования,механизмовкоторые должны быть связаны с элементами в конкретномобсуждаетконтексте, и отобразить их в виде параметров кооперации.ся в главе 28.В качестве примера на рис.