Диаграммы компонентов системы
Диаграмма компонентов, в отличие от ранее рассмотренных, описывает особенности физического представления системы. Она позволяет определить архитектуру разрабатываемой системы. При этом в роли программных компонентов может выступать исходный, бинарный и исполняемый код. Во многих средах разработки модуль или компонент соответствует файлу.
Рассматриваемая диаграмма является одним из двух типов диаграмм реализации. Вторым служит диаграмма размещения, которая будет рассмотрена позднее.
Компонент (component) — физически существующая часть системы, которая обеспечивает реализацию классов и отношений.
Им могут быть исполняемый код отдельного модуля, командные файлы или файлы, содержащие интерпретируемые скрипты. В первой версии UML для графического представления компонента использовался специальный символ – прямоугольник со вставленными слева двумя более мелкими прямоугольниками. Внутри объемлющего прямоугольника записывается имя компонента и, возможно, дополнительная информация. Этот символ является базовым обозначением компонента в языке UML. В последней версии он размещается в виде иконки внутри прямоугольника, обозначающего компонент (см. рис. 6.34).
Рис. 6.34
Если компонент представляется на уровне типа, то в прямоугольнике записывается только имя типа с заглавной буквы в форме: <Имя типа> (см. рис. 6.35, а). Если же он представляется на уровне экземпляра, то его имя записывается в форме: <имя_компонента‘:' Имя типа> (см. рис. 6.35, б).
Рис 6.35
В языке UML выделяют три вида компонентов:
a) развертывания, которые обеспечивают непосредственное выполнение системой своих функций. Ими могут быть библиотеки с расширением dll, Web-страницы на языке разметки гипертекста с расширением html и файлы справки с расширением hlp;
b) рабочие продукты. Как правило, это файлы с исходными текстами программ, например, с расширениями h или срр для языка C++;
c) исполнения, представляющие собой исполняемые модули - файлы с расширением ехе.
Другим способом спецификации различных видов компонентов является явное указание его стереотипа (см. рис. 6.35, б). В языке UML для компонентов определены следующие стереотипы:
· библиотека (library) - определяет первую разновидность компонента, который представляется в форме библиотеки;
· таблица (table) - также определяет первую разновидность компонента, который представляется в форме таблицы базы данных;
· файл (file) - определяет вторую разновидность компонента, который представляется в виде файлов с исходными текстами программ;
· документ (document) - определяет вторую разновидность компонента, который представляется в форме документа;
· исполнимый (executable) — определяет третий вид компонента, который может исполняться в узле.
Существует несколько стандартных типов компонентов (стереотипов), которые имеют традиционные графические изображения. Это – библиотеки или файлы с исходными текстами программ или документами, изображения которых показаны на рис. 6.36.
Следующим графическим элементом диаграммы компонентов являются интерфейсы. В общем случае он изображается окружностью, которая соединяется с компонентом отрезком линии без стрелок (рис. 6.37, а). При этом имя интерфейса, которое рекомендуется начинать с заглавной буквы "I", записывается рядом с окружностью. Семантически линия означает реализацию интерфейса, а их наличие у компонента означает, что данный компонент реализует соответствующий набор интерфейсов.
Рис. 6.36
Рис. 6.37.Графическое изображение интерфейсов на диаграмме компонентов.
Кроме того, интерфейс на диаграмме компонентов может быть изображен в виде прямоугольника класса со стереотипом <<interface>> и секцией поддерживаемых операций (рис. 6.37, б). Как правило, этот вариант обозначения используется для представления внутренней структуры интерфейса.
Различают два способа связи интерфейса и компонента. Если компонент реализует некоторый интерфейс, то такой интерфейс называют экспортируемымили поддерживаемым. Если же компонент использует некоторый интерфейс, который реализуется другим компонентом, то такой интерфейс для первого компонентаназывается импортируемым. Особенность импортируемого интерфейса состоит в том, что на диаграмме компонентов это отношение изображается с помощью зависимости.
Отношение зависимости на диаграмме компонентов изображается пунктирной линией со стрелкой, направленной от клиента или зависимого элемента к источнику или независимому элементу модели. На этой же диаграмме может присутствовать и другой компонент, который реализует этот интерфейс. Отношение реализации интерфейса обозначается на диаграмме компонентов обычной линией без стрелки (см. рис. 6.38).
Рис.6.38.
Так, например, изображенный на рис. 4 фрагмент диаграммы компонентов представляет информацию о том, что компонент с именем Control зависит от импортируемого интерфейса IDialog, который, в свою очередь, реализуется компонентом с именем DataBase . При этом для второго компонента этот интерфейс является экспортируемым. Изобразить связь второго компонента DataBase с этим интерфейсом в форме зависимости нельзя, поскольку этот компонент реализует указанный интерфейс.
Другим случаем отношения зависимости на диаграмме компонентов является отношение программного вызова и компиляции между различными видами компонентов. Для рассмотренного фрагмента диаграммы компонентов (рис. 6.39) наличие подобной зависимости означает, что исполнимый компонент Control.exe использует или импортирует некоторую функциональность компонента Library.dll, вызывает страницу гипертекста Home.html и файл помощи Search.hlp, а исходный текст этого исполнимого компонента хранится в файле Control.cpp. При этом характер отдельных видов зависимостей может быть отмечен дополнительно с помощью текстовых стереотипов.
Рис. 6.39
На диаграмме компонентов могут быть также представлены отношения зависимости между компонентами и реализованными в них классами. Эта информация имеет значение для обеспечения согласования логического и физического представлений модели системы. На рис. 6.40 приведен фрагмент зависимости подобного рода, когда исполнимый компонент Control.exe зависит от соответствующих классов.
В этом случае из диаграммы компонентов не следует, что классы реализованы данным компонентом. Если требуется подчеркнуть, что некоторый компонент реализует отдельные классы, то для обозначения компонентa используется расширенный символ прямоугольника. который делится на две секции горизонтальной линией. Верхняя секция служит для записи имени компонентa и, возможно, дополнительной информации, а нижняя секция – для указания реализуемых данным компонентом классов (рис. 6.41).
Рис. 6.40.Графическое изображение зависимости между компонентом и классами.
Рис. 6.41. Графическое изображение компонента-экземпляра, реализующего отдельные объекты.
Пример диаграммы компонентов приведен на рис. 6.42.
Рис. 6.42
В этом примере компонент Till (Касса) может взаимодействовать с компонентом Sales Server (Сервер продаж)с помощью интерфейса sales message (Сообщение о продажах). Поскольку сеть ненадежна, то компонент Message Queue (Очередь сообщений) установлен так, чтобы касса могла общаться с сервером, когда сеть работает, и разговаривать с очередью сообщений, когда сеть отключена. Тогда очередь сообщений сможет поговорить с сервером, когда сеть снова станет доступной. В результате очередь сообщений предоставляет интерфейс для разговора с кассой, и требует такой же интерфейс для разговора с сервером. Сервер разделен на два основных компонента: Transaction Processor (Процессор транзакций) реализует интерфейс сообщений, а Accounting Driver (Драйвер счетов) общается с Accounting System (Система ведения счетов).