SCHEMA Graphics; , TYPE Colours = ENUMERATION OF (red, green, blue, white, black);
END TYPE;
ENTITY GraphicalObject ABSTRACT SUPERTYPE;
colour: Colours;
END ENTITY; — QraphicalObject ENTITY Point;
x: REAL;
у: REAL;
z: OPTIONAL REAL;
. WHERE
is_referenced:
SIZEOF (USEDIN (SELF, •GRAFICS.LINE.STARTP')) + SIZEOF (USEDIN (SELF, 'GRAFICS.LINE.ENDP' )) + SIZEOF (USEDIN (SELF, •GRAF1CS.CIRCLE.MIDP'))
>=1;
END_ENTITY; — Point
ENTITY Line SUBTYPE OF (GraphicalObject);
startp: Point;
endp : Point;
DERIVE
length : REAL := distance (startp, endp);
WHERE
different_points: startp о endp;
END_ENTITY; — Line ENTITY Circle SUBTYPE OF (GraphlcalObJect);
midp : Point;
radius: REAL;
DERIVE
area : REAL := PI * radius " radius;
WHERE
positive: radius >0;
END_ENTITY; — Circle ENTITY Drawing;
name : STRING;
elements: SET OF GraphicalObject;
UNIQUE
identifier: name;
END_ENTITY; — Drawing END_SCHEMA;
Правило UNIQUE
В качестве следующего шага схема расширяется таким образом, что становится возможным отражать другие различные чертежи. Чтобы отличать чертежи друг от друга, каждому чертежу дается имя. Это имя должно быть однозначным, то есть оно нс может быть дано двум или более чертежам. Условие однозначности определяется в EXPRESS с помощью спецификации UNIQUE. Это правило однозначности состоит из необязательного имени и перечисления одного или нескольких атрибутов.
Функция нулевого значения
<.3десь может быть несколько упрощена функция задания расстояния distance, в которой применена новая стандартная функция языка EXPRESS. Эта новая функция называется NVL или Null Value Function.
NVL (a, b : GENERIC): GENERIC;
Эта функция получает два параметра любого типа (специальный тип GENERIC используется для формального параметра и заменяет любой другой тип). Определение этой функции может выглядеть следующим образом:
FUNCTION NVL (a. b : GENERIC): GENERIC;
IF EXISTS (a) THEN RETURN (a);
ELSE
RETURN (b);
END IF;
END_FUNCTION;
Первый параметр проверяется на существование значения. Если этот параметр имеет значение, то он возвращается функцией. В противном случае возвращается второй параметр. С
использованием этой функции distance может выглядеть следующим образом:
FUNCTION distance (p1, p2 : Point): REAL;
LOCAL
length : REAL := 0.0;
vector: Point := Point (0.0, 0.0, 0.0);
ENDJ.OCAL;
vector.x := p2.x - p1 .x;
vector.y := p2.y- p1 .у;
vector.z := NVL (p2.z, 0.0) - NVL (p1.z, 0.0);
length := SQRT(
vector.x« vector-x + vector.y« vector.y + vector.z « vector.z
);
RETURN (length);
END_FUNCTION; — distance
В заключение должно быть упрощенно правило is_referenced для точки. Предположим, что схема должна быть еще дополнена, чтобы кроме линий и окружностей могли отображаться свободно определяемые кривые. Тогда кривая будет описана двумя точками и отношениями между этими точками. Но это бы означало, что точки опять будут выполнять особенные роли. Эти роли должны быть явно добавлены в локальные правила entity Point. Так как это, конечно, не самое элегантное и надежное решение, то применяется стандартная функция ROLESOF.
FUNCTION ROLESOF (a : GENERIC): SET OF STRING;
Эта функция получает в качестве параметра экземпляр любого entity и возвращает для этого экземпляра множество всех имен ролей, которые играет этот экземпляр. Таким образом легко проверить, имеются ли ссылки на определенный экземпляр, то есть выполняется ли вообще роль. Следовательно, пример можно упростить следующим образом:
WHERE
•^.referenced : SIZEOF (ROLESOF (SELF)) >= 1:
Ниже еще раз полностью изображена схема. SCHEMA Graphics;
TYPE Colours = ENUMERATION OF (red, green, blue, white, black);
ENO_TYPE;
ENTITY GraphicalObject ABSTRACT SUPERTYPE;
colour: Colours;
END_ENTITY; — GraphicalObject
ENTITY Point;
x: REAL;
<• у : REAL;
Z : OPTIONAL REAL;
WHERE isJ-eferenced : SIZEOF (ROLESOF (SELF)) >= 1;
END_ENT1TY; — Point
ENTITY Line SUBTYPE OF (GraphicalObject);
startp: Point;
endp : Point;
DERIVE
length : REAL := distance (startp, endp);
WHERE
(llfferent_points: startp <> end?;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.