некоторый интерфейс, если ему предоставить уникальное имя.
Это замечание показывает, что, в наиболее общем случае, компонент может
иметь реализации с большей функциональностью, чем того требуют явным образом
определенные и описанные интерфейсы. А это, в свою очередь, означает, что
реализации компонента могут носить избыточный характер, т.е. к компоненту
может прибавляться новая функциональность со следующим определением для
интерфейса (обратное замечание не верно).
Если к компоненту добавляют новый интерфейс, то он обязательно должен
иметь реализацию. Это и есть одно из следствий ограничения целостности.
Среди множества компонентов существует особый компонент, для которого
CInt =
и CImp =
, то есть множества интерфейсов и реализаций – суть пустые
множества. Пусть нулевым компонентом или шаблоном компонента является
TComp = (Template,
,CFact,
,CServ). (6.9)
Условие целостности компонента (6.5) выполняется и для шаблона. Множество
входных интерфейсов пустое и независимое от наличия или отсутствия в нем
реализаций выражения (6.4), которое имеет истинное значение.
Представлениеэтого компонента фактически служит основой средств
автоматизации создания компонентов, при применении которых разработчик
может, в основном, сосредоточиться на интерфейсах и функциональности
будущего компонента, функции же управления экземплярами, взаимодействие с
системными сервисами, оформление компонента как целостной структуры
включаются автоматически.
Пусть OldComp определяет базовый компонент для применения операций, а
NewComp соответствует полученному компоненту после выполнения операций
OldComp = (OldCName,OldCInt,CFact,OldCImp,CServ),
NewComp = (NewCName,NewCInt,CFact,NewCImp,CServ).
Определим операцию добавления новой реализации. Особенность этой
операции состоит в том, что множество интерфейсов компонентов может
расширяться за счет добавления новых исходных интерфейсов, если реализация,
которая прибавляется, требует дополнительной функциональности и
предоставляется другим компонентам. Обозначим NewCIntO
s
= {NewCIntO
sq
} –
дополнительное множество исходных интерфейсов. В частном случае, NewCIntO
s
=
, если дополнительная функциональность при реализации, не добавляется.
Операция добавления реализаций. Выше отмечалось, что существует две
разновидности данной операции – это добавление операции для существующего
интерфейса и для нового, что формально еще не определено.
Первая операция AddOImp имеет следующую форму записи
NewComp = AddOImp(OldComp, NewCImp
s
, NewCIntO
s
), (6.10)
и семантику
NewCInt = OldCInt
NewCIntO
s
,
NewCImp = OldCImp
{ NewCImp
s
},
(
OldCInt
t
OldCInt ) Provide(OldCInt
t
)
NewCImp
s
,
где NewCImp
s
– реализация, которая добавляется; OldCInt
t
– множество входных
интерфейсов с OldCInt.
Такая операция ассоциативна и коммутативна. Условие целостности
компонента (6.6) выполняется автоматически, так как множество входных
интерфейсов остается неизменным и из целостности старого компонента вытекает