Rationale for Ada 2005: Access types
RUSTOPBACKNEXT
ENG |
5. Access types and discriminants
@ This final topic concerns two matters. The first is about accessing components of discriminated types that might vanish or change mysteriously and the second is about type conversions. @ Recall that we can have a mutable variant record such as
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rationale for Ada 2005: Access types
@ENGRUSTOPBACKNEXT5. Ссылочные типы и дискриминанты
@ Этот заключительный раздел касается двух вещей. Первое - об ссылочных компонентах дискриминантных типов, которые могли бы исчезнуть или измениться загадочно, и второе - о преобразованиях типов.
@ Напомним, что мы можем иметь вариантную запись (рекорд) типа:
|
@ Она представляет мир, в котором есть три пола, мужчины, которые могут иметь бороды, женщины, которые могут иметь детей, и безполых (neuters), которые являются довольно бесполезными. Отметим значение по умолчанию для дискриминанта.
@ Это означает это, если мы объявляем беспрепятственный (unconstarined) объект таким образом:
|
@ тогда The_Thing является безполым по умолчанию, но можно изменить его секс целым рекордным назначением таким образом:
|
@ И теперь запись становится Male-вариантом и имеет бороду, но дата рождения сохраняет ее предыдущее значение.
@ Проблема с этим видом объектов состоит в том, что их компоненты могут исчезнуть. Если запись будет изменена на Female-вариант то борода исчезнет и будет заменена детьми. Из-за этого призрачного поведения запрещаются определенные операции на изменчивых объектах.
@ Одно очевидное правило состоит в том, что не допустимо переименовать компоненты, которые могут исчезнуть. Так:
|
@ по правилам Ады 83 это не разрешается. И эти правила были водонепроницаемы. Однако, Ада 95 добавила некоторые возможности. Объекты и компоненты теперь могли быть помечены как aliased, и признак Access мог быть применен. Дополнительные правила были тогда добавлены, чтобы предотвратить создание ссылок на вещи, которые могли исчезнуть.
@ Однако, было обнаружено, что правила ada относительно ссылочных типов всё ещё оставались водонепроницаемы.
@ Были предприняты попытки устранить эти проблемы установить их несколько постепенным способом. Эти вопросы являются тонкими и не кажутся стоящими описания в в этом общем представлении.
@ Мы ограничимся только несколькими примерами.
@ В Аде 95 мы можем объявить типы:
|
@ Естественно объекту типа Things_Name разрешается ссыслаться только на объект типа Mutant, Sex которого является Neuter.
|
@ Ситуация вышла бы из под контроля, если бы мы позволили Some_Thing иметь возможность менять сексуальную ориентацию. Соответствующее правило ada гласит, что aliased объект типа Some_Thing ограничен. И это спасает дело.
@ Однако, ситуация ухудьшается, когда тип, такой как Mutant используется для компонента другого типа следующим образом:
|
@ Здесь мы пытаемся объявить кошмарного монстра, голова которого - female, а хвост deceivingly изменчивый. Люди с приличным образованием могли бы найти, что это напоминает им о Сиренах, которые соблазнили Одисея своими красивыми голосами в его поездке мимо монстра Сцилла и водоворота Харибда. Люди с неприличным образованием могут сравнить это с лошадью театра пантомимы (вот уж действительно, кошмар). Мы могли бы тогда написать:
|
@ Однако, правило ada гласит, что Tail должен быть ограничен, так как он - aliased, и таким образом, тип Monster недопустим. Пока неплохо.
@ Но теперь рассмотрим следующий очень противный пример:
|
@ и тогда:
|
@ Проблема состоит в том, что здесь могут твориться тёмные дела при регистрации процедуры Sex_Change. Объекту A_Name присваивается ссылка на первый компонент массива X, чье значение - Before. При этом выполняется проверка, что компонент массива имеет правильный подтип. Однако, последующее присваивание на целый массив изменяет значение компонента на After, и это может изменить подтип X (1) и при этом нет никакой проверки относительно A_Name. Ключевой пункт здесь в том, что generic не знает, что тип T изменчив; эта информация не является частью родового контракта.
@ Так, когда мы вызываем Surgery, объект A_Neuter внезапно находит, что вырастил бороду! Подобная трудность происходит, когда частные типы вовлечены, потому что частичное представление и полное представление могли бы не согласиться о том, ограничен ли тип или нет. Рассмотрим:
|
@ Теперь предположим, некоторый невинный пользователь (который не посмотрел на частную часть) напишет:
|
@ Это очень удивительно. Пользователь не знает, что тип Mutant изменчив и в особенности не может видеть, что М и F отличны в некотором роде. С внешней стороны они только похожи на константы одного итого же типа. Большая неприятность состоит в том, что есть правило в Аде 95, которое говорит, что объект, созданный программой распределения ограничен. Таким образом, новый объект, именуемый Chris является постоянно Female, и поэтому попытка назначать значение М с его Bearded компонентом к ней обречена.
@ Попытки увязать эти и связанные проблемы с множеством минимальных правил казались обреченными. В конце концов, был введён запрет на использование ссылочных подтипов и для общих ссылочных типов, которые имеют значения по умолчанию для дискриминантов. Так Things_Name, а так также Mutant_Name (Neuter) запрещаются в Аде 2005.
@ Кроме того, мы даже не можем иметь ссылочный тип Mutant_Name, когда ссылочный тип заканчивает частное представление, которое не имеет никаких дискриминантов.
@ Запрещаяя эти противные ссылочные подтипы теперь мы можем сказать, что объекты кучи больше не считаются ограниченными в этой ситуации.
@ Другое изменение в этой области касается преобразований типов. Разновидность гендерной темы иллюстрируется следующим образом:
|
@ Отметим, что этот тип не изменчив, таким образом все люди увязываются с их сексом с рождения.
@ Мы можем теперь объявить некоторые ссылочные типы:
|
@ теперь мы можем управлять различными именами людей. Мы естественно использовали бы Person_Name, если бы мы не знали секс человека, а если бы знали то использовали бы Mans_Name или Womans_Name соответственно.
@ Мы могли бы иметь:
|
@ Если мы позже обнаруживаем, что Chris - фактически Christine тогда, мы могли бы любить заменить значение такое как It к более соответствующей переменной типа Неr. Таким образом, мы хотели бы написать:
|
@ Но любопытно достаточно это не разрешается в Аде 95 хотя обратная конверсия:
|
@ допустима. Правило ada состоит в том, что любые ограничения должны статически соответствовать или преобразование должно быть к беспрепятственного типа. По-видимому причина состояла в том, чтобы избежать проверок во время выполнения. Но эта нехватка симметрии неприятна, и это правило было изменено в Аде 2005, чтобы позволить преобразование в обоих направлениях с проверкой во время выполнения по мере необходимости.
@ Вышеупомянутый пример - это Упражнение 19.8 (1) из учебника [2]. Бедных студентов заставляли решать невозможную проблему. Но на Аде 2005 это имеет решение.
2010-10-24 00:26:54
www.1tzg.ru . .