СТАТЬЯ
26.04.02

Модель "объект - качество" (Часть 1)

© Евгений Григорьев
Статья была опубликована на сайте www.citforum.ru

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

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

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

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

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

Этот подход выглядит наиболее логичным. И все же в нем существует противоречие, которое не позволяет считать его полностью верным. Вот цитата того же Дейта "…фундаментальный принцип реляционной модели… можно сформулировать следующим образом - вся информация в базе данных должна быть явно представлена в терминах отношений и никак иначе". Сразу же возникает вопрос - каким же образом будет сохраняться в такой базе данных информация о некотором произвольно сложном (т.е. ненормализованном) значении? Подход, предлагаемый Дейтом, не дает на него ответа.

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

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

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

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

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

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

Третья декларирует, что существует несколько примитивных предопределенных классов, переменные которых также являются объектам.

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

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

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

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

В чем же заключается ограниченность СОК? Рассмотрим следующий пример. Пусть существует класс 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. СОК называет такие типы "примитивными классами" и, в соответствии с этим, переменные этих типов называются "примитивными объектами". Однако никому не приходит в голову сравнивать числа (значения), используя в качестве критерия тот факт, что эти значения хранятся в разных примитивных объектах (переменных), хотя концепция "объект" подразумевает именно такой способ сравнения информации. Другими словами объектная концепция, декларируя некий набор свойств, характерных для абстракции "объект", сразу же допускает, что для некоторых объектов эти свойства могут нарушаться. А может быть проще вообще не называть примитивные переменные объектами и, соответственно, предопределенные типы классами?

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

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

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

Базовые типы как логическое понятие

Я не случайно старался использовать выражение "предопределенный тип" - оно является наиболее нейтральным и может обозначать как базовые, так и примитивные типы. Давайте различать эти понятия. Будем считать, что "базовый тип" - это логическое понятие описывающий тип данных, предопределенный в модели данных. "Примитивным типом" мы будем называть тип, реализуемый физической системой хранения и предопределенный в конкретной системе хранения данных.

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

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

Базовые типы современных объектных систем описываются в "базовой" системе типов аппаратно-зависимой линейной памяти. Она обладает очень серьезным ограничением - примитивные аппаратно-зависимые типы имеют совершенно конкретное воплощение в железе и их количество строго фиксировано. Однако это ограничение является ограничением именно "базовой" системы типов. Предположим, что на уровне железа появилась возможность работать с переменными нового типа (или типов - например, что-то типа verylong integer , или superpuperdouble, или что-нибудь еще). Естественно, этот тип сразу же появиться в списке типов являющихся базовыми для "описываемой" объектной системы типов. Эти рассуждения приводят нас к тому, что с точки зрения "описываемой" системы типов возможно существование произвольного числа базовых типов при условии, что эти типы будут поддерживаться "базовой" системой типов.

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

Качество (концепция)

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

В статье "Представление сложных идентифицируемых объектов в реляционных базах данных" я попытался ввести термин "сущность", который определяется как "информацию являющейся достаточной для установления определенной связи". К сожалению, использование слов "сущность" и "связь" может вызвать путаницу у русскоязычных читателей. Дело в том, что эти слова уже используется в сфере моделирования данных. Я имею в виду модель "сущность-связь" Чена, где в это слово вкладывается иной (абсолютно иной!) смысл. В русском языке слово "сущность" имеет несколько значений и, соответственно, может быть переведено на английский по-разному. Чен использует слово "entity", что означает "нечто существующее" и близко по смыслу к слову "объект" или "вещь". В упомянутой статье термин "сущность" имеет смысл "существенная характеристика, позволяющая описать вещь с определенной точки зрения". В этом случае слово "сущность" может быть переведено на английский как "essence" и близко по смыслу слову "качество". Поэтому в дальнейшем будет употребляться именно этот термин - "качество".  Ему можно дать следующее определение: качество - это абстракция определяющее и описывающая способность вещей к определенному взаимодействию. Информация о вещи есть информация о её качествах.

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

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

Еще один пример. Для описания некоторых вещей мы можем использовать свойство "адрес". Тем самым мы определяем, что данная вещь (например, человек, или фирма, или что-то еще) является адресуемой (в самом банальном смысле - ей можно послать письмо, или посмотреть по карте её местоположение). Информация о качестве "адрес" является результатом следующих связей между вещами: описываемая вещь находится в доме номер X расположенном на улицеY имеющейся в городе Z. Здесь "дом", "улица" "город" - это вещи, а "номер дома ", "название улицы", "имя города" - качества этих вещей. Свойство "адрес" является обобщением всех вышеперечисленных качеств всех вышеперечисленных вещей. Однако для того, что бы описать адресуемую вещь, нам совершенно не нужно описывать дома, улицы и города - надо просто знать адрес этой вещи. Существование этой информации позволяет сказать, что описываемая этой информацией вещь обладает способность к определенному взаимодействию - ей можно послать письмо, определить ее положение на карте и т.п. И в данном случае атрибут "адрес" не описывает строение реально существующих вещей, однако позволяет описать её способность к определенному взаимодействию с другими вещами.

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

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

Однако для того, что бы описать способность вещи к взаимодействию мы не должны определять первопричину этой способности и описывать реальную структуру вещи. Достаточно сказать, вещь обладает такой способностью к взаимодействию, то есть определенным качеством.

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

Качество (логика)

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

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

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

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

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

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

Качества можно сравнивать на основании следующих принципов:

  1. между собой могут сравниваться значения только одного и того же качества. Только такое сравнение является осмысленным.
  2. единственным способом сравнения качеств является сравнение значений качества. Качества, описываемые одинаковыми значениями, являются одинаковыми и никак иначе не отличаются друг от друга.

    Следствием этого является то, что
  3. все значения и переменные одного и того же качества должны иметь абсолютно одинаковую структуру (даже когда эта структура сложная). Если это не утверждение не выполняется (т.е. структура значений различается), то прямое сравнение этих значений невозможно и, следовательно, эти значения нельзя рассматривать как значения одного и того же качества.

Эти принципы помогают найти определить различия между понятиями, связанными с качествами (тип качества, значение качества, переменная качества) и объектными понятиями - тип (класс), значение (состояние объекта) переменная (объект). В самом деле, про объекты можно сказать, что:

  1. можно сравнивать объекты разных классов. На самом деле, верней была бы фраза "можно пытаться сравнить объекты разных классов". Дело в том, что объекты в любом случае должны сравниваться в терминах качеств, поскольку вещи сравниваются именно в этих терминах. А для этого сравнения в первую очередь необходимо, что бы объекты описывались одинаковыми качествами.
  2. два разных объекта, даже если их состояние (значение) абсолютно одинаково, все равно являются разными, отличаются друг от друга. Единственным критерием, позволяющим однозначно отличить один объект от другого, является объектный идентификатор - OID. Только в том случае, когда объекты имеют одинаковый OID, можно сказать, что речь идет об одном и том же объекте.
  3. объекты, имеющие разную структуру, тем не менее, могут относиться к одному классу. Это верно по крайне мере в следующих случаях:

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

Качество как отношение

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

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

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

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

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

    int

Value
...
-2
-1
0
1
2
...

Модель "объект-качество" подразумевает, что точно так же в качестве базового типа в объектных системах можно использовать отношение с арностью большей, чем 1.

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

Дополнительную информацию Вы можете получить в компании Interface Ltd.

Обсудить на форуме
Отправить ссылку на страницу по e-mail


Interface Ltd.
Тel/Fax: +7(095) 105-0049 (многоканальный)
Отправить E-Mail
http://www.interface.ru
Ваши замечания и предложения отправляйте автору
По техническим вопросам обращайтесь к вебмастеру
Документ опубликован: 26.04.02