Memisahkan Modul ke dalam Berkas yang Berbeda

Sejauh ini, semua contoh dalam bab ini mendefinisikan beberapa modul dalam satu file. Ketika modul menjadi besar, Anda mungkin ingin memindahkan definisinya ke file terpisah untuk membuat kode lebih mudah dinavigasi.

Sebagai contoh, mari mulai dari kode pada Listing 7-11 yang memiliki beberapa modul restoran. Kita akan mengekstrak modul ke dalam file daripada mendefinisikan semua modul di dalam file akar kerangka. Dalam hal ini, file akar kerangka adalah src/lib.cairo.

Pertama, kita akan mengekstrak modul front_of_house ke dalam file tersendiri. Hapus kode di dalam kurung kurawal untuk modul front_of_house, hanya meninggalkan deklarasi mod front_of_house;, sehingga src/lib.cairo berisi kode seperti yang terlihat pada Listing 7-12. Perlu diingat bahwa ini tidak akan dikompilasi hingga kita membuat file src/front_of_house.cairo seperti yang terlihat pada Listing 7-13.

Nama File: src/lib.cairo

{{#include ../listings/ch07-managing-cairo-projects-with-packages-crates-and-modules/listing_06_12/src/lib.cairo}}

Listing 7-12: Mendeklarasikan modul front_of_house yang tubuhnya akan berada di src/front_of_house.cairo

Selanjutnya, letakkan kode yang berada di dalam kurung kurawal ke dalam file baru bernama src/front_of_house.cairo, seperti yang ditunjukkan pada Listing 7-13. Kompiler tahu untuk mencari di file ini karena menemui deklarasi modul di akar kerangka dengan nama front_of_house.

Nama File: src/front_of_house.cairo

{{#include ../listings/ch07-managing-cairo-projects-with-packages-crates-and-modules/listing_06_13/src/lib.cairo}}

Listing 7-13: Definisi di dalam modul front_of_house di src/front_of_house.cairo

Perhatikan bahwa Anda hanya perlu memuat suatu file menggunakan deklarasi mod sekali dalam pohon modul Anda. Setelah kompiler tahu bahwa file itu bagian dari proyek (dan tahu di mana kode itu berada dalam pohon modul karena di mana Anda menempatkan pernyataan mod), file lain dalam proyek Anda harus merujuk ke kode file yang dimuat menggunakan jalur ke tempat itu dideklarasikan, seperti yang dijelaskan dalam “Paths for Referring to an Item in the Module Tree”. Dengan kata lain, mod bukan operasi "include" yang mungkin telah Anda lihat dalam bahasa pemrograman lain.

Selanjutnya, kita akan mengekstrak modul hosting ke dalam file terpisah. Proses ini sedikit berbeda karena hosting adalah modul anak dari front_of_house, bukan dari modul akar. Kita akan meletakkan file untuk hosting dalam direktori baru yang akan dinamai sesuai dengan leluhurnya dalam pohon modul, dalam hal ini src/front_of_house/.

Untuk memulai memindahkan hosting, kita ubah src/front_of_house.cairo untuk hanya berisi deklarasi modul hosting:

Nama File: src/front_of_house.cairo

mod hosting;

Kemudian, kita membuat direktori src/front_of_house dan sebuah file hosting.cairo untuk berisi definisi yang dibuat di dalam modul hosting:

Nama File: src/front_of_house/hosting.cairo

fn add_to_waitlist() {}

Jika kita malah meletakkan hosting.cairo di dalam direktori src, kompiler akan mengharapkan kode hosting.cairo berada dalam modul hosting yang dideklarasikan di akar kerangka, dan tidak dideklarasikan sebagai anak dari modul front_of_house. Aturan kompiler untuk file mana yang akan diperiksa untuk kode modul mana berarti direktori dan file lebih mendekati pohon modul.

Kita telah memindahkan kode setiap modul ke dalam file terpisah, dan pohon modul tetap sama. Panggilan fungsi di dalam eat_at_restaurant akan berfungsi tanpa modifikasi apa pun, meskipun definisinya berada di file yang berbeda. Teknik ini memungkinkan Anda memindahkan modul ke file baru seiring pertumbuhannya.

Perlu diingat bahwa pernyataan use restaurant::front_of_house::hosting di src/lib.cairo juga tidak berubah, dan use tidak memiliki dampak pada file mana yang dikompilasi sebagai bagian dari crate. Kata kunci mod mendeklarasikan modul, dan Cairo mencari di file dengan nama yang sama dengan modul untuk kode yang masuk ke dalam modul tersebut.

Ringkasan

Cairo memungkinkan Anda membagi paket menjadi beberapa crate dan crate menjadi modul sehingga Anda dapat merujuk pada item yang didefinisikan di satu modul dari modul lainnya. Anda dapat melakukan ini dengan menentukan jalur absolut atau relatif. Jalur-jalur ini dapat dibawa ke dalam lingkup dengan pernyataan use sehingga Anda dapat menggunakan jalur yang lebih pendek untuk penggunaan item tersebut dalam lingkup tersebut. Kode modul secara default bersifat publik.