Физические хранилища
Как правило, база данных объединяет несколько хранилищ данных, каждое из которых ассоциируется с одним или несколькими файлами. Хранятся как метаданные (класс, атрибут, определения операций), так и пользовательские данные. Выделяют три типа хранилищ:
• системное хранилище, используется для хранения системы классов, создается на этапе формирования базы данных и содержит информацию о классах, о наличии и месторасположении пользовательских хранилищ;
• пользовательское хранилище предназначено для хранения пользовательских объектов;
• служебное хранилище содержит временную информацию, например сведения о заблокированных объектах, об активных транзакциях, различного вида списки запросов пользователей и т.д.
Основные концепции объектно-ориентированной методологии
Важнейшим понятием объектной технологии является прежде вcero сам объект, определяемый как инкапсулированная сущность, обладающая свойствами и мeтодами. Инкапсуляция означает, что для внутренней реализации справедлив принцип сокрытия информации, соrласно которому ни проrраммный код, ни переменные не выставляются на всеобщее обозрение и не могorут использоваться за пределами объекта. В противоположность этому объекты имеют открытый интерфейс, описываемый в виде набора свойств и методов. Методы определяют поведение объекта, а свойства ero «знания», иными словами, данные. Строго говоря, свойства не могут использоваться непосредственно (а только через методы доступа к данным). Однако во мноrих современных OO - cрeдax методы доступа к данным предоставляются в распоряжение пользователя автоматически и вызываются неявно. Поэтому, придерживаясь праrматическоrо подхода, можно рaссматривать свойства подобных объектных систем как составную часть открытого интерфейса.
Если необходимо выполнить метод, то ero код во избежание противоречий с принципом сокрытия не вызывают напрямую. Вместо этоrо объекту посылают сообщение с требованием выполнить определенный метод с заданными параметрами.
Получив сообщение, объект сам выбирает соответствующий внутренний код для выполнения, вызывает его и передает ему значения параметров.
В объектных системах объекты одноrо типа принято объединять в классы объектов. Отдельные сущпости этих классов индивидуальные объекты называют экземплярами класса. Например, с точки зрения объектной технолоrии, каждый человеческий индивидуум это экземпляр класса Человек.
Класс объектов определяет свойства и методы, то есть тот интерфейс, который является единым для всех ero экземпляров. Это определение устанавливает свoeго рода рамки, которые каждый экземпляр заполняет своими индивидуальными значениями. Стало быть, экземпляры имеют тип соответствующего класса. Помимо этоrо, экземпляры обладают объектной индивидуальностью вне зависимости от значений их свойств. Так, два экземпляра одноrо класса даже при идентичных
значениях всех свойств по-прежнему четко различимы. Например, однояйцовые близнецы являются двумя различными индивидуумами, или экземплярами, даже если они обнаруживают полностью одинаковые свойства.
Экземпляры одноrо класса мorут отличаться лишь значениями своих свойств, но не своими методами. Методы устанавливаются для всех экземпляров при определении класса. Отсюда следует, что все члены одноrо класса обнаруживают не только идентичный интерфейс, но и идентичное «поведение». При этом различают методы экземпляров и методы класса, понимая под этим, что соответствующий метод либо относится к определенным экземплярам класса, либо действует независимо от них.
В качестве примера представим себе класс Треуrольник, обладающий такими мeтодами, как Нарисовать, Удалить, Переместить, а также свойствами Позиция, Размеры, Цвет. Для этоrо класса определены методы и написан соответствующий код, с помощью которого треуrольник рисуется, удаляется или перемещается с одной rroзиции на друrую. Отдельные экземпляры обладают значениями свойств: опре
деленной поз!щией, размерами и цветом. Если требуется удалить какой
значениями свойств: определенной позицией, размерами и цветом. Если требуется удалить какой-
либо Tpeуrольник, пользуются его методом Удалить. Хотя этот метод и определен в классе
объектов, он является методом экземпляров, действующим для каждоrо экземпляра в отдельности, и относится всеrда непосредственно к тому треугольнику, для котoporo он вызывается.
О наследовании rоворят, коrда класс объектов порождается из друrоrо класса. Порожденный класс (подкласс) находится со своим родптельским классом (суперклассом) в отношении «подкласс есть суперкласс» и наследует все ero свойства и методы. А значит, подкласс обладает интерфейсом, подобным интерфейсу суперкласса, и может применяться вместо кero. Этот принцип называется замещением и означает, что каждое сообщение, принимаемое экземплярами класса, применимо
также и к экземплярам ero подкласса.
Далее подкласс конкретизируется путем добавления новых свойств и методов, отсутствующих в суперклассе. Кроме тoro, переписывая унаследованные методы, можно изменять «поведение» подкласса по сравнению с его суперклассом.
Однако возможности удалять свойства и методы, принадлежащие классу, не предоставляется, поскольку она вступила бы в противоречие с принципом замещения. Подкласс, в свою очередь, может породить следующий подкласс и так далее. Глубина наследования лоrически не оrраничена. Зачастую в объектной системе все классы происходят от единственноrо базовоrо класса, предоставляющeго весьма общую объектную функциональность. Hа каждой ступени иерархии наследования класс постепенно конкретизируется. При множественном наследовании, поддерживаемом далеко не всеми объектными системами, у одного подкласса может быть несколько суперклассов. Это придает дополнительную гибкость создаваемой иерархии классов, но таит в себе нeкоторую опасность. Так, должны каким-то образом разрешаться конфликты, возникающие при попытке наследования от нескольких суперклассов различных методов с одинаковыми именами.
Попробуем расширить наш пример Треугольник еще несколькими гeoметрическими формами. Тогда имеет смысл обобщить состоящую пока что из одного единственного класса иерархию таким образом, чтобы она позволяла описывать любые формы. Это достигается введением суперкласса Форма. В нем могут быть определены уже используемые для треугольника методы Нарисовать, Удалить и Переместить. Разумеется, не стоит и мечтать о написании кода, рисующего любые геометрические формы. Вместо этого, опуская код метода Нарисовать в суперклассе Форма, мы просто включаем соответствующий специализированный код в подклассы Треугольник, Эллипс и Прямоугольник.
Несмотря на кажущуюся простоту, сделав (пустое) определение метода в суперклассе, мы совершили нечто очень важное. А именно мы определили интерфейс, посредством которого может быть нарисована любая геометрическая форма. Teперь на основе замещения мы можем отправить сообщение Выполни метод «Нарисовать» любому объекту любого подкласса Форма. Возможность наполнять методы с помощью кода лишь в подклассах (и добавлять методы и свойства в подклассах) позволяет нам, таким образом, увеличивать степень конкретизации в нашей иерархии классов. Действуя подобным образом, становится нетрудно расширять приложение: если оно в состоянии оперировать объектами класса Форма, то оно aвтоматически
сможет использовать и все его подклассы. Например, Пятиуrольник поддерживается сразу же после включения в иерархию классов без каких-либо дополнительных действий.
Теперь рассмотрим классы Крyг и Квадрат как подклассы Эллипса и Прямоугольника, оба являются особыми случаями соответствующих суперклассов и мoгут coдepжать дополнительные правила, справедливые лишь в этих особых случаях. Речь идет о таких правилах, как «длина всех сторон квадрата одинакова». Итак, в иерархии классов достаточно, один раз описав общий случай, реализовать исключения лишь в подклассах. В предыдущем примере мы ввели суперкласс Форма, содержащий все определения геометрических форм. Определив этот класс, не имело бы большого смысла заниматься созданием eгo экземпляров, не зная, о какой геометрической форме идет
речь. Классы, которые, подобно классу Форма, могут служить лишь основой для определения подклассов, называются абстрактными (abstract); экземпляры абстрактных классов создавать нельзя.
Далее, иногда встречаются классы, от которых нельзя порождать подклассы. Haзовем их финальными (final). Однако чаще как финальные определяются отдельные методы и свойства классов. Тогда в дальнейшем в создаваемых подклассах изменить соответствующие методы и свойства будет уже нельзя.
Когда за неким общим интерфейсом скрывается различный образ действий, говорят о полиморфизме. В примере мы уже с ним сталкивались: метод Нарисовать мы могли применить к любому объекту, хотя в треугольнике, прямоугольнике и эллипсе для его реализации был использован совершенно различный код. Для появившегося позднее Пятиугольника этот вызов также мог работать без каких-либо модификаций (при условии, что для Пятиугольника написан подходящий код).
Таким образом, полиморфизм является важнейшей основой для безболезненной адаптации объектно-ориентированного приложения, а также для его расширения с наименьшим риском возникновения ошибок
Использование объектной технологии для моделирования столь простых объектов, как круги и прямоугольники, вообще говоря, нетипично. При работе с объектами реального мира сложность отображаемых типов данных резко возрастает.
Так, в коммерческом приложении мы имеем дело с клиентами, которых хотим отобразить в классе Клиент. Последний обладает не только простыми свойствами строкового или целочисленного типа, но и свойством Имя. Предположим, оно состоит из фамилии, имени, отчества, а также, возможно, из званий и ученых степеней. Такие составные (либо производные) типы данных в прогрессивных системах определяются как расширенные типы данных (Advaпced Data Types) и могут использоваться точно так же, как и поставляемые вместе с системой базовые типы данных. При этом определение типа данных является особым случаем определения класса.
С другой стороны, каждый класс о6ъектов одновременно может рассматриваться и как некоторый тип данных. Предположим, что в рассматриваемом примере коммерческого приложения необходимо управлять сетью агентов по сбыту, информация о которых хранится в классе Агент. Тогда объект класса Клиент может иметь свойство типа Агент для отражения факта наличия ссылки на агента, обслуживающего данного клиента.
В отличие от агента по сбыту адрес не должен идентифицироваться независимо от клиента, поэтому eгo естественно представить как встроенный объект. В этом случае eгo свойства Улица и Город будут существовать лишь в контексте объекта Клиент, однако адрес будет иметь собственное определение класса, которое, возможно, удастся использовать повторно (к примеру, при определении класса Поставщик).
Встроенный объект, в свою очередь, может содержать другой встроенный объект;
глубина встраивания логически неограничена.
Большие неструктурированные множества данных, как правило, хранятся в виде потоков данных (Biпary Large Objects BLOBs). В нашем примере этим механизмом можно было бы воспользоваться для хранения графического изображения маршрута проезда к клиенту.
Наконец, свойство может повторяться многократно (независимо от eго типа дaнных). В этом случае говорят о коллекции. Так, в объекте Клиент может содержаться неограниченное число счетов в виде встроенных объектов; с тем же успехом коллекция может содержать и простые значения, такие как строки символов, расширенные типы данных или ссылки на объекты.
