ВИЗНАЧЕННЯ ТИПІВ І ФОРМАТІВ ПРЕДСТАВЛЕННЯ

Вище в цьому розділі вже було коротко зазначено, що існує логічне відмінність між типом як таким, з одного боку, і фізичним представленням значень цього типу в системі, з іншого боку Фактично типи ставляться до рівня моделі,

3 Точніше, ця операція не може закінчитися невдачею через помилку під час прогону програми, повязаної з невідповідністю типів У цій книзі прийнято достатньо обгрунтоване припущення, що в системі передбачена перевірка типів під час компіляції (або так звана статична перевірка) очевидно, що помилка під час прогону програми не може виникнути, якщо перевірка під час компіляції пройшла успішно

а формати фізичного представлення – до рівня реалізації Наприклад, номери постачальників можуть бути фізично представлені у вигляді символьних рядків, але з цього не випливає, що нам дано право виконувати над номерами постачальників такі ж операції, як над символьними рядками точніше, ми можемо виконувати подібні операції, але лише за тієї умови, що для даного типу визначені відповідні оператори Крім того, оператори, які визначаються для даного конкретного типу, повинні природним чином залежати від наміченого призначення розглянутого типу, а не від способу, обраного для фізичного представлення значень цього типу насправді, ці фізичні формати представлення повинні бути прихованими від користувача Іншими словами, відмінність, яке ми проводимо між типом і фізичним представленням, є одним з важливих аспектів незалежності від даних (Див главу 1)

До речі, слід зазначити, що типи даних (особливо обумовлені користувачем) в літературі іноді називають абстрактними типами даних, або скорочено ADT (Abstract Data Type), щоб підкреслити таку їх особливість справа в тому, що ми зобовязані розрізняти типи і формати їх фізичного представлення Але в даній книзі цей термін не використовується, оскільки він наводить на думку, що можуть існувати деякі типи, які не є в цьому сенсі абстрактними, а автор вважає, що слід завжди враховувати відмінність між типом і його фізичним поданням

Визначення скалярних і нескалярних типів

Будь окремо взятий тип може бути або скалярним, або нескалярним Визначення цих понять наведено нижче

■&nbsp&nbsp&nbsp&nbsp Нескалярним (Nonscalar) називається тип, значення якого явно визначені як такі, що безліч видимих ​​користувачеві, безпосередньо доступних компо конструктивні Зокрема, в цьому сенсі є нескалярнимі типи відносини (Див розділ 6), оскільки відносини мають такі видимі користувачеві компоненти, як кортежі і атрибути (Крім того, в свою чергу, типи кортежу також явля ются нескалярнимі, оскільки кортежі мають такі видимі користувачеві компоненти, як значення атрибутів)

■&nbsp&nbsp&nbsp&nbsp Скалярним (Scalar) називається тип, який не є нескалярним ()

Примітка Замість терміну скалярний іноді використовуються також терміни інкапсульований (Encapsulated) і атомарний (Atomic) термін атомарний особливо часто застосовується в реляційних контекстах (включаючи попередні видання цієї книги) Для ознайомлення з терміном інкапсульований зверніться до глави 25

Значення типу т є скалярними або нескалярнимі відповідно до того, чи є скалярним або нескалярним сам тип т тому нескалярное значення має безліч видимих ​​користувачеві компонентів, а скалярний значення не має такого Аналогічні зауваження відносяться до змінних, атрибутам, операторам, параметрам і виразами в цілому, але з відповідними застереженнями

Можливі формати представлення, селектори і оператори ТНЕ_

Припустимо, що т – скалярний тип Вище було показано, що фізичне уявлення значень типу т приховано від користувача Насправді, такі подання можуть бути як завгодно складними (зокрема, вони цілком можуть складатися з декількох

компонентів), але ще раз підкреслимо, що всі подібні компоненти повинні бути приховані від користувача Однак завдання полягає в тому, щоб значення типу т мали хоча б один можливий формат представленія4 (Оголошений у складі визначення типу т) і щоб будь-який такий можливий формат уявлення не був прихованим від користувача зокрема, всі ці формати повинні мати видимі користувачеві компоненти Але слід враховувати, що розглянуті компоненти не є компонентами типу, а компонентами даного можливого формату представлення, тоді як тип як такої все ще залишається скалярним в тому сенсі, який був описаний вище В якості ілюстрації розглянемо визначається користувачем тип QTY (скорочення від quantity – кількість), визначення якого на мові Tutorial D може виглядати приблизно чином

TYPE QTY POSSREP { INTEGER }

У цьому визначенні типу, по суті, сказано, що значення кількості можуть бути представлені за допомогою цілих чисел Таким чином, оголошенеможливе подання (Possible representation – possrep), безумовно, має видимі користувачеві компоненти (фактично воно має точно один такий компонент, типу INTEGER), АЛЕ поняття кількості як таке не має подібного компонента

