D Программирование - Модули

Модули - это строительные блоки D. Они основаны на простой концепции. Каждый исходный файл - это модуль. Соответственно, отдельные файлы, в которые мы пишем программы, являются отдельными модулями. По умолчанию имя модуля совпадает с его именем файла без расширения .d.

При явном указании имя модуля определяется ключевым словом module, которое должно появиться как первая строка без комментариев в исходном файле. Например, предположим, что имя исходного файла - «employee.d». Затем имя модуля указывается ключевым словом модуля, за которым следует сотрудник . Это как показано ниже.

module employee;

class Employee {
   // Class definition goes here. 
}

Строка модуля не является обязательной. Если не указано, это то же самое, что имя файла без расширения .d.

Имена файлов и модулей

D поддерживает Unicode в исходном коде и именах модулей. Однако поддержка Unicode файловыми системами различается. Например, хотя большинство файловых систем Linux поддерживают Unicode, имена файлов в файловых системах Windows могут не различать строчные и прописные буквы. Кроме того, большинство файловых систем ограничивают символы, которые могут использоваться в именах файлов и каталогов. По причинам переносимости я рекомендую использовать только строчные буквы ASCII в именах файлов. Например, «employee.d» будет подходящим именем файла для класса с именем employee.

Соответственно, имя модуля также будет состоять из букв ASCII -

module employee;  // Module name consisting of ASCII letters 

class eëmployëë { }

D Пакеты

Комбинация связанных модулей называется пакетом. Пакеты D также представляют собой простую концепцию: исходные файлы, находящиеся в одном каталоге, считаются принадлежащими одному пакету. Имя каталога становится именем пакета, которое также необходимо указывать в качестве первых частей имен модулей.

Например, если «employee.d» и «office.d» находятся внутри каталога «company», то указание имени каталога вместе с именем модуля делает их частью одного пакета -

module company.employee; 
 
class Employee { }

Аналогично для офисного модуля -

module company.office; 
 
class Office { }

Поскольку имена пакетов соответствуют именам каталогов, имена пакетов модулей, которые находятся на более глубоком уровне, чем один уровень каталогов, должны отражать эту иерархию. Например, если каталог «компания» включает в себя каталог «ветвь», имя модуля внутри этого каталога также будет включать ветку.

module company.branch.employee;

Использование модулей в программах

Ключевое слово import, которое мы до сих пор использовали почти во всех программах, предназначено для введения модуля в текущий модуль -

import std.stdio;

Имя модуля также может содержать имя пакета. Например, std. часть выше указывает, что stdio - это модуль, который является частью пакета std.

Расположение модулей

Компилятор находит файлы модулей, преобразовывая имена пакетов и модулей непосредственно в имена каталогов и файлов.

Например, два модуля «сотрудник» и «офис» будут расположены как «компания / сотрудник.d» и «животное / офис.d» соответственно (или «компания \ сотрудник.d» и «компания \ офис.d», в зависимости от файловая система) для company.employee и company.office.

Длинные и короткие имена модулей

Имена, которые используются в программе, могут быть дополнены именами модулей и пакетов, как показано ниже.

import company.employee; 
auto employee0 = Employee(); 
auto employee1 = company.employee.Employee();

Длинные имена обычно не нужны, но иногда возникают конфликты имен. Например, при обращении к имени, которое появляется более чем в одном модуле, компилятор не может решить, какое из них имеется в виду. Следующая программа составляет длинные имена, чтобы различать две отдельные структуры сотрудников , которые определены в двух отдельных модулях: компания и колледж. .

Первый модуль сотрудников в папке Company выглядит следующим образом.

module company.employee; 
 
import std.stdio;
  
class Employee {
   public: 
      string str; 

   void print() {
      writeln("Company Employee: ",str); 
   } 
}

Второй модуль сотрудников в папке College выглядит следующим образом.

module college.employee;
  
import std.stdio;  

class Employee {
   public: 
      string str;
	
   void print() {
      writeln("College Employee: ",str); 
   } 
}

Основной модуль hello.d должен быть сохранен в папке, содержащей папки колледжа и компании. Это так.

import company.employee; 
import college.employee; 
 
import std.stdio;  

void main() {
   auto myemployee1 = new company.employee.Employee();
   myemployee1.str = "emp1"; 
   myemployee1.print();
   
   auto myemployee2 = new college.employee.Employee(); 
   myemployee2.str = "emp2"; 
   myemployee2.print(); 
}

Ключевого слова import недостаточно, чтобы модули стали частью программы. Он просто делает доступными функции модуля внутри текущего модуля. Это нужно только для компиляции кода.

Для построения вышеуказанной программы в строке компиляции также должны быть указаны «company / employee.d» и «college / employee.d».

Когда приведенный выше код компилируется и выполняется, он дает следующий результат:

$ dmd hello.d company/employee.d college/employee.d -ofhello.amx 
$ ./hello.amx 
Company Employee: emp1 
College Employee: emp2