Module (Модули)
DeclareModule <name> ... EndDeclareModule Module <name> ... EndModule UseModule <name> UnuseModule <name>
Описание
Модули - это простой способ изолировать часть кода от основного кода, позволяя повторно использовать код и обмениваться им без риска конфликта имен. В некоторых других языках программирования модули известны как "Пространства Имен". Модуль должен иметь раздел DeclareModule (который является общедоступным интерфейсом) и связанный раздел Module (который является его реализацией).Только элементы, объявленные в разделе DeclareModule, будут доступны снаружи модуля. Весь код в разделе Module будет приватным для этого модуля. Элементы основного кода, такие как процедуры, переменные и т.д., не будут доступны внутри модуля, даже если они объявлены как global. Модуль можно рассматривать как черный ящик, отдельный лист кода, где имена элементов не могут конфликтовать с именами элементов основного кода. Это облегчает написание кода, например, мы можем использовать простые имена, которые можно повторно использовать в каждом модуле без риска конфликта.
В разделе DeclareModule допускаются следующие элементы: Процедура (допускается только объявление процедур), Структура, Макрос, Переменная, Константа, Перечисление, Массив, Связный Список, Хеш-карта и Метка.
Чтобы получить доступ к элементу модуля извне, необходимо указать имя модуля и разделитель '::'. При явном указании имени модуля, элемент доступен везде в исходном коде, даже в другом модуле. Все элементы в разделе DeclareModule могут быть автоматически импортированы в другой модуль или в основной код, с помощью команды UseModule. В этом случае, если будет конфликт имен, элементы модуля не будут импортированы, и будет сгенерирована ошибка компилятора. UnuseModule удаляет элементы модуля. UseModule не обязателен, чтобы получить доступ к элементу модуля, но имя модуля указано должно быть.
Для обмена информацией между модулями, можно создать общий модуль, а затем использовать его любым модулем, при необходимости. Это простой способ сделать глобальные данные доступными для всех модулей.
Все внутренние команды, структуры и константы PureBasic являются изначально доступными элементами в модулях. Поэтому элементы модуля нельзя называть как внутренние команды, структуры или константы PureBasic.
Весь код в разделе DeclareModule, и разделах Module выполняется как любой другой код, когда процесс выполнения программы достигает модуля.
Если в модуле используются ключевые слова Define, EnableExplicit и EnableASM, они не действуют вне этого модуля, и наоборот.
Примечание: модули не обязательны в PureBasic, но рекомендуются, при разработке больших проектов. Они помогают создавать более удобный в сопровождении код, даже если добавление модулей слегка увеличивает объём кода. Наличие раздела DeclareModule делает модуль в значительной степени само-документированным, для повторного использования и обмена.
Пример
; Каждый элемент в этом разделе, будет доступен снаружи ; DeclareModule Ferrari #FerrariName$ = "458 Italia" Declare CreateFerrari() EndDeclareModule ; Все элементы в этом разделе будет приватными. Каждое имя, может использоваться без конфликта ; Module Ferrari Global Initialized = #False Procedure Init() ; Приватная процедура init() (недоступна извне модуля) If Initialized = #False Initialized = #True Debug "InitFerrari()" EndIf EndProcedure Procedure CreateFerrari() Init() Debug "CreateFerrari()" EndProcedure EndModule Procedure Init() ; Основная процедура Init(), не конфликтует с процедурой Init() модуля Ferrari Debug "Main init()" EndProcedure Init() Ferrari::CreateFerrari() Debug Ferrari::#FerrariName$ Debug "------------------------------" UseModule Ferrari ; Теперь импортируем все общедоступные элементы непосредственно в основную программу CreateFerrari() Debug #FerrariName$
Пример: С общим модулем
; Общий модуль, который будет использоваться другими модулями для обмена данными. ; DeclareModule Cars Global NbCars = 0 EndDeclareModule Module Cars EndModule ; Первый автомобильный модуль ; DeclareModule Ferrari EndDeclareModule Module Ferrari UseModule Cars NbCars+1 EndModule ; Второй автомобильный модуль ; DeclareModule Porche EndDeclareModule Module Porche UseModule Cars NbCars+1 EndModule ; Основная программа ; Debug Cars::NbCars