Перейти к основному содержимому
Версия: 4.x

How-to: Пространства имен

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

Создадим два модуля UseCaseNamePurchase и UseCaseNameSale, которые объявляют логику заказов на закупку и продажу:

MODULE UseCaseNamePurchase;

NAMESPACE Purchase;

CLASS Order 'Заказ';
date 'Дата' = DATA DATE (Order);
number 'Номер' = DATA INTEGER (Order);

FORM orders 'Заказы на закупку'
OBJECTS o = Order
PROPERTIES(o) date, number
;

NAVIGATOR {
NEW orders;
}
MODULE UseCaseNameSale;

NAMESPACE Sale;

CLASS Order 'Заказ';
date 'Дата' = DATA DATE (Order);
number 'Номер' = DATA INTEGER (Order);

FORM orders 'Заказы на продажу'
OBJECTS o = Order
PROPERTIES(o) date, number
;

NAVIGATOR {
NEW orders;
}

В обоих из них объявлен класс Order, но так как у модулей разные пространства имен, то у первого класса оно будет Purchase, а у второго Sale.

Объявим тестовый модуль с пространством имен Test, который будет одновременно зависеть и от первого, и от второго модуля:

REQUIRE UseCaseNamePurchase, UseCaseNameSale;

NAMESPACE Test;

messagePurchaseCount 'Вывести кол-во заказов на закупку' {
MESSAGE GROUP SUM 1 IF o IS Purchase.Order;
}
messageSaleCount 'Вывести кол-во заказов на продажу' {
MESSAGE GROUP SUM 1 IF o IS Sale.Order;
}

NAVIGATOR {
NEW ACTION messagePurchaseCount;
NEW ACTION messageSaleCount;
}

При попытке обратиться к классу Order без явного указания пространства имен будет выдана ошибка:

Все такие обращения требуют явного указания пространства имен.

В случае, если пространство имен модуля совпадает с пространством искомого элемента системы (например, Purchase)

NAMESPACE Purchase;

или указан приоритет пространств имен через инструкцию PRIORITY

PRIORITY Purchase;

то можно пространство имен не указывать

messagePurchaseCount 'Вывести кол-во заказов на закупку' {
MESSAGE GROUP SUM 1 IF o IS Order;
}
messageSaleCount 'Вывести кол-во заказов на продажу' {
MESSAGE GROUP SUM 1 IF o IS Sale.Order;
}

NAVIGATOR {
NEW ACTION messagePurchaseCount;
NEW ACTION messageSaleCount;
}

Без указания пространства имен будет использоваться класс из Purchase. При этом остается возможность в явную указать пространство имен (например, Sale).