Нижче наведено ще один приклад, що дозволяє більш наочно підкреслити цю ж

думка

TYPE POINT / * Геометричні точки в двомірному просторі * / POSSREP CARTESIAN {X RATIONAL, Y RATIONAL P} POSSREP OLAR {R RATIONAL, 0 RATIONAL}

Наведене тут визначення типу POINT включає оголошення двох різних можливих форматів представлення, CARTESIAN І POLAR, що відображають той факт, що точки в двомірному просторі дійсно Можуть бути представлені за допомогою декартових (CARTESIAN) АБО полярних (POLAR) координат Кожен з цих можливих форматів представлення має в свою чергу два компоненти, причому обидва вони відносяться до типу 5 Але важливо відзначити, що тип POINT як такої (ще раз підкреслимо) все ще залишається скалярним – він не має видимих ​​користувачеві компонентів

Примітка Ми приймаємо таку угоду про синтаксис, що якщо деякий заданий тип т має можливе подання без явно певного імені, то це можливе подання за замовчуванням приймає імя т Ми також беремо угоду, що якщо задане можливе подання PR має компонент без явного імені, то цей компонент за замовчуванням отримує імя PR Крім того, застосування кожного оголошення POSSREP тягне за собою автоматичне визначення перерахованих нижче операторів, які в основному не вимагають пояснень

4 За винятком того випадку, коли тип Т є фіктивним (Див главу 20)

5 У мові Tutorial D використовується тип RATIONAL, більш точно певний порівняно з при звичним типом REAL Слід зазначити, що тип RATIONAL може також служити прикладом вбудованого типу, що має більше ніж одне можливе оголошене подання Наприклад, вирази 53000 і 53Е2 цілком можуть відповідати одному і тому ж значенню RATIONAL це означає, що обидва вони можуть стати наслідком різних, але еквівалентних викликів двох різних селекторів RATIONAL (більш докладно про це буде сказано нижче)

▪ Оператор-селектор, який дозволяє користувачеві визначати або вибирати значення розглянутого типу, надаючи деяке значення для кожного компонента можливого подання

■ Безліч операторів ТНЕ_ (по одному для кожного компонента можливого подання), які дозволяють користувачеві звертатися до відповідних компонентів можливого подання значень розглянутого типу

Примітка Під твердженням, що оголошення POSSREP викликає автоматичне визначення цих операторів, мається на увазі, що той діяч (Можливо система, а може бути, і якийсь користувач), який відповідає за реалізацію розглянутого типу, несе також відповідальність за реалізацію самих операторів

Нижче як приклад представлені деякі виклики операторів-селектор і оператора ТНЕ_ для типу POINT

CARTESIAN ( 50, 25 )

/ * Вибирає точку з координатами х = 50, у = 25 * /

CARTESIAN ( X1, Y1 )

/ * Вибирає точку з координатами х = X1, у = Y1, де * /

/ * X1 і Y1 змінні типу RATIONAL * /

POLAR ( 27, 10 )

/ * Вибирає точку з координатами r = 27, 8 = 10 * /

ТНЕ_Х (Р)

/ * Позначає координату х точки в * /

/ * Р, де Р змінна типу POINT * /

THE_R ( P )

/ * Позначає координату r точки в Р * /

THE_Y (ехр)

/ * Позначає координату у точки, позначеної * /

/ * Виразом ехр (яке відноситься до типу POINT) * /

Зверніть увагу на те, що селектори мають таке ж імя, як відповідне можливе подання, а оператори ТНЕ_ мають імена у формі ТНЕ_С, де з-імя відповідного компонента відповідного можливого подання Зверніть також увагу на те, що селектори (Або, точніше, виклики селекторів) представляють собою узагальнення більш відомого поняття литерала (всі літерали є викликами селекторів, але не всі виклики селекторів можуть розглядатися як літерали насправді виклик селектора є літералом, якщо і тільки якщо всі його фактичні параметри в свою чергу є літералами)

Для того щоб визначити, як описані вище синтаксичні конструкції можуть застосовуватися на практиці, припустимо, що фізичне уявлення точок фактично є безліччю декартових координат (Але загалом не потрібно, щоб фізичне уявлення було ідентично будь-якого з оголошених можливих подань) У такому випадку в системі можуть бути передбачені деякі найвищою мірою захищені оператори, що відрізняються тим, що за ними слід псевдокод, позначений курсивом, який по суті надає доступ до цього фізичному уявленню, а

реалізатор типу (Type implementer) використовує ці оператори для реалізації необхідних селекторів CARTESIAN І POLAR Безумовно, що такий реалізатор типу є (а фактично і повинен бути) виключенням з того загального правила, що користувачі не зобовязані враховувати фізичні уявлення Відповідний приклад наведено нижче

OPERATOR CARTESIAN ( X RATIONAL, Y RATIONAL ) RETURNS POINT BEGIN

