Теперь предположим, что нам необходима сущность
x : expanded C
Эта нотация использует новое ключевое слово expanded (развернутый). Нотация expanded
Таким образом, к структуре, определенной в предыдущих разделах, добавлено понятие составного объекта (composite object). Объект
class COMPOSITE feature
ref: C
sub: expanded C
end
Класс
Рис. 8.19. Составной объект с одним подобъектом
Поле
Удобно несколько расширить нотацию. Иногда при проектировании класса, например
expanded class E feature
... Далее все аналогично любому другому классу ...
end
Так определенный класс называется развернутым классом. Такое объявление класса никак не отражается на экземплярах класса, они остаются такими же, как если бы класс был объявлен просто
Определение: развернутый тип
Тип является развернутым в двух случаях:
Он задан в форме: expanded
Он задан в форме
Объявление вида
x: expanded E
где
x: E
Таким образом, имеется два вида типов. Тип, не являющийся развернутым, является ссылочным типом. Эту терминологию можно использовать и для сущностей - ссылочные сущности и развернутые сущности. Аналогично и классы могут быть ссылочными и развернутыми.
Роль развернутых типов
Почему нам нужны развернутые типы? Они играют три важные роли:
[x]. улучшают эффективность;
[x]. обеспечивают лучшее моделирование;
[x]. поддерживают базисные типы в унифицированной ОО-системе типов.
Первое применение наиболее очевидно: без развернутых типов каждый раз необходимо использовать ссылки для описания составных объектов. Это означало бы при каждом обращении к подобъекту выполнения операции, называемой "разыменование" (dereferencing), что влекло бы к временным потерям. Помимо этого, есть и потери в памяти, поскольку нужно отводить память не только объектам, но и самим ссылкам.
Аргумент производительности, однако, не является ключевым. ОО-конструирование ПО зачастую рассматривается как моделирование. Для отражения реальности необходимо моделировать объект как составной, а не как объект со ссылками. Это концептуальная проблема, а не проблема реализации.
Рассмотрим два объявления атрибутов:
D1. ref: S
D2. exp: expanded S
Объявления появляются в классе
Отношение "содержит", поддерживаемое развернутыми типами, не допускает никакого разделения встроенного объекта, в то время как отношение "знает о" допускает несколько ссылок, присоединенных к объекту.
Вот пример объявления класса:
class WORKSTATION feature
k: expanded KEYBOARD
c: expanded CPU
m: expanded MONITOR
n: NETWORK
...
end