Когда правила типов становятся несносными

Когда правила типов становятся несносными

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

Вот два основных правила, представленных в первой лекции о наследовании (лекция 14).

[x]. Правило Вызова Компонентов: запись x.f осмысленна лишь тогда, когда базовый класс x содержит и экспортирует компонент f.

[x]. Правило Совместимости Типов: при передаче a как аргумента или при присваивании его некой сущности необходимо, чтобы тип a был совместим с ожидаемым, то есть основан на классе, порожденным от класса сущности.

Правило Вызова Компонентов не является причиной каких-либо проблем - это фундаментальное условие всякой работы с объектами. Естественно, что обращаясь к компоненту объекта, нужно проверить, действительно ли данный класс предлагает и экспортирует данный компонент.

Правило Совместимости Типов требует больше внимания. Оно предполагает наличие у нас всей информации о типах объектов, с которыми мы работаем. Как правило, это так, - создав объекты, мы знаем, чем они являются, но иногда информация может частично отсутствовать. Вот два таких случая.

[x]. В полиморфной структуре данных мы располагаем лишь информацией, общей для всех объектов структуры; однако нам может понадобиться и специфическая информация, применимая только к отдельному объекту.

[x]. Если объект приходит из внешнего мира - файл или по сети - мы обычно не можем доверять тому, что он принадлежит определенному типу.

Давайте займемся исследованием примеров этих двух случаев. Рассмотрим для начала полиморфную структуру данных, такую как список геометрических фигур:

figlist: LIST [FIGURE]

В предыдущих лекциях рассматривалась иерархия наследования фигур. Пусть нам необходимо найти самую длинную диагональ среди всех прямоугольников списка (и вернуть -1, если прямоугольников нет). Сделать это непросто. Выражение item (i).diagonal, где item (i) - i-й элемент списка, идет вразрез с правилом вызова компонентов: item (i) имеет тип FIGURE, а этот класс, в отличие от его потомка RECTANGLE, не содержит в своем составе компонента diagonal. Решение, используемое до сих пор, изменяло определение класса, - в нем появлялся атрибут, задающий тип фигуры. Однако это решение не столь элегантно, как нам хотелось бы.

Теперь пример второго рассматриваемого случая. Пусть имеется механизм хранения объектов в файле или передачи их по сети, аналогичный универсальному классу STORABLE, описанному нами ранее. Для получения объекта используем:

my_last_book: BOOK

...

my_last_book := retrieved (my_book_file)

Значение, возвращаемое retrieved, имеет тип STORABLE библиотеки Kernel, хотя с тем же успехом оно может иметь тип ANY. Но мы не ожидали STORABLE или ANY, - мы надеялись получить именно BOOK. Присваивание my_last_book нарушает правило Совместимости Типов.

Даже если написать собственную функцию retrieved, учитывающую специфику приложения и объявленную с подходящим типом, вам не удастся полностью на нее положиться. В отличие от объектов вашего ПО, в котором согласованность типов гарантируется действующими правилами, данный объект к вам поступает со стороны. При его получении вы могли ошибиться в выборе имени файла и прочитать объект EMPLOYEE вместо объекта BOOK, файл мог быть подделан, а при сетевом доступе данные могли быть искажены при передаче.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

10. Когда открыть, а когда закрыть

Из книги Волшебный котел автора Реймонд Эрик Стивен

10. Когда открыть, а когда закрыть Рассмотрев деловые модели, которые поддерживают разработку программного обеспечения с открытыми текстами, мы можем теперь приблизиться к общему вопросу о том, когда исходному коду, с точки зрения экономики, имеет смысл быть «открытым», а


1.5. Правила

Из книги Программирование на языке Пролог автора Клоксин У.

1.5. Правила Предположим, мы хотим сформулировать утверждение, что Джону нравятся все люди. Один из способов сделать это заключается в записи для каждого человека, упоминаемого в базе данных, отдельного факта:нравится(джон,альфред). нравится(джон,бертран).


