Классика баз данных - статьи

       

Ограниченность современной объектной концепции.


Вкратце общее описание современной объектной концепции (в дальнейшем СОК) можно условно свести к нескольким частям:

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

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

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

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

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

    В чем же заключается ограниченность СОК? Рассмотрим следующий пример. Пусть существует класс Cars описывающий транспортные средства и пусть у него определен метод getWeight возвращающий вес транспортного средства. Для хранения информации о весе используется атрибут weight предопределенного типа float.

    class Cars {... private: float weight; public: int getWeight () { // возвращает значение переменной weight }... ...}



    Для того, что бы продолжить наши рассуждения необходимо вспомнить понятия "значение" и "переменная". Они являются очень важными, и в дальнейшем мы часто будем их использовать. Вот, например, как определяет их Дейт: "…Значение - это индивидуальная константа (например, константа "3"). У значения нет своего места во времени и пространстве. Однако значения могут быть представлены в памяти посредством некоторой кодировки и, конечно, у таких кодировок имеется место во времени и пространстве. По определению, значение невозможно модифицировать. Переменная - это держатель кодировки значения. Переменная имеет место во времени и пространстве. Кроме того, переменные, в отличие от значений, конечно, можно модифицировать, т.е. текущее значение данной переменной можно заменить другим значением, возможно, отличным от исходного." Можно сказать проще: значение - это информации, а переменная - это место для хранения этой информации, представленной определенном образом.

    Вернемся к примеру. Существуют два автомобиля имеющие одинаковый вес (1000 кг). Описывая эту ситуацию, мы должны создать два объекта o1 и o2 класса Cars и присвоить значение 1000 переменным o1.weght и o2.weght, которые являются атрибутами этих объектов. Если исходить из СОК, где любой объект отличается от любого другого объекта, то переменные o1 и o2, так же как и переменные o1.weght и o2.weght, являются разными объектами. Однако это не очень соответствует повседневному опыту. Да, в реальной жизни про автомобили мы скажем, что они разные, однако про их вес мы скажем, что он один и тот же. Говоря образно, сравнивая автомобили, мы сравниваем их как переменные, несмотря на то, что информация, описывающая их абсолютно одинакова. Сравнивая же веса, мы сравниваем их значения, и в этом случае факт, что эти значения описывают разные автомобили не играет никакой роли.

    Этот признак может быть использован для того, что бы разделить моделируемые сущности на две группы. Это разделение не является условным - в дальнейшем будет показано, что оно имеет очень глубокий смысл.


    В первую группу будут входить сущности (будем называть их вещами), которые мы сравниваем как переменные. К их числу относятся, например автомобили, дома, люди, телефонные аппараты, страны, фирмы....список можно продолжать до бесконечности. К числу других сущностей относятся те, которые мы сравниваем как значения (будем называть такие сущности значимыми). Значимыми сущностями являются вес, адрес, имя, телефонный номер, географические координаты, индивидуальные номера налогоплательщиков (ИНН).... этот список также ничем не ограничен.

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

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



    Ограниченность объектной концепции проявляется и в том, что реально существующие объектные системы и языки программирования в той или иной степени всегда выходят за ее рамки. Речь идет о предопределенных типах, таких как int или float. СОК называет такие типы "примитивными классами" и, в соответствии с этим, переменные этих типов называются "примитивными объектами". Однако никому не приходит в голову сравнивать числа (значения), используя в качестве критерия тот факт, что эти значения хранятся в разных примитивных объектах (переменных), хотя концепция "объект" подразумевает именно такой способ сравнения информации. Другими словами объектная концепция, декларируя некий набор свойств, характерных для абстракции "объект", сразу же допускает, что для некоторых объектов эти свойства могут нарушаться. А может быть проще вообще не называть примитивные переменные объектами и, соответственно, предопределенные типы классами?

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

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



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


    Содержание раздела