На этом шаге рассмотрим понятие порта в UML.
Интерфейсы удобны для описания общего поведения компонента, но им не присуща "индивидуальность": реализация компонента должна лишь гарантировать, что все операции во всех предоставляемых интерфейсах реализованы. Для более полного контроля над реализацией можно использовать порты.
Порт (port) – это своеобразное "окно" в инкапсулированный компонент. Все взаимодействие с таким компонентом на входе и на выходе происходит через порты. Выражаемое внешне поведение компонента представляет собой сумму его портов. Порт наделен уникальностью.
Один компонент может взаимодействовать с другим через определенный порт. При этом их коммуникации полностью описываются интерфейсами, которые поддерживает порт, даже если компонент поддерживает другие интерфейсы. В реализации внутренние части компонента могут взаимодействовать друг с другом через специфический внешний порт, поэтому каждая часть может быть независима от требований других. Порты позволяют разделять интерфейсы компонента на дискретные пакеты и использовать обособленно. Инкапсуляция и независимость, обеспечиваемая портами, повышают степень заменяемости компонента.
Порт схематически представлен маленьким квадратом на боковой грани компонента – это отверстие в границе инкапсуляции компонента. Как предоставляемый, так и требуемый интерфейс может быть соединен с символом порта. Предоставляемый интерфейс изображает сервис, который может быть запрошен извне через данный порт, а требуемый интерфейс – сервис, который порт должен получить от какого-либо другого компонента. У каждого порта есть имя, а следовательно, он может быть идентифицирован по компоненту и имени. Последнее могут использовать внутренние части компонента для идентификации порта, через который следует отправлять и получать сообщения. Имя компонента вместе с именем порта идентифицирует порт для использования его другими компонентами.
Порты – это часть компонента. Экземпляры портов создаются и уничтожаются вместе с экземпляром компонента, которому они принадлежат. Порты также могут иметь множественность; это означает возможность существования нескольких экземпляров порта внутри экземпляра компонента. Каждый порт компонента имеет соответствующий массив экземпляров. Хотя все экземпляры портов в массиве удовлетворяют одному и тому же интерфейсу и принимают запросы одних и тех же видов, они могут находиться в различных состояниях и иметь разные значения данных. Например, каждый экземпляр в массиве может иметь свой уровень приоритета (экземпляр порта с наибольшим уровнем приоритета обслуживается первым).
На рис. 1 представлена модель компонента Ticket Seller (Продавец билетов) с портами. У каждого порта есть имя и необязательный тип, показывающий, каково назначение данного порта.
Рис.1. Порты компонента
Компонент имеет порты для продажи билетов, объявлений и обслуживания кредитных карт. Есть два порта для продажи – один для обычных покупателей и один для привилегированных. Оба предоставляют один и тот же интерфейс типа Ticket Sales (Продажа билетов). Порт обслуживания кредитных карт имеет требуемый интерфейс; любой компонент, который его предоставляет, может удовлетворить егo. Порт объявлений имеет как предоставляемый, так и требуемый интерфейсы. Используя интерфейс Load Attractions (Информация о развлечениях), театр может передавать афиши и другую информацию о спектаклях в базу данных, используемую для продажи билетов. При помощи интерфейса Booking (Заказ) компонент – продавец билетов может запрашивать у театров сведения о наличии билетов и приобретать их.
На следующем шаге рассмотрим понятие внутренней структуры компонента в UML.