Основы объектно-ориентированного программирования
Шрифт:
Эти операции не являются языковыми конструкциями, невзирая на их фундаментальную значимость для практики. Они поставляются классом ANY основной библиотеки Kernel. Этот класс имеет то специальное свойство, что каждый класс, созданный разработчиком, автоматически становится наследником (прямым или косвенным) класса ANY. Вот почему становится возможным переопределить вышеупомянутые компоненты для поддержки специального вида эквивалентности или копирования. (См. "Глобальная структура наследования", лекция 16)
Сейчас нет необходимости в деталях, поскольку мы еще вернемся к этой проблеме при изучении наследования. Но уже теперь полезно знать, что благодаря механизму наследования, мы можем полагаться на библиотечные классы, поддерживающие свойства, доступные всем классам, - и каждый класс может изменить их, приспосабливая к своим, специфическим целям.
Ключевые концепции
[x]. ОО-вычисления характеризуются высоко динамичной структурой времени выполнения, в которой объекты создаются только по запросу.
[x]. Некоторые объекты, используемые ПО, являются моделями внешних объектов (обычно косвенными). Другие объекты служат только для целей проектирования и реализации.
[x]. Объект состоит из ряда значений, называемых полями. Каждое поле соответствует атрибуту генератора объекта (класса, прямым экземпляром которого является объект).
[x]. Значение, в частности поле объекта, является объектом или ссылкой.
[x]. Ссылка может быть пустой (void) или присоединенной к объекту. Проверка условия x = Void позволяет определить текущее состояние ссылки. Корректное выполнение вызова x.f (...) возможно, если x не пустая ссылка.
[x]. Если объявление класса начинается с предложения class C ..., то сущность типа Cбудет обозначать ссылку, которая может быть присоединена к экземпляру C. Если начало объявления выглядит как expanded class D ..., то сущность типа D будет обозначать объект (экземпляр D) и никогда не может быть пустой ссылкой.
[x]. Базовые типы (BOOLEAN, CHARACTER, INTEGER, REAL, DOUBLE) определены как развернутые классы.
[x]. Развернутые объявления дают возможность определять составные объекты: объекты с подобъектами.
[x]. Объектные структуры могут содержать циклические цепочки ссылок.
[x]. Инструкция создания create x создает объект, инициализирует его поля значениями по умолчанию и присоединяет к нему x. Если в классе определены порождающие процедуры создания, то выполнение инструкции вида create x.creatproc (...) приведет, кроме того, к заданной специфической инициализации полей.
[x]. Для сущностей ссылочного типа присваивание (:=) и проверка эквивалентности (=) являются ссылочными операциями. Для сущностей развернутых типов используется семантика значений. Соответствующая семантика распространяется и на смешанные операнды.
[x]. В результате ссылочных операций появляются динамические псевдонимы. Они затрудняют получение выводов о работе системы при анализе ее текста. На практике большинство нетривиальных действий со ссылками можно инкапсулировать в библиотечные классы.
Библиографические замечания
Понятие идентичности объекта играет важную роль для баз данных, особенно объектно-ориентированных. Смотри лекцию 13 курса "Основы объектно-ориентированного проектирования", посвященную таким базам данных, и библиографию к ней.
Графические обозначения метода BON (Business Object Notation) разработаны Jean-Marc Nerson и Kim Walden [Walden 1995]. James McKim и Richard Bielak детально рассмотрели преимущества альтернативных порождающих процедур [Bielak 1994].
Риски, связанные с нетипизированными указателями и ссылочными операциями, уже долгое время волнуют специалистов в области методологии программирования, порождая намеки на то, что в области данных это аналог ненавистной операции goto в области управления выполнением кода. В удивительно малоизвестной статье Nori Suzuki [Suzuki 1982] обсуждается возможность избежать в рамках строгого подхода с использованием высокоуровневых операций проблем с динамическими псевдонимами (как избавляются от применения goto, используя приемы "структурного программирования"). Хотя по признанию автора выводы неутешительны, данная статья весьма полезна.
Я признателен Ross Scaife из Университета Кентукки за помощь по вопросам риторики. См. его страницу http://www.uky.edu/ArtsSciences/Classics/rhetoric.html.
Упражнения
У8.1 Книги и авторы
Напишите классы BOOK and WRITER описывающие книги и их авторов, используя заготовки из данной лекции. Обратите внимание на необходимость включения всех важных подпрограмм, а не только атрибутов.
У8.2 Личности
Напишите класс PERSON включающий простое понятие личности с атрибутами mother, father и sibling (следующий по старшинству брат или сестра, если они есть). Включите подпрограммы возвращающие списки имен родителей, двоюродных братьев и сестер, дядюшек и тетушек, свекра и свекрови, тестя и тещи данного лица. Совет: пишите рекурсивные процедуры, но внимательно избегайте бесконечных рекурсий для отношений, например, двоюродный брат или сестра, являющихся циклическими.
У8.3 Проектирование нотации
Предположим, вы часто используете сравнение в форме x.is_equal (y), и хотите упростить нотацию, используя преимущества инфиксной записи (применимой здесь, поскольку наша функция имеет один аргумент). Для инфиксного компонента используйте некоторый оператор §, вызов тогда будет записываться в виде x § y. Это маленькое упражнение потребует выбора для оператора §, подходящего для данной ситуации символа, совместимого с правилами инфиксных операторов. Конечно, здесь может существовать много возможных ответов, выбор одного из которых частично (но только частично) дело вкуса. (См. "Компоненты-операторы", лекция 7)