возвращать значение по умолчанию. Например, функция
do
if some_condition then Result := 'Some specific value' end
end
не нуждается в предложении else. Подразумевается, что язык должен строго определить значения по умолчанию. Такие соглашения будут введены в следующей лекции.
Последнее преимущество соглашения
prefix '|_': INTEGER is
-- Целая часть числа
do
... Реализация опущена ...
ensure
no_greater: Result <= Current
smallest_possible: Result + 1 > Current
end
В предложении ensure содержатся постусловия, утверждающие два свойства результата: результат не должен быть больше значения, к которому применяется операция, и это значение должно быть меньше чем результат плюс единица.
Дополнение: точное определение сущности
Будет полезно в процессе обсуждения проблем нотации уточнить понятие сущности, которое мы постоянно использовали. Это в значительной степени техническое понятие, обобщающее традиционное понятие переменной.
Сущности, в том смысле, в котором они используются в данной книге, обозначают имена некоторых величин времени выполнения, связанных с объектами. Можно выделить три возможных случая:
Определение: сущность (entity)
Сущность может представлять собой:
[x]. (E1) Атрибут класса
[x]. (E2) Локальную сущность подпрограммы, включая предопределенную сущность
[x]. (E3) Формальный аргумент подпрограммы
Случай E2 подчеркивает, что сущность
Все сущности, за исключением формальных аргументов (E3), доступны для записи, то есть могут присутствовать как цель x в присваивании
Ключевые концепции
[x]. Фундаментальная концепция объектной технологии основана на понятии класса. Класс это абстрактный тип данных, частично или полностью реализованный.
[x]. Класс может иметь экземпляры, называемые объектами.
[x]. Нельзя путать объекты (динамические элементы) с классами (статическим описанием свойств, общих для множества объектов времени выполнения).
[x]. При последовательном подходе к объектной технологии каждый объект является экземпляром класса.
[x]. Класс одновременно служит модулем и типом. Оригинальность и мощь ОО- модели следует частично из интеграции этих понятий.
[x]. Класс характеризуется компонентами, включая атрибуты, представляющие поля в экземплярах класса, и подпрограммы, представляющие вычисления с участием данных экземпляров. Подпрограмма может быть функцией возвращающей результат или процедурой, если результат не возвращается.
[x]. Базовым механизмом ОО-вычислений является вызов компонентов (обращение к компонентам) класса. Вызов компонента применяет компонент к экземпляру класса (возможно с аргументами).
[x]. При вызове именованных компонентов используется точечная нотация, а при вызове компонент-операций - инфиксная или префиксная нотация.
[x]. Каждая операция относительна к 'текущему экземпляру' класса.
[x]. Для клиентов класса (других классов, которые используют его компоненты) атрибут ничем не отличается от функции без аргументов, в соответствии с принципом унифицированного доступа.
[x]. Исполняемый ансамбль классов называется системой. Система содержит корневой класс и все классы, которые необходимы корневому прямо или косвенно через клиентские отношения или наследование. Выполнение системы сводится к созданию экземпляра корневого класса и вызову процедуры создания для данного экземпляра.
[x]. Системы имеют децентрализованную архитектуру. Порядок действий несущественен для разработки.
[x]. Уточнение процесса сборки достигается с помощью простого языка описания систем Lace. В спецификации Lace, называемой файлом Ace, указывается корневой класс и набор каталогов, в которых размещены кластеры системы.
[x]. Процесс компоновки может быть автоматизирован без использования Make- файлов и директив Include.
[x]. Механизм скрытия информации требует гибкости. Наряду с неограниченным доступом и полным скрытием может потребоваться экспорт только для части клиентов. Атрибуты могут быть доступны только для чтения, для чтения и ограниченной модификации и в режиме полного доступа.
[x]. Экспорт атрибута означает доступ к нему только для чтения. Модификация требует вызова соответствующей экспортированной процедуры.
[x]. Селективный экспорт дает возможность группам родственных классов обеспечить специальный режим доступа для каждого компонента.
[x]. Необходимость в надстройках над классами - супермодулей - отсутствует. Классы должны оставаться независимыми программными компонентами.
[x]. Модульный стиль ОО-разработок требует большого числа небольших подпрограмм. Потенциальная опасность снижения производительности может быть достигнута путем встраивания этих подпрограмм оптимизирующим компилятором. Ответственность за поиск таких