Правила приведения типов в C#

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Правила приведения типов в C# Пришло время изучить правила выполнения операций приведения типов в C#. Вспомните иерархию Employees и тот факт, что наивысшим классом в системе является System.Object. Поэтому все в вашей программе является объектами и может рассматриваться, как


Глава 16 Работа на клавиатуре: как становятся профессионалами

Из книги Эффективное делопроизводство автора Пташинский Владимир Сергеевич

Глава 16 Работа на клавиатуре: как становятся профессионалами При всех попытках объединить человека и компьютер в единый оперативно работающий организм были придуманы голосовой ввод, инфракрасный порт и оптическое распознавание. Однако только клавиатура была и еще


5.1.1. Общие правила

Из книги Самоучитель работы на компьютере автора Колисниченко Денис Николаевич

5.1.1. Общие правила Ваш компьютер будет «жить долго и счастливо», если вы станете придерживаться следующих правил эксплуатации:Бережно обращайтесь с компьютером и периферийными устройствами. Компьютер не простит вам, если вы уроните его со стола. При транспортировке


Правило 24: Объявляйте функции, не являющиеся членами, когда преобразование типов должно быть применимо ко всем параметрам

Из книги Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ автора Мейерс Скотт

Правило 24: Объявляйте функции, не являющиеся членами, когда преобразование типов должно быть применимо ко всем параметрам Во введении я отмечал, что в общем случае поддержка классом неявных преобразований типов – неудачная мысль. Но, конечно, из этого правила есть


Правила типизации

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

Правила типизации Наша ОО-нотация является статически типизированной. Ее правила типов были введены в предыдущих лекциях и сводятся к трем простым требованиям.[x]. При объявлении каждой сущности или функции должен задаваться ее тип, например, acc: ACCOUNT. Каждая подпрограмма


Правила

Из книги Справочник по CSS автора Коллектив авторов

Правила Правила используются в таблицах стилей для особых нужд.charsetЗадает текстовую кодировку для внешней таблицы стилей.@charset {Кодировка};Пример:@charset "windows-1251";Может использоваться только во внешних таблицах стилей; должна быть первой строкой в файле. Поддерживается IE


§ 165. Три правила про вы

Из книги Ководство автора Лебедев Артём Андреевич

§ 165. Три правила про вы 7 сентября 2010В русском языке существует местоимение вы, к которому прилагаются довольно простые правила употребления и неупотребления.Вы всегда пишется с маленькойСовершенно невыносима рекламно-подобострастная манера писать Вы с заглавной


Три правила

Из книги Быстрые деньги в Интернете [50 способов заработать, сидя дома у компьютера] автора Парабеллум Андрей Алексеевич


Youtube и его партнёры: видео «для интернета» становятся отраслью Юрий Ильин

Из книги Цифровой журнал «Компьютерра» № 159 (full) автора Журнал «Компьютерра»

Youtube и его партнёры: видео «для интернета» становятся отраслью Юрий Ильин Опубликовано 07 февраля 2013 Уже наступающей весной Youtube планирует организовать платную подписку на индивидуальные каналы, сообщает нам Ad Age. Затея, в конечном счёте,


Исследования атмосфер и климата внесолнечных планет становятся обыденностью Дмитрий Вибе

Из книги Цифровой журнал «Компьютерра» № 168 автора Журнал «Компьютерра»

Исследования атмосфер и климата внесолнечных планет становятся обыденностью Дмитрий Вибе Опубликовано 08 апреля 2013 Тут народ всё жалуется, что нет в физике переворотов. Но переворот необязательно должен быть стремительным: утром все проснулись,


Правила@

Из книги HTML, XHTML и CSS на 100% автора Квинт Игорь

Правила@ Правила @ начинаются с ключевого слова @, непосредственно за которым следует идентификатор (например, @import, @page). Каждый из этих идентификаторов далее рассмотрим подробнее.Все же надо отметить, что браузер с поддержкой CSS будет игнорировать все правила @import, которые