ProgramlamaBackend Geliştirici

Rust'ta yapıların ve alanlarının kullanımı düzeyinde erişim belirleyicilerinin (visibility modifiers) nasıl çalıştığını açıklayın. İç içe yapıların erişimini yönetmekteki zorluk nedir?

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

Cevap.

Sorunun Tarihi

Rust'ta erişim belirleyicileri (pub, pub(crate), pub(super)) veri ve fonksiyonlara erişimi kapsüllemek ve net bir şekilde kontrol etmek için bir mekanizma olarak ortaya çıkmıştır, C'de bu eksikti. Amaç, modülün elemanlarının görünürlük alanını sınırlamak ve kütüphane kullanıcılarına gerçekten ihtiyaç duydukları şeyleri vermektir.

Problem

Temel zorluk, yapı kendisi yayımlanmış (pub) olsa bile, alanlarının varsayılan olarak özel (private) kalmasıdır. Ayrıca, kapsüllemeyi bozmadan ve API'yi "delik" veya aşırı kapalı hale getirmeden iç içe yapı ve modüllere erişimi nasıl uygun bir şekilde organize edeceğiniz sorusu sıkça gündeme gelir.

Çözüm

Yapılar için alanlar için erişim belirleyicilerini ayrıca belirtmek gerekir. Otomatik olarak oluşturulan yapılar veya saklanan türler tasarlanırken, hangi kısımların dışarıya açılması gerektiğini ve hangilerinin gizli kalması gerektiğini dikkatlice düşünmek önemlidir. Bu, API'nin ve kod yapısının önemli bir parçasıdır.

Kod örneği:

mod outer { pub struct Exposed { pub field: i32, hidden: bool, } } // "field" alanının kullanımı mümkündür, // hidden – mümkün değil. let e = outer::Exposed { field: 42, hidden: true }; println!("{}", e.field); // e.hidden // derleme hatası

Ana özellikler:

  • Yapının tüm alanları varsayılan olarak özel olup, yapı kamuya açık olsa bile.
  • Alanlara erişim açıkça pub veya pub(...) ile onaylanmalıdır.
  • pub(crate) ve pub(super) modüllerin iç yapılarının erişim seviyesini daha hassas bir şekilde kontrol etmeyi sağlar.

Kandırıcı sorular.

Erişim belirleyicisi olarak pub olarak tanımlanmış bir yapı, mevcut modül dışından tamamen erişilemeyecek şekilde olabilir mi?

Evet, eğer yapıdaki tüm alanlar özel kalıyorsa, sadece ismiyle yayımlanmış olur — modül dışından bir örnek oluşturmak veya başlatmak mümkün değildir.

Bir yapının özel alanı kalıtım yoluyla veya başka bir şekilde, erişim belirleyici sistemini atlayarak erişilebilir mi?

Hayır, Rust'ta geleneksel kalıtım OOP dillerindeki gibi yoktur. Özel alanlara erişim, modül tarafından kontrol edilir ve önemli ölçüde sınırlıdır.

Erişim belirleyicileriyle özel bir modül olarak tanımlanan, ancak kamu alanlarına sahip olan bir yapı oluşturulursa ne olur?

Yapı ve alanları, ana modülün dışından görünmez olacaktır — erişim belirleyicileri ana modülün görünürlük alanını aşmaz.

Tipik hatalar ve anti-patentler

  • Yapıyı kamuya açık bırakmak ama kamuya açık alan/metot olmadan — yararsız bir soyutlama.
  • İç detayları açığa çıkararak gereksiz bir pub vermek ve bakımı zorlaştırmak.
  • pub'ın otomatik olarak alanları da erişilebilir hale getirdiğini yanlış bir şekilde düşünmek.

Hayattan bir örnek

** Negatif durum

Kullanıcı yapıyı pub olarak tanımladı ama tüm alanlar özel kaldı. Sonuç olarak, dış kod bunu düzgün bir şekilde kullanamaz, ne bir örnek oluşturabilir ne de değerleri alabilir.

Artılar:

  • İstemeden erişim alanını sınırlamak iç verileri korur.

Eksiler:

  • Yapıyı modül dışından kullanmak mümkün olmayacak, bu düşünülse bile.

** Pozitif durum

Kullanıcı sadece gerekli alanları pub ile açtı ve hassas detayları özel bıraktı. Erişim için getter/setter'lar kullanıldı.

Artılar:

  • Kapsüllenme ve arayüzün istikrarı garantisi.

Eksiler:

  • Daha fazla şablon kodu gerektirir (getter'lar/setter'lar).