Tarihsel olarak, Rust başlangıçtan itibaren ölçeklenebilir, güvenilir sistem programları yazmak için tasarlandı. Modül sistemi, isim alanlarının kesin bir şekilde ayrılması, kodun izolasyonu ve büyük projelerin isim çakışmaları olmadan organizasyonu için oluşturuldu. Modüller, kodu yapılandırmaya, uygulama detaylarını gizlemeye ve kamu API'sini yönetmeye olanak tanır.
Sorun, proje büyüdüğünde bileşenlerin izolasyonu, kodun ortak kullanımı ve görünürlük yönetimi ile ilgilidir. Hatalar genellikle pub, pub(crate) gibi anahtar kelimelerin yanlış kullanımıyla ve dizin ve dosya yapısının eksik veya hatalı organizasyonu ile ilişkilidir.
Çözüm: Rust’ta modül, mod anahtar kelimesi ile tanımlanır; dosyalar ve dizinler isim alanını yapılandırarak hiyerarşiyi vurgular. Varsayılan olarak her şey özel (private) olup, pub, pub(crate), pub(super) anahtar kelimeleri görünürlüğü yönetmeyi sağlar. İhracatların, takma adların (alias) doğru kullanımı ve projenin modüllere düzgün bir şekilde bölünmesi, kodun ölçeklenebilir, sürdürülebilir ve güvenli olmasını sağlar.
Kod örneği:
// src/lib.rs mod network; pub use network::client::Client; // src/network/mod.rs pub mod client; // src/network/client.rs pub struct Client { pub name: String, }
Anahtar özellikler:
Dizin yapısı modül tanımlarıyla uyuşmuyorsa ne olur?
Kod derlenmez: Rust, dosyalar ve modüller arasında katı bir uyum bekler (örneğin, mod foo tanımlandıysa, foo.rs dosyası veya foo/mod.rs dizini olmalıdır).
pub(crate) dış kullanıcılardan uygulamanın gizlenmesi ancak aynı crate içindeki tüm modüllere erişim sağlaması için kullanılabilir mi?
Evet, pub(crate) öğeyi, aynı crate içindeki herhangi bir modülden görünür hale getirir, ancak bu crate'i bağımlılık olarak kullanan dış projeler için görünmez kılar.
Kök dosyadan derinlemesine yer alan bir modülden fonksiyonları nasıl ithal edebilirim, ancak kamu yeniden dışa aktarma (pub use) olmadan?
Hiyerarşi boyunca doğrudan referans ile: crate::module::submodule::function. Pub use olmadan, yalnızca crate içinde erişilebilir olacaklardır.
Ağ modülünde, sunucu, istemci, protokol ayrıştırıcı bileşenlerinin tamamı network.rs dosyasında yer almaktadır. Her şey pub olarak tanımlanmıştır ve test için iç kod doğrudan bağlanmıştır. Zamanla gereksiz bir bağlılık artar ve kamu arayüzünü uygulamadan ayırmak zorlaşır.
Artılar:
Eksiler:
Ağ, client, server, protocol alt modüllerine ayrılmıştır. Yalnızca kamu arayüzleri ağdan dışa aktarılır, API kompakt, detaylar kapsüllenmiştir. Her modül için testler ayrıdır.
Artılar:
Eksiler: