среда, 29 июля 2015 г.

Коротко. Сделал экспорт словарей

Коротко. Сделал экспорт словарей.

Вдогонку к - Коротко. Сделал чудную штуку - переопределение слов.

Пример:

Вот есть код:

UNIT uA

PROCEDURE A
...
; // A

...

UNIT uB

USES
 uA
;

PROCEDURE B
...
 A // - компилируется, потому, что есть USES uA
; // B

UNIT uC

USES
 uB
;

PROCEDURE C
...
 B // - компилируется, потому, что есть USES uB
 A // - НЕ компилируется, потому, что нет USES uA
; // C

Как исправить ситуацию?

Можно так:

UNIT uA

PROCEDURE A
...
; // A

...

UNIT uB

USES
 uA
;

PROCEDURE B
...
 A // - компилируется, потому, что есть USES uA
; // B

UNIT uC

USES
 uA
 uB
;

PROCEDURE C
...
 B // - компилируется, потому, что есть USES uB
 A // - компилируется, потому, что есть USES uA
; // C

А можно так:

UNIT uA

PROCEDURE A
...
; // A

...

UNIT uB

USES
 uA
;

EXPORTS uA // - экспортируем модуль uA, он будет виден ТЕМ, кто включает в себя НАШ модуль uB

PROCEDURE B
...
 A // - компилируется, потому, что есть USES uA
; // B

UNIT uC

USES
 uB
;

PROCEDURE C
...
 B // - компилируется, потому, что есть USES uB
 A // - компилируется, потому, что в модуле B есть EXPORTS uA
; // C

Зачем это нужно?

А это очень полезно для написания "фасадных слоёв".

Когда слои вроде бы надо и изолировать с одной стороны, а с другой стороны надо давать им "прыгать через голову".

Очень удобно.

Особенно учитывая наличие слова FORGET. Которое позволяет выкинуть слово из области видимости.

Ну и ещё есть конструкция:

EXPORTS *

Это означает - "экспортировать из нашего словаря все словари, которые включены в нас через USES".

А также есть конструкция:

EXPORTS A :: X

Это означает "экспортировать из нашего словаря слово X из словаря A".

А также есть конструкция:

EXPORTS A :: X AS Y

Это означает "экспортировать из нашего словаря слово X из словаря A. Под именем Y".

А вот ещё есть проблема.

Есть Enum = (one, two, three).

В модуле A.

И есть модуль B, который определяет функцию X, которая работает с этим Enum.

Понятное дело, что B делает USES A и видит члены Enum.

А вот есть модуль C, который делает USES B и использует функцию X.

Так вот для того, чтобы ему использовать элементы Enum, то ему надо сделать USES A.

Чтобы "увидеть" one, two, three.

Ну или можно в модуле B сделать EXPORTS A, ну или EXPORTS A :: Enum.

И тогда модулю C не надо будет делать USES A.

Он будет видеть то что ему нужно, через USES B и EXPORTS A :: Enum.

Когда руками все эти USES пишешь - оно ещё ничего... Но когда расставляешь все эти стрелочки на модели, то тут и понимаешь весь "ужас"...

И тут на помощь приходят EXPORTS.

Понимаю, что есть C++ где сквозные include, но там есть другие проблемы. С изоляцией архитектурных слоёв

Да и понятно, что всё это с Python перекликается.

Комментариев нет:

Отправить комментарий