Открытая коллекция знаний

OpenU.Ru

Справочник UML. Объектно-ориентированное проектирование.

component (компонент)

Физическая заменяемая часть системы, обеспечивающая реализацию ряда интерфейсов.

Семантика

Компонент представляет собой часть физической реализации системы. Сюда же относятся программный код (исходный, бинарный, выполнимый) или его эквиваленты - сценарии и командные файлы. Некоторые компоненты обладают индивидуальностью. Им могут принадлежать физические сущности, к которым относятся объекты времени выполнения, документы, базы данных и т. д. Предметная область компонентов относится к реализации. Они представляют собой физические блоки, которые можно соединять с другими компонентами, заменять, перемещать, архивировать и т. п. Модель может отображать зависимости между компонентами - например, зависимости между компилятором и выполнимыми модулями. С помощью экземпляра компонента можно изобразить блоки реализации, существующие во время выполнения, включая место расположение этих блоков на узлах.
У компонентов есть два аспекта. Они содержат программный код, с помощью которого реализуется функциональность системы. Некоторые из них содержат объекты, которые составляют состояние системы. Такие компоненты мы называем компонентами индивидуальности, так как их экземпляры обладают индивидуальностью и состоянием. Ниже мы рассмотрим оба эти аспекта более подробно.
Программный код. В компоненте содержится программный код для классов реализации и прочих элементов. (В данном случае в понятие кода входят сценарии, гипертекстовые структуры и другие формы выполнимых единиц.) Компонент исходного кода представляет собой хранилище исходного кода для классов реализации. В некоторых языках программирования (например, в C++) файлы объявлений отличаются от файлов методов, однако и те и другие являются компонентами. В компоненте бинарного кода содержится компилированный код. Библиотека бинарного кода тоже является компонентом. Выполняемый компонент хранит в себе выполнимый код.
Каждый из этих видов компонентов содержит в себе некий код для классов реализации, которые реализуют определенные логические классы и интерфейсы. Отношение реализации соединяет компонент с логическими классами и интерфейсами, реализуемые классами реализации этого компонента.
Интерфейсы компонента описывают функциональность, которую он поддерживает. Каждая операция интерфейса должна соотноситься с элементом реализации в компоненте.
Статическую выполнимую структуру реализации системы можно представить в виде ряда взаимосвязанных компонентов. Зависимости между компонентами означают, что элементам реализации одного компонента требуются элементы реализации других компонентов. При этом необходимо, чтобы поставщики обладали открытой видимостью внутри своих компонентов. У компонента могут существовать и закрытые элементы, однако они не могут быть прямыми поставщиками для прочих компонентов.
Компоненты могут содержать в себе другие компоненты. Такие вложенные компоненты будут представлять собой еще один элемент реализации в своем компоненте-контейнере.
Под экземпляром компонента понимается конкретный экземпляр компонента, расположенный на конкретном экземпляре узла. Экземпляры компонентов исходного кода и бинарного кода могут размещаться на отдельных узлах, однако наибольшую важность представляют выполнимые компоненты. Если выполнимый компонент размещен на узле, то объекты классов реализации, которые поддерживаются этим компонентом, могут осуществлять свои операции на этом узле, В противном случае (если соответствующий выполнимый компонент отсутствует), объект не может выполнять операции и должен быть перемещен или скопирован на другой экземпляр узла.
Если у компонента отсутствует индивидуальность, то все его экземпляры одинаковы, и поддерживать выполнение рабочего объекта может любой из них. Все они будут вести себя одинаково. Если у компонента нет индивидуальности, у него также не может быть внутреннего значения или состояния.
Индивидуальность. У компонента индивидуальности есть и индивидуальность, и состояние; ему принадлежат физические объекты, которые в нем расположены (а следовательно, и на экземпляре узла, содержащего этот компонент). У такого компонента могут быть атрибуты, композиционные отношения с принадлежащими ему объектами и ассоциации с другими компонентами. С такой точки зрения компонент является классом. Однако все его состояния должны отображаться на те экземпляры, которыми он владеет. Именно это и отличает компонент от обычного класса. Часто класс реализации представляет весь компонент целиком. Такой класс называют доминантным классом и нередко приравнивают к компоненту, хотя это не одно и то же.
Объект, который запрашивает услуги у компонента индивидуальности, должен определять при этом конкретный экземпляр этого компонента. Как правило, это достигается с помощью ассоциации с одним из объектов, принадлежащих компоненту. Поскольку у компонента индивидуальности есть состояние, то запрос, обращённый к различным экземплярам такого компонента, может дать разные результаты.

Пример

