Programowanie D - moduły

Moduły są elementami składowymi D. Opierają się na prostej koncepcji. Każdy plik źródłowy jest modułem. W związku z tym pojedyncze pliki, w których piszemy programy, to poszczególne moduły. Domyślnie nazwa modułu jest taka sama, jak nazwa pliku bez rozszerzenia .d.

W przypadku jawnego określenia nazwa modułu jest definiowana przez słowo kluczowe module, które musi występować jako pierwsza linia nie będąca komentarzem w pliku źródłowym. Na przykład załóżmy, że nazwa pliku źródłowego to „pracownik.d”. Następnie nazwa modułu jest określana za pomocą słowa kluczowego modułu, po którym następuje pracownik . Jest jak pokazano poniżej.

module employee;

class Employee {
   // Class definition goes here. 
}

Linia modułu jest opcjonalna. Jeśli nie jest określony, jest taki sam jak nazwa pliku bez rozszerzenia .d.

Nazwy plików i modułów

D obsługuje Unicode w kodzie źródłowym i nazwach modułów. Jednak obsługa Unicode w systemach plików jest różna. Na przykład, chociaż większość systemów plików Linuksa obsługuje Unicode, nazwy plików w systemach plików Windows mogą nie rozróżniać małych i dużych liter. Ponadto większość systemów plików ogranicza liczbę znaków, których można używać w nazwach plików i katalogów. Ze względu na przenośność zalecam używanie tylko małych liter ASCII w nazwach plików. Na przykład „pracownik.d” byłby odpowiednią nazwą pliku dla klasy o nazwie pracownik.

W związku z tym nazwa modułu składałaby się również z liter ASCII -

module employee;  // Module name consisting of ASCII letters 

class eëmployëë { }

Pakiety D.

Połączenie powiązanych modułów nazywane jest pakietem. Pakiety D to również prosta koncepcja: pliki źródłowe, które znajdują się w tym samym katalogu, są traktowane jako należące do tego samego pakietu. Nazwa katalogu staje się nazwą pakietu, którą należy również podać jako pierwszą część nazw modułów.

Na przykład, jeśli „pracownik.d” i „biuro.d” znajdują się w katalogu „firma”, to określenie nazwy katalogu wraz z nazwą modułu spowoduje, że będą one częścią tego samego pakietu -

module company.employee; 
 
class Employee { }

Podobnie w przypadku modułu biurowego -

module company.office; 
 
class Office { }

Ponieważ nazwy pakietów odpowiadają nazwom katalogów, nazwy pakietów modułów, które są głębsze niż jeden poziom katalogu, muszą odzwierciedlać tę hierarchię. Na przykład, jeśli katalog „firma” zawierałby katalog „oddział”, nazwa modułu w tym katalogu obejmowałaby również oddział.

module company.branch.employee;

Korzystanie z modułów w programach

Słowo kluczowe import, którego używaliśmy do tej pory w prawie każdym programie, służy do wprowadzenia modułu do aktualnego modułu -

import std.stdio;

Nazwa modułu może również zawierać nazwę pakietu. Na przykład std. część powyżej wskazuje, że stdio to moduł, który jest częścią pakietu std.

Lokalizacje modułów

Kompilator znajduje pliki modułów, konwertując nazwy pakietów i modułów bezpośrednio na nazwy katalogów i plików.

Na przykład dwa moduły pracownik i biuro będą znajdować się odpowiednio jako „firma / pracownik.d” i „zwierzę / biuro.d” (lub „firma \ pracownik.d” i „firma \ biuro.d”, w zależności od system plików) dla company.employee i company.office.

Długie i krótkie nazwy modułów

Nazwy używane w programie można przeliterować wraz z nazwami modułów i pakietów, jak pokazano poniżej.

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

Długie nazwy zwykle nie są potrzebne, ale czasami występują konflikty nazw. Na przykład, odwołując się do nazwy, która pojawia się w więcej niż jednym module, kompilator nie może zdecydować, o którą z nich chodzi. Poniższy program podaje długie nazwy, aby rozróżnić dwie oddzielne struktury pracowników, które są zdefiniowane w dwóch oddzielnych modułach: firma i uczelnia. .

Pierwszy moduł pracownika w folderze firmowym jest następujący.

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

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

Drugi moduł dla pracowników w folderze college jest następujący.

module college.employee;
  
import std.stdio;  

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

Główny moduł hello.d powinien zostać zapisany w folderze zawierającym foldery uczelni i firm. Jest to następujące.

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(); 
}

Słowo kluczowe import nie jest wystarczające, aby moduły stały się częściami programu. Po prostu udostępnia funkcje modułu wewnątrz bieżącego modułu. Tyle potrzeba tylko do skompilowania kodu.

Aby można było zbudować powyższy program, w wierszu kompilacji należy również określić „firma / pracownik.d” i „uczelnia / pracownik.d”.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

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