
- •20.7. Средства sql
- •20.8. Резюме
- •21.1. Введение
- •21.2. Некоторые аспекты технологам поддержки принятия решений
- •21.3. Проектирование базы данных поддержки принятия решений
- •21.5. Хранилища данных и магазины данных
- •21.6. Оперативная аналитическая обработка
- •21.7. Разработка данных
- •21.8. Резюме
- •22.1. Введение
- •22.2. Хронологические данные
- •22.3. Основная проблема хронологических баз данных
- •22.4. Интервалы
- •22.5. Интервальные типы
- •22.6. Скалярные операторы для интервалов
- •22.7. Операторы обобщения для интервалов
- •22.8. Реляционные операторы для обработки интервалов
- •22.9. Ограничения, включающие интервалы
- •22.10. Операторы обновления, включающие интервалы
- •22.11. Проектирование базы данных
- •22.12. Резюме
- •23.1. Введение
- •23.2. Обзор основных концепций
- •23.3. Исчисление высказываний
- •23.4. Исчисление предикатов
- •23.5. Базы данных с точки зрения доказательно-теоретического подхода
- •23.6. Дедуктивные субд
- •23.7. Обработка рекурсивных запросов
- •23.8. Резюме
- •Часть VI
- •24.1. Введение
- •24.2. Объекты, классы, методы и сообщения
- •24.3. Еще раз об объектах и объектных классах
- •Cdo для класса set (ref(emp))
- •24.4. Простой пример
- •1 | Course с001 , с001 0ffs , с001 ny offs |
- •24.5. Дополнительные аспекты
- •24.6. Резюме
- •25.1. Введение
- •X2 rational, y2 rational ) ... ;
- •25.2. Первая грубейшая ошибка
- •25.3. Вторая грубейшая ошибка
- •25.4. Вопросы реализации
- •25.5. Преимущества реального сближения двух технологий
- •25.6. Резюме
24.2. Объекты, классы, методы и сообщения
Ниже представлены некоторые основные термины и концепции объектного подхода, а именно — сами объекты (естественно), объектные классы, методы и сообщения. Там, где это возможно и уместно, данные понятия сравниваются с более знакомыми понятиями. Фактически в весьма приблизительной форме объектную терминологию вполне можно соотнести с терминологией традиционного программирования (рис. 24.3).
Объектный термин |
Традиционный термин |
неизменяемый объект изменяемый объект объектный класс метод сообщение |
значение переменная тип данных оператор вызов оператора |
Рис. 24.3. Объектная терминология (сводка)
Предупреждение. Прежде чем перейти к подробному освещению данной темы, необходимо предупредить читателя, что впредь не следует ожидать точности изложения, присущей реляционной теории. Действительно, многие объектные концепции (или их опубликованные определения) выражены не очень точно, относительно формулировки их определений единства мнений не достигнуто и разногласия возникают даже по фундамен-
тальным вопросам (в этом можно убедиться, прочитав работы [24.11], [24.48] и [24.52]). Например, не существует абстрактной, формально определенной "объектной модели данных", нет согласия даже в отношении неформальной модели. (Поэтому в данной книге термин "объектная модель" приводится в кавычках.) Также, как это ни странно, нет четкого разграничения между уровнями абстракции, в частности (ключевого!) разграничения между самой моделью и ее реализацией. Напомним, что в главе 1 описано, в чем заключается различие между этими концепциями.
Читателя следует также предупредить о том, что, исходя из сказанного выше, определения и объяснения, предложенные в этой главе, не являются универсальными, а также не обязательно полностью соответствуют принципу работы всех реальных объектных систем. Действительно, почти все предлагаемые здесь определения и толкования могут быть подвергнуты (и, вероятно, будут подвергнуты) критике со стороны специалистов.
Обзор объектной технологии
Вопрос: Что такое объект? Ответ: Все что угодно!
Основной догмат объектного подхода — "объектом может быть все что угодно" (или иногда говорят "все что угодно — объект первого класса"). Одни объекты являются неизменяемыми; в качестве примера можно привести числа (например, 3, 42) и символьные строки (например, "Mozart", "Экономика и бизнес"). Другие объекты — изменяемые; примерами могут служить объекты, представляющие отделы и служащих, которые упоминались в начале раздела 24.1. Согласно традиционной терминологии неизменяемые объекты соответствуют значениям, а изменяемые — переменным^ с произвольной внутренней сложностью (т.е. такие объекты могут содержать любое количество типов данных, имеющихся в обычных языках программирования, и конструкторов этих типов — чисел, строк, списков, массивов, стеков и т.д.).
Замечание. В некоторых системах термин объект употребляется только для изменяемого объекта, а термин значение, или иногда литерал, — для неизменяемого объекта. Даже в тех системах, в которых термин "объект" используется как в первом, так и во втором случаях, следует помнить о том, что неформально, за исключением особо оговоренных ситуаций, под ним подразумевается изменяемый объект, если явно не указано обратное.
Каждый объект имеет тип (в объектной терминологии — класс). Отдельные объекты иногда называются экземплярами объектов, чтобы их можно было отличить от соответствующего объектного типа или класса. Обратите внимание, что термин тип здесь используется в смысле, принятом в традиционном программировании (как в главе 5), в частности этот термин включает в себя и набор операторов (в объектной терминологии — методов), которые могут применяться для объектов данного типа.
Замечание. На самом деле в некоторых объектных системах понятия типов и классов различаются. Такие системы кратко будут рассмотрены в разделе 24.3; однако пока мы будем использовать эти понятия как взаимозаменяемые.
Объекты инкапсулированы. Это означает, что физическое представление, т.е. внутренняя структура объекта, например объекта DEPT (Отдел), остается скрытой от пользователей. В действительности пользователю известно только то, что объект в состоянии выполнять неко-
' Заметим, однако, что термин переменная без дополнительного уточнения в объектном контексте часто используется для обозначения такой переменной, которая содержит идентификатор объекта (о чем пойдет речь далее в этом разделе).
торые операции ("методы")2. Например, к объектам DEPT могут применяться методы HIRE_EMP (Нанять сотрудника), FIRE_EMP (Уволить сотрудника), CUT BUDGET (Урезать бюджет) и т.д. Также обратите внимание, что к данным объектам могут применяться ТОЛЬКО те операции, которые упомянуты среди этих методов. Доступ к внутреннему представлению таких объектов разрешен только коду, с помощью которого эти методы реализованы, т.е., употребляя жаргон, можно сказать, что эти и только эти методы могут "взломать инкапсулированный объект"3, если, конечно, данный код также невидим для пользователей.
Преимущество инкапсуляции состоит в том, что она позволяет изменять внутреннее представление объектов, исключая необходимость переделывать приложения, в которых эти объекты используются. Конечно, это возможно при условии, что любое такое изменение внутреннего представления сопровождается соответствующим изменением кода, с помощью которого реализуются применяемые к объекту методы. Иначе говоря, инкапсуляция подразумевает физическую независимость данных.
Теперь опишем инкапсуляцию в терминах независимости данных, что имеет смысл с точки зрения баз данных, хотя в литературе по объектной технологии это понятие обычно описывается иначе. Мы определим инкапсулированные объекты как имеющие закрытую память и открытый интерфейс.
. 2 В литературе много путаницы связано с понятием инкапсуляции. Точка зрения, которая кажется наиболее разумной и которая предлагается в настоящей книге, формулируется так. Говорят, что объект инкапсулирован, если и только если это скаляр в смысле, подразумеваемом в главе 5 (т.е. если и только если он не имеет никаких видимых пользователем компонентов); поэтому инкапсулированный объект и скаляр означают одно и то же. Отметим, что определенные "коллекции" объектов (см. раздел 24.3), бесспорно, не являются скалярами, поэтому согласно предыдущему определению они не инкапсулированы. Некоторые авторы, напротив, категорически утверждают, что все объекты инкапсулированы, и такая точка зрения неизбежно приводит к определенным противоречиям. Остальные же считают, что, кроме требования, чтобы внутренняя структура была скрыта, это понятие подразумевает еще и требование, чтобы соответствующие методы были физически связаны с объектом или классом данного объекта, т.е. физически являлись его частью. Мы считаем, что в последней трактовке смешиваются понятия модели и ее реализации. И это, конечно, еще одна причина, по которой, как указывалось в главе 5, мы предпочли бы совсем не использовать термин "инкапсулированный". Однако в данной главе мы все же будем вынуждены время от времени к нему обращаться.
3 Мы бы рекомендовали следовать более строгим требованиям, приведенным в [3.3]. Допустимы только выборки и операторы ТНЕ_ (см. главу 5), которым разрешено нарушать инкапсуляцию в этом смысле. Все другие операторы должны быть реализованы в терминах данных выборок и операторов THE . Иными словами, используется защита кода. Но в объектных системах обычно предоставляются не операторы THE как таковые, а операторы "get and set" (получить и установить), которые не являются их точными аналогами (см. раздел 24.4 и статью [24.22]).
■ Закрытая память состоит из переменных экземпляра, которые также иногда называются членами или атрибутами. Их значения представляют внутреннее состояние данного объекта. В истинно объектной системе переменные экземпляра являются полностью защищенными и скрытыми от пользователей, однако, как было сказано выше, они доступны для методов. Здесь следует добавить, что многие объектные системы не являются "чистыми" в этом смысле, поскольку разрешают пользователям доступ к некоторым переменным экземпляра. К этому вопросу мы еще возвратимся в следующем подразделе.
■ Открытый интерфейс состоит из определений интерфейсов для методов данного объекта. Эти определения соответствуют тому, что в главе 19 мы называли сигнатурами определений. Однако, как будет показано ниже, в объектных системах обычно требуется, чтобы такие сигнатуры были связаны лишь с одним конкретным "целевым" типом или классом. А в главе 19 ни о чем подобном не было и речи, но мы не считаем, что такое требование необходимо или обязательно (см. [3.3]). Как уже отмечалось, код, который реализует методы объекта, как и переменные экземпляра, скрыт от пользователя.
Замечание. Точнее говоря, открытый интерфейс представляет собой часть определения класса рассматриваемого объекта, а не часть самого этого объекта. (Как бы там ни было, открытый интерфейс является общим для всех объектов данного класса, а не конкретным кодом в некотором отдельном объекте.) И для определения класса данный объект является его отдельным экземпляром (как элемент каталога в обычной реляционной системе).
Методы вызываются с помощью сообщений, которые, по сути, являются вызовами функций и имеют единственный синтаксически выделенный аргумент— получатель, или цель. Например, ниже приводится сообщение, записанное с использованием гипотетического синтаксиса и предназначенное для передачи указания о приеме сотрудника Е на работу в отдел D.
D HIRE_EMP ( Е )
Аргументы D и Е будут рассмотрены в подразделе "Классы, экземпляры и коллекции". Получателем в этом примере является объект отдела, указанный как аргумент D. Согласно синтаксису традиционных языков программирования это же сообщение следовало сформулировать иначе4.
HIRE_EMP ( D, Е )
Для удобства в любой объектной системе обычно содержится некоторый набор встроенных классов и методов. В частности, в ней почти всегда присутствуют числовые (с методами "=", "<", "+", "-" и т.д.), символьные (с методами "=", "<", "||", S0BSTR и т.д.) и другие классы. Конечно, предоставляются возможности и для опытных пользователей, которые могут создать собственные классы и методы.
Переменные экземпляра
4
Выделение одного аргумента в качестве
особого может упростить выполнение
системой процесса
связывания во время выполнения, который
был описан в главе 19. Однако такой
подход имеет и недостатки: по крайней
мере, это может усложнить запись
выполняемого кода для соответствующего
метода. При традиционном подходе
(конечно, если есть из чего выбирать,
т.е. если есть несколько аргулгентов)
целевой аргумент выбирается произвольно.
Предположим, что имеется объектный класс отрезков линии LINESEG. Будем считать, что каждый отрезок имеет начало (точка START) и конец (точка END). Чтобы "получить" значения координат этих точек для заданного сегмента Is, обычно используются выражения наподобие Is.START и Is.END. Таким образом, START и END— открытые переменные экземпляра. Заметим, что по определению доступ к таким переменным должен осуществляться с помощью специального синтаксиса (обычно используется точка после имени объекта, как в нашем примере). Если физическое представление отрезков линии заменить, например, комбинацией координат средней точки (MIDPOINT), длины отрезка (LENGTH) и его наклона (SLOPE), в любой программе, которая содержит такие выражения, как Is.START и Is. END, возникнет ошибка. Другими словами, будет утрачена независимость данных.
Обратите внимание, что открытые переменные экземпляра не являются логически необходимыми. Предположим, что для получения значений переменных экземпляра отрезка линии определены методы GET_START, GET_END, GET_MIDPOINT, GET_LENGTH и GET_SLOPE. Тогда пользователь сможет "получить" значения координат начала, конца, средней точки отрезка Is, его длины и наклона, вызвав методы GET_START(Is), GET_END(2s), GET_MIDPOINT(Is), GET_LENGTH(Is) и GET_SLOPE(Is) соответственно. Однако в этом случае уже не имеет значения, каково действительное физическое представление отрезка — вполне достаточно, чтобы при каждом его изменении соответствующим образом были изменены и GET-методы. Более того, не было бы ошибкой, если бы пользователю разрешалось применять выражения наподобие Is.START в качестве сокращения для выражения вызова метода GET_START(Is). Обратите внимание, что для использования такого сокращения объект вовсе не обязательно должен содержать открытую переменную экземпляра START. К сожалению, в реальных системах обычно не придерживаются такого подхода. Как правило, все открытые переменные экземпляра фактически отражают физическое представление объекта (по крайней мере частично, хотя могут существовать и некоторые дополнительные переменные экземпляра, которые являются действительно закрытыми). Поэтому в соответствии со сложившейся практикой будем считать, что, если не указано противное, объекты предоставляют определенные открытые переменные экземпляра, хотя это понятие логически излишне.
В связи со сказанным выше необходимо рассмотреть еще один практический случай. Предположим, что определенные аргументы (которые пользователь в первом приближении может считать аргументами — "переменными экземпляра") требуются для создания объектов специфического класса5. Однако отсюда вовсе не следует, что подобные "переменные экземпляра" могут применяться для любых целей. Пусть, например, для создания объекта отрезка линии необходимы значения координат точек START и END. Однако отсюда не следует, что всегда можно будет составить запрос, например, для получения сведений обо всех отрезках линий, которые имеют одни и те же заданные координаты точки START. Возможность выполнения такого запроса зависит от того, был ли определен подходящий для этого случая метод.
Рассматриваемые
объекты должны быть, между прочим,
изменяемыми (почему?).
Идентификатор объекта
Каждый объект обладает уникальным идентификатором объекта (object ID — OID). Такие примитивные ("неизменяемые") объекты, как целое число 3, являются самоиден-тифж1ирующимися, т.е. они сами являются собственными идентификаторами объекта. Изменяемые объекты, напротив, имеют в качестве идентификаторов адреса (концептуальные). Эти адреса можно использовать повсюду в базе данных как указатели (концептуальные) на данные объекты. Адреса объектов пользователю непосредственно не предоставляются, но они могут быть присвоены, например, программной переменной и переменным экземпляра в других объектах. Обсуждение этого вопроса будет продолжено в разделах 24.3 и 24.4.
Кстати, отметим, что иногда можно встретить утверждения о том, что, с точки зрения пользователя, преимущество объектных систем заключается в абсолютной идентичности двух разных объектов, т.е. они могут быть дубликатами по отношению друг к другу, но отличаться своими идентификаторами. Однако, с точки зрения автора этой книги, подобное утверждение обманчиво. Ибо каким же образом пользователь действительно сможет внешне различить оба объекта? (Более подробно этот вопрос описан в [5.3], [5.6] и особенно — в [24.19].)