Компонентом может быть, например, блок орфографической проверки. Если у него есть фиксированный словарь, то его можно моделировать как компонент, не имеющий индивидуальности. Все экземпляры такого блока будут выдавать одни и те же результаты. При этом запросы не будут заноситься в его память. Если же словарь такого блока можно менять, то он должен быть смоделирован в виде компонента с индивидуальностью. У словаря может существовать несколько версий, каждая из которых будет соответствовать различным экземплярам компонента блока орфографической проверки. Инициатор запроса должен обращаться к определенному экземпляру компонента. Зачастую целевой компонент в данном контексте неочевиден, однако это решается с помощью средств проектирования.

Структура

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

Нотация

Компонент изображается на диаграмме в виде прямоугольника, в одну из сторон которого врезаны два прямоугольника поменьше. Имя типа компонента указываемся внутри большого прямоугольника (РИС. 60).

У экземпляра компонента есть свое собственное имя, которое отделяется от имени типа двоеточием. Чтобы строку имени можно было отличить от типа компонента, ее нужно подчеркивать (рис. 61).
Символ экземпляра компонента можно изобразить внутри символа узла. Этим можно сразу дать понять, где расположен экземпляр компонента (рис. 62). Если у компонента нет индивидуальности, то имена экземпляров, как правило, не пишутся. Объекты, которые принадлежат компоненту индивидуальности, можно изобразить внутри символа компонента. Компонент, у которого есть атрибуты или объекты, автоматически считается компонентом индивидуальности.

Рис. 61. Компонент индивидуальности и расположенные в нем объекты

Рис. 62. Экземпляры компонента, расположенные на узле
Доминантный класс относится к интерфейсам компонента. Его можно изображать с помощью символа класса, в верхнем правом углу которого находится символ компонента (пиктограмма стереотипа).
В таком случае компонент и его доминантный класс имеют один и тот же интерфейс. При этом доминантный класс по композиционным связям имеет доступ к любым объектам, содержащимся в компоненте. Пример можно найти на рис. 63.

Рис. 63. Доминантный класс компонента
Доступные внешним объектам операции и интерфейсы можно изображать прямо в импак54символе класса. Этим поведение компонента напоминает поведение класса. Содержимое подсистемы изображается на отдельной диаграмме. Если вы не хотите показывать какой-либо аспект подсистемы, допускающий создание экземпляров, то лучше использовать обычную нотацию пакета.

Рис. 64. Зависимости между конпонентами
Зависимости, существующие между компонентами или компонентом и другими элементами модели, изображаются с помощью пунктирных линий. Стрелки на полюсах этих линий указывают на поставщика (рис. 64). Если компонент представляет собой реализацию интерфейса, можно использовать сокращенную нотацию. Для этого около символа компонента ставится полый кружок, который соединяется с компонентом непрерывной линией. Понятие "реализация интерфейса" означает, что элементы реализации, содержащиеся в компоненте, по меньшей мере, поддерживают все операции этого компонента. Если же компонент использует интерфейс другого компонента то эта зависимость изображается пунктирной линией со стрелкой на конце, которая будет указывать на символ интерфейса. Под "использованием интерфейса" мы понимаем, что элементы реализации в компоненте запрашивают у компонента-поставщика не больше операций, чем перечислено в интерфейсе (при этом компонент-клиент может зависеть также и от других интерфейсов).

Обсуждение

Ниже мы даем расширенные определения компонента, которые описывают его суть, а также соображения, по которым можно решить, является ли часть системы отдельным компонентом или нет.
o Компонент неочевиден. Он представляет собой нечто большее, нежели отдельный класс или строка программного кода, как с функциональной, так и с концептуальной точки зрения. Как правило, компонент реализует структуру и поведение кооперации классов.
o Компонент практически независим от других компонентов, и в то же время он редко существует в изоляции. Скорее можно сказать, что компонент взаимодействует с другими компонентами в рамках архитектурного контекста системы.
o Компонент - это заменяемая часть системы. Его можно заменить на другой, соответствующий тем же интерфейсам. Как правило, механизм установки и замены компонента при формировании действующей системы ясен пользователю компонента, снабженному моделями объектов. Пользователь может действовать с помощью средств, которые полностью автоматизируют процесс.
o Компонент имеет четкую функциональность и обладает логической и физической цельностью. Он представляет собой значимую структурную и / или поведенчсскую часть всей системы.
o Компонент существует в контексте хорошо определенной архитектуры. Он представляет собой фундаментальный строительный блок, с помощью которого можно проектировать и формировать систему. Данное определение рекурсивно - система, находящаяся на одном из уровней абстракции, вполне может быть компонентом на более высоком её уровне.
o Компонент никогда не функционирует в изоляции. Существование каждого компонента подразумевает наличие некоторого архитектурного и технологического контекста, в котором он должен использоваться.
o Компонент соответствует определенному множеству интерфейсов. Когда компонент соответствует интерфейсу, он соответствует также и контракту, который определяется этим интерфейсом, и может быть замещен в любом из контекстов, в которых применяется интерфейс.
Стандартные элементы
document (документ), executable (выполнимый), file,(файл), library(библиотека), location (месторасположение), table (таблица).

Алфавитный указатель