VAR P POINT / * P змінна типу POINT * /

<Компонент X фізичного представлення Р: = Х>

<Компонентів Y фізичного представлення Р: = Y> RETURN ( P ) END END OPERATOR

OPERATOR POLAR ( R RATIONAL, Q RATIONAL ) RETURNS POINT RETURN ( CARTESIAN ( R * COS ( Q ) , R * SIN ( Q ) ) )

END OPERATOR

Відзначимо, що у визначенні POLAR використовується селектор CARTESIAN, а також оператори SIN і COS (передбачається, що вони є вбудованими) Іншим чином, визначення POLAR може бути виражене безпосередньо в термінах захищених операторів, як показано нижче

OPERATOR POLAR ( R RATIONAL, Q RATIONAL ) RETURNS POINT BEGIN

VAR P POINT

<Компонент X фізичного представлення Р: = R * COS (Q)>

<Компонентів Y фізичного представлення Р: R * SIN (Q)>

; RETURN ( P ) END END OPERATOR

У конструкції реалізатора типу також використовуються ці захищені оператори для реалізації необхідних операторів ТНЕ_ таким чином

OPERATOR ТНЕ_Х (Р POINT) RETURNS RATIONAL RETURN ( <Компонент X фізичного представлення

Р> )

END OPERATOR

OPERATOR THE_Y ( P POINT    ) RETURNS RATIONAL RETURN ( <Компонентів Y фізичного представлення

Р> )

END OPERATOR

OPERATOR THE_R ( P POINT    ) RETURNS RATIONAL RETURN ( SQRT ( THE_X     ( P ) ** 2 + THE_Y ( P )

** 2 ) )

END OPERATOR

OPERATOR THE_Q ( P POINT    ) RETURNS RATIONAL RETURN ( ARCTAN ( THE_Y ( P ) / THE_X ( P ) )

) END OPERATOR

Зверніть увагу на те, що у визначеннях THE_R і ТНЕ_Q використовуються оператори ТНЕ_Х і THE_Y, а також оператори SQRT і ARCTAN (при цьому мається на увазі, що

вони є вбудованими) Іншим чином, оператори THE_R і ТНЕ_0 можуть бути визначені безпосередньо в термінах захищених операторів (їх практичне здійснення залишаємо читачеві як вправа)

Очевидно, що приклад реалізації типу POINT є дуже наочним Але важливо зрозуміти, що всі ці описані концепції застосовні також до більш простим тіпам6, наприклад, до типу QTY Нижче наведені деякі приклади виклику селекторів для цього типу

QTY ( 100 ) QTY ( N )

QTY ( N1 N2 )

А нижче наведені деякі приклади виклику операторовТНЕ_

THE_QTY ( Q ) THE_QTY ( Ql Q2 )

Примітка У цих прикладах передбачається, що N, N1 і N2 – змінні типу INTEGER, що Q, Q1 і Q2 – змінні типу QTY і що – являє собою поліморфний оператор, який застосовується і до цілих числах, і до значень кількості

Отже, оскільки значення завжди типізовані, висловлювання, подібні тим, що кількість певною постачання одно 100, є вкрай неприпустимими Кількість – це значення типу QTY, а не значення типу INTEGER Тому стосовно аналізованої поставці ми зобовязані застосовувати більш правильний спосіб

позначення кількості – QTY (IOO), а не просто вказувати число 100 як таке Але в неформальному спілкуванні ми зазвичай не прагнемо дотримуватися такі вимоги до точності, тому використовуємо (наприклад) 100, як зручне скорочення для QTY (100) Зокрема, слід зазначити, що подібні скорочення застосовуються також у визначеннях баз даних постачальників і деталей, а також постачальників, деталей і проектів (див рис 38 та 45, наведені, відповідно, на стор 119 і 154)

Нижче наведено ще один приклад визначення типу

TYPE LINESEG POSSREP { BEGIN POINT, END POINT }

Тип LINESEG визначає відрізки прямих Даний приклад ілюструє таку особливість, що будь-яке конкретне можливе подання може бути задане в термінах визначених користувачем типів, а не тільки за допомогою типів, визначених системою, як у всіх попередніх прикладах (іншими словами, визначається користувачем тип є таким же повноцінним, як і визначається системою)

Нарешті, слід зазначити, що у всіх прикладах цього підрозділу, що стосуються можливих уявлень і повязаних з ними конструкцій, розглядалися тільки скалярні типи Але можливі уявлення мають і нескалярние типи Ми повернемося до цього питання в розділі 56

6 Це твердження є справедливим також і по відношенню, зокрема, до вбудованих типам, незважаючи на те, що при визначенні відповідних селектор і операторів ТНЕ_ іноді могли застосовуватися трохи інші синтаксичні та інші правила в порівнянні з описаними в цьому розділі (частково це обумовлено історично сформованими причинами) Додаткові відомості наведені в [33]

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

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*