Главная » SQL, Базы данных » ОПРЕДЕЛЕНИЕ ЗНАЧЕНИЙ И ПЕРЕМЕННЫХ

0

Прежде всего, необходимо подчеркнуть, что между значениями и переменными есть важное и фундаментальное логическое различие1 (достойно удивления то, насколько часто в литературе встречаются ошибочные взгляды по этому вопросу).  Автор следует трактовке, изложенной в [5.1], и принимает за основу приведенные ниже определения.

■     Значение представляет собой "отдельно взятую константу", например, конкрет ную константу, которая выражается в виде целого числа 3. Для значения не опре делено место во времени или в пространстве. Но значения могут быть представле ны в памяти с помощью некоторого метода кодирования и такие представления или проявления {appearances; автор предпочитает именно этот термин) характери зуются определенным местоположением во времени и пространстве. Безусловно, различные проявления одного и того же значения могут существовать в различных позициях во времени и пространстве, количество которых является неограничен ным. Неформально говоря, из этого следует, что одно и то же значение могут иметь многие разные переменные, в одно и то же или в разное время. В частности, отметим, что по определению значение не может быть обновлено, поскольку если бы такое было возможно, то после подобного обновления это было бы уже другое значение.

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

Обратите особое внимание на то, что допустимыми значениями являются не только такие простые проявления, как целое число 3. Напротив, значения могут  быть сколь угодно сложными; например, значение может представлять собой геометрическую точку, многоугольник, рентгеновский луч, документ XML, отпечаток пальца, массив, стек, список, отношение (и т.д. и т.п.). Аналогичное замечание, безусловно, относится также и к переменным.

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

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

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

1 Определение этого важного и полезного понятия приведено в [3.3].

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

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

Типизация значений и переменных

Каждое значение имеет определенный тип (эту мысль равным образом можно выразить так, что каждое значение относится к определенному типу). Иными словами, если v представляет собой некоторое значение, то v может рассматриваться как некоторая конструкция, обозначенная своего рода флажком, на котором указано: "Я — целое число", или "Я — номер поставщика", или "Я — геометрическая точка" (и т.д.). Отметим, что по определению любое отдельно взятое значение всегда имеет один и только один тип2, который никогда не изменяется. Из этого следует, что различные типы являются несовместимыми; это означает, что они не имеют друг с другом каких-либо общих значений. Более того, справедливы приведенные ниже утверждения.

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

■     Каждый атрибут каждой переменной отношения (см. главу 6), должен быть явно объявлен как относящийся к некоторому типу; это означает, что каждое возмож ное значение рассматриваемого атрибута представляет собой значение рассматри ваемого типа.

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

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

2 Если не считать той возможности, что поддерживается наследование типов; такая возможность не будет рассматриваться до главы 20.

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

■  Вообще говоря, каждое выражение на языке программирования должно быть хотя бы неявно объявлено как относящееся к некоторому типу. А именно, тип должен быть объявлен для самого внешнего из операторов, участвующих в этом выражении, где под "самым внешним оператором" подразумевается оператор, выполняемый в последнюю очередь в процессе вычисления рассматриваемого выражения. Например, объявленным типом  выражения а * (Ь + с) является объявленный тип оператора "*" (умножение).

В качестве дополнительного замечания следует отметить, что изложенные выше рассуждения, касающиеся операторов и формальных параметров операторов,  требуют небольшого  уточнения,  если  рассматриваемые  операторы  являются  полиморфными. Оператор называется полиморфным, если он определен в терминах некоторого формального параметра Р, а фактические параметры, соответствующие Р, могут иметь разные типы при различных вызовах. Одним из  наиболее наглядных примеров может служить оператор проверки на равенство  "=".  Допускается проверка на равенство любых двух значений v1 и v2 (но лишь при том условии, что vl и v2 относятся к одному и тому же типу), и поэтому оператор "=" является полиморфным — он может применяться к целым числам, к символьным строкам, к номерам поставщиков и фактически к значениям любого возможного типа. Аналогичные замечания относятся и к оператору присваивания ": =" (который также определен для каждого типа) — допустимо применять  операцию присваивания любого значения v любой переменной V, но также при условии, что v и V относятся к одному и тому же типу. (Безусловно, операция присваивания оканчивается неудачей, если в ней нарушаются некоторые ограничения целостности, как описано в главе 9, но она не может окончиться неудачей из-за ошибки, связанной с несоответствием типов как таковой3.) Другие примеры полиморфных операторов можно найти в главе

20 и в других главах этой книги.

Источник: Дейт К. Дж., Введение в системы баз данных, 8-е издание.: Пер. с англ. — М.: Издательский дом «Вильямс», 2005. — 1328 с.: ил. — Парал. тит. англ.

По теме:

  • Комментарии