การเขียนโปรแกรม D - โมดูล
โมดูลเป็นส่วนประกอบพื้นฐานของ D. พวกเขาตั้งอยู่บนแนวคิดง่ายๆ ไฟล์ต้นฉบับทุกไฟล์เป็นโมดูล ดังนั้นไฟล์เดียวที่เราเขียนโปรแกรมจึงเป็นแต่ละโมดูล ตามค่าเริ่มต้นชื่อของโมดูลจะเหมือนกับชื่อไฟล์ที่ไม่มีนามสกุล. d
เมื่อระบุอย่างชัดเจนชื่อของโมดูลจะถูกกำหนดโดยคีย์เวิร์ดของโมดูลซึ่งจะต้องปรากฏเป็นบรรทัดแรกที่ไม่ใช่ความคิดเห็นในไฟล์ต้นฉบับ ตัวอย่างเช่นสมมติว่าชื่อของไฟล์ต้นฉบับคือ "พนักงาน d" จากนั้นชื่อของโมดูลระบุโดยโมดูลคำหลักตามด้วยการทำงานของพนักงาน ดังที่แสดงด้านล่าง
module employee;
class Employee {
// Class definition goes here.
}
สายโมดูลเป็นทางเลือก เมื่อไม่ได้ระบุจะเหมือนกับชื่อไฟล์ที่ไม่มีนามสกุล. d
ชื่อไฟล์และโมดูล
D สนับสนุน Unicode ในซอร์สโค้ดและชื่อโมดูล อย่างไรก็ตามการสนับสนุน Unicode ของระบบไฟล์แตกต่างกันไป ตัวอย่างเช่นแม้ว่าระบบไฟล์ Linux ส่วนใหญ่จะรองรับ Unicode แต่ชื่อไฟล์ในระบบไฟล์ Windows อาจไม่แยกความแตกต่างระหว่างอักษรตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ นอกจากนี้ระบบไฟล์ส่วนใหญ่ จำกัด อักขระที่สามารถใช้ในชื่อไฟล์และไดเร็กทอรี ด้วยเหตุผลด้านความสามารถในการพกพาฉันขอแนะนำให้คุณใช้ตัวอักษร ASCII ตัวพิมพ์เล็กในชื่อไฟล์เท่านั้น ตัวอย่างเช่น "staff.d" จะเป็นชื่อไฟล์ที่เหมาะสมสำหรับคลาสชื่อพนักงาน
ดังนั้นชื่อของโมดูลจะประกอบด้วยตัวอักษร ASCII เช่นกัน -
module employee; // Module name consisting of ASCII letters
class eëmployëë { }
D แพ็คเกจ
การรวมกันของโมดูลที่เกี่ยวข้องเรียกว่าแพ็คเกจ แพ็กเกจ D เป็นแนวคิดง่ายๆเช่นกัน: ซอร์สไฟล์ที่อยู่ในไดเร็กทอรีเดียวกันจะถือว่าเป็นของแพ็กเกจเดียวกัน ชื่อของไดเร็กทอรีกลายเป็นชื่อของแพ็กเกจซึ่งต้องระบุเป็นส่วนแรกของชื่อโมดูลด้วย
ตัวอย่างเช่นถ้า "staff.d" และ "office.d" อยู่ในไดเร็กทอรี "company" การระบุชื่อไดเร็กทอรีพร้อมกับชื่อโมดูลจะทำให้เป็นส่วนหนึ่งของแพ็กเกจเดียวกัน -
module company.employee;
class Employee { }
ในทำนองเดียวกันสำหรับโมดูลสำนักงาน -
module company.office;
class Office { }
เนื่องจากชื่อแพ็กเกจสอดคล้องกับชื่อไดเร็กทอรีชื่อแพ็กเกจของโมดูลที่ลึกกว่าระดับไดเร็กทอรีหนึ่งจะต้องแสดงถึงลำดับชั้นนั้น ตัวอย่างเช่นหากไดเร็กทอรี "company" มีไดเร็กทอรี "branch" ชื่อของโมดูลภายในไดเร็กทอรีนั้นจะรวมสาขาด้วย
module company.branch.employee;
การใช้โมดูลในโปรแกรม
คีย์เวิร์ดนำเข้าซึ่งเราใช้ในเกือบทุกโปรแกรมเพื่อแนะนำโมดูลให้กับโมดูลปัจจุบัน -
import std.stdio;
ชื่อโมดูลอาจมีชื่อแพ็กเกจด้วย ตัวอย่างเช่นมาตรฐาน ส่วนด้านบนระบุว่า stdio เป็นโมดูลที่เป็นส่วนหนึ่งของแพ็คเกจ std
ตำแหน่งของโมดูล
คอมไพเลอร์ค้นหาไฟล์โมดูลโดยการแปลงชื่อแพ็กเกจและโมดูลเป็นชื่อไดเร็กทอรีและไฟล์โดยตรง
ตัวอย่างเช่นพนักงานและสำนักงานทั้งสองโมดูลจะอยู่ในชื่อ "บริษัท / พนักงาน d" และ "สัตว์ / office.d" ตามลำดับ (หรือ "บริษัท \ พนักงาน d" และ "บริษัท \ office.d" ขึ้นอยู่กับ ระบบไฟล์) สำหรับ บริษัท พนักงานและ บริษัท สำนักงาน
ชื่อโมดูลแบบยาวและแบบสั้น
ชื่อที่ใช้ในโปรแกรมอาจสะกดด้วยชื่อโมดูลและชื่อแพ็กเกจดังที่แสดงด้านล่าง
import company.employee;
auto employee0 = Employee();
auto employee1 = company.employee.Employee();
โดยปกติไม่จำเป็นต้องใช้ชื่อยาว แต่บางครั้งก็มีความขัดแย้งของชื่อ ตัวอย่างเช่นเมื่ออ้างถึงชื่อที่ปรากฏในโมดูลมากกว่าหนึ่งโมดูลคอมไพลเลอร์ไม่สามารถตัดสินใจได้ว่าหมายถึงอันใด โปรแกรมต่อไปนี้กำลังสะกดชื่อยาว ๆ เพื่อแยกความแตกต่างระหว่างโครงสร้างพนักงานสองชุดที่แยกจากกันซึ่งกำหนดไว้ในโมดูลแยกกันสองโมดูล: บริษัทและวิทยาลัย .
โมดูลพนักงานแรกใน บริษัท โฟลเดอร์มีดังนี้
module company.employee;
import std.stdio;
class Employee {
public:
string str;
void print() {
writeln("Company Employee: ",str);
}
}
โมดูลพนักงานที่สองในโฟลเดอร์คอลเลจมีดังนี้
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();
}
คีย์เวิร์ดนำเข้าไม่เพียงพอที่จะทำให้โมดูลกลายเป็นส่วนหนึ่งของโปรแกรม เพียงแค่ทำให้คุณสมบัติของโมดูลภายในโมดูลปัจจุบันพร้อมใช้งาน สิ่งนั้นจำเป็นสำหรับการคอมไพล์โค้ดเท่านั้น
สำหรับโปรแกรมข้างต้นที่จะสร้างขึ้นต้องระบุ "company / staff.d" และ "college / staff.d" ในบรรทัดการคอมไพล์ด้วย
เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -
$ dmd hello.d company/employee.d college/employee.d -ofhello.amx
$ ./hello.amx
Company Employee: emp1
College Employee: emp2