ProgramlamaRust backend geliştirici

Rust'taki modül sistemi (module system) nasıl çalışır ve iç içe geçmiş modüllerin görünürlüğü ve dosya sistemi yapısı dikkate alınarak büyük projelerin nasıl düzgün bir şekilde organize edileceği konusunda doğru bir yaklaşım nedir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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:

  • Varsayılan olarak öğeler özeldir, ihracat için pub belirtimi gereklidir.
  • Modül yapısı dosya sistemine yansır (mod.rs ve alt modüller).
  • İç mantığı izole etme ve "temiz" kamu API'leri oluşturma imkanı.

Kandırmaca soruları.

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.

Tipik hatalar ve anti-patterner

  • Dosya yapısının kötü organizasyonu (mod.rs'nin eksikliği, farklı parçalar içerisinde modüllerin tekrarlayan tanımları).
  • Bir struct alanına pub olmadan erişme, kamu API'si planlandığında.
  • Gereksiz yere her yerde pub kullanmak, saldırı yüzeyini artırır ve kapsüllemeyi azaltır.

Gerçek hayattan örnek

Olumsuz durum

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:

  • Başlangıçta hızlı geliştirme, dosya organizasyonu için daha az zaman.

Eksiler:

  • Bağımlılıkların "şişmesi" ortaya çıkar, özel detaylar dışa açık hale gelir, kodun sürdürülmesi zorlaşır.

Olumlu durum

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:

  • Temiz API, kolay bakım, kodun kapsüllenmesi sayesinde güvenliğin artması.

Eksiler:

  • Yapının başlangıçta planlanmasını gerektirir, bazen ihracatlar için daha fazla kod gerektirebilir.