Основы объектно-ориентированного программирования - [275]

Шрифт
Интервал

[x]. Статус символических имен не вполне ясен. Могут ли два перечислимых типа иметь общие символические имена (скажем, Orange в составе типов FRUIT и COLOR)? Можно ли их экспортировать как переменные и распространять на них те же правила видимости?

[x]. Значения перечислимых типов трудно получать и передавать программам, написанным на других языках, к примеру, C и Fortran, не поддерживающих такое понятие. В тоже время значения, описанные как unique, - это обычные числа, работа с которыми не вызывает никаких проблем.

[x]. Перечислимые типы данных могут требовать специальных операторов. Так, можно представить себе оператор next, возвращающий следующее значение и неопределенный для последнего элемента перечисления. Помимо него потребуется оператор, сопоставляющий элементу целое значение (индекс). В итоге синтаксическое и семантическое усложнение языка кажется непропорциональным вкладу этого механизма.

Объявления перечислимых типов в Pascal и Ada обычно принимают вид:


>type FIGURE_SORT = (Circle, Rectangle, Square, ...)



и используются совместно с вариантными полями записей:


>FIGURE =

>record

>perimeter: INTEGER;

>... Другие атрибуты, общие для фигур всех типов ...

>case fs: FIGURE_SORT of

>Circle: (radius: REAL; center: POINT);

>Rectangle:... Специальные атрибуты прямоугольника ...;

>...

>end

>end



Этот механизм позволяет организовать разбор случаев в операторе выбора case:


>procedure rotate (f: FIGURE)

>begin case f of

>Circle:... Специальные операции поворота окружности ...;

>Rectangle:...;

>...



Мы уже познакомились с лучшим способом решения этой проблемы, сохраняющим расширяемость при появлении новых вариантов, - достаточно определить различные версии процедур, подобных rotate для каждого нового варианта, представленного классом.

Когда это наиболее важное применение перечислимых типов исчезло, все, что осталось необходимым в некоторых случаях, - это выбор целочисленных кодов для фиксированного множества возможных значений. Определив их как обычные целые, мы избежим многих семантических неопределенностей, связанных с перечислимыми типами, например, нет ничего необычного в выражении Circle +1, если известно, что Circle типа integer. Введение unique-значения позволяет обойти единственное неудобство, связанное с необходимостью инициализации значений, позволяя выполнять ее автоматически.

Ключевые концепции

[x]. При любом подходе к конструированию ПО возникает проблема работы с глобальными объектами, совместно используемыми компонентами разных модулей, и инициализируемыми в период выполнения, когда какой-либо из компонентов первым к ним обратился.

[x]. Константы могут быть манифестными и символическими. Первые задаются значениями, синтаксис которых определен так, что значение одновременно описывает и тип константы, а потому является манифестом. Символические константы представлены именами, а их значение указывается в определении константы.

[x]. Манифестные константы базовых типов можно объявлять как константные атрибуты, не требующие памяти в объектах.

[x]. За исключением строк, типы, определенные пользователем, не имеют манифестных констант, нарушающих принципы Скрытия информации и расширяемости.

[x]. Однократная подпрограмма синтаксически отличается от обычной лишь ключевым словом once, заменяющим do. Она полностью выполняется лишь один раз (при первом вызове). При последующих вызовах однократной функции возвращается результат, вычисленный при первом вызове, последующие вызовы процедуры не имеют эффекта и могут быть проигнорированы.

[x]. Разделяемые объекты могут быть реализованы как однократные функции. Можно использовать инвариант для указания их константности.

[x]. Однократные процедуры используются там, где операции должны быть выполнены только однажды во время выполнения системы, чаще всего, это связано с инициализацией глобальных параметров системы.

[x]. Тип однократной функции не может быть закрепленным или родовым типом.

[x]. Константы строковых типов внутренне интерпретируются как однократные функции, однако, внешне они выглядят как манифестные константы, значения которых заключается в двойные кавычки.

[x]. Перечислимые типы в стиле языка Pascal не соответствуют объектной методологии. Для представления объектов с несколькими возможными вариантами значений используются символические unique константы. Инициализация значений таких констант выполняется компилятором.

Библиографические замечания

Проблемы перечислимых типов были изучены в работах [Welsh 1977] и [Moffat 1981]. Некоторые приемы, рассмотренные в этой лекции, впервые представлены в [M 1988b].

Упражнения

У18.1 Эмуляция перечислимых типов однократными функциями

Покажите, что при отсутствии unique-типов перечислимый тип языка Pascal


>type ERROR = (Normal, Open_error, Read_error)



может быть представлен классом с однократной функцией для каждого значения типа.

У18.2 Однократные функции для эмуляции unique-значений

Покажите, что в языке без поддержки unique-объявлений результат, аналогичный


>value: INTEGER is unique



можно получить, воспользовавшись объявлением вида


>value: INTEGER is once...end



где вам необходимо написать тело однократной функции и все, что может еще понадобиться.