PureBasic

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