ProgramlamaBackend Geliştirici

Erişim modifikatörlerinin (visibility modifiers) Rust'taki yapıların metodları ve alanları için nasıl çalıştığını açıklayın ve iç içe yapılardaki görünürlük gibi özel durumları belirtin?

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

Cevap

Rust programlama dilinde yapıların metodları ve alanları için erişim düzeyi (görünürlük), pub, pub(crate), pub(super) gibi modifikatörler ve modifikatör yokluğu (varsayılan olarak özel) tarafından kontrol edilir.

Konunun Geçmişi

Rust, bileşenlerin güvenliği ve izolasyonu sağlamak için tasarlanmıştır. Yapıların iç kısımlarına erişimi kontrol etmek, verilerin kapsüllenmesine ve uygulama ayrıntılarının gizlenmesine olanak tanır, yalnızca gerekli arayüzlerin halka açık olmasını sağlar.

Sorun

Geliştiriciler genellikle bir yapının halka açık olduğu, ancak alanlarının özel kaldığı veya alanların halka açık olmasının, yapı ya da modül görünürlüğünün kısıtlamaları nedeniyle yetersiz olduğu durumlarla karşılaşmaktadır. İç içe seviyeleri anlamak özellikle zordur: halka açık bir iç yapı, iç içe bulunduğu modül gizlenmişse erişilemez ve bunun tersi de geçerlidir.

Çözüm

Rust'ta erişim modifikatörleri yapılar, alanlar ve metodlar için geçerli olup, modüller ve fonksiyonlar için de uygulanır. Aşağıdaki erişim düzeyleri mevcuttur:

  • pub — öğeyi her yerden erişilebilir hale getirir.
  • pub(crate) — yalnızca mevcut crate içinde erişilebilir.
  • pub(super) — yalnızca üst modülden erişilebilir.
  • Modifikatör olmadan — öğe mevcut modül içinde özel kalır.

Kod örneği:

mod outer { pub struct PublicStruct { pub field: u32, hidden: u32, } pub(crate) struct CrateStruct { pub value: i32, } struct PrivateStruct { pub secret: i32, } pub mod inner { pub(super) struct SuperStruct { pub super_field: u8, } } }

Anahtara özellikler:

  • Bir alanın ya da metodun görünürlüğü, yapı ya da modülün görünürlüğünü aşamaz.
  • İç içe yapılar için nihai görünürlük, modifikatör ve tüm üst modüllerin görünürlüğünün kesişimi ile belirlenir.
  • Halka açık yapılar, özel alanlarla kapsülleme desenini destekler (kurucular/getter metodları).

Kandırıcı Sorular.

Eğer bir yapı pub olarak tanımlanmışsa ve alanları modifikatör olmadan bırakılmışsa, başka bir modülden erişilebilir mi?

Hayır, yalnızca yapı halka açık hale gelir, ama alanları modül içinde özel kalır. Bir alana erişim için, onun da pub olarak tanımlanması gerekir.

Eğer yapı pub(crate) olarak tanımlanmışsa ve içindeki bir alan pub olarak tanımlanmışsa, ne olur?

Görünürlük, yapının kendisiyle sınırlıdır. Alan pub olsa bile, yapı erişilemediğinden alanına erişim sağlanamaz.

pub(crate) struct Secret { pub data: i32, // pub "pub(crate)" üzerinden erişilemez }

Bir yapıyı özel bir modül içinde pub olarak tanımlayıp dışarıdan ona erişmek mümkün mü?

Hayır. Nihai görünürlük, yapı ile modül arasındaki minimum değerle belirlenir. Modül özel ise, içindeki yapılar ve fonksiyonlar da bu modülün dışına görünmez.

Yaygın Hatalar ve Anti-Desenler

  • Karmaşık API tasarlarken yapıların alanlarını halka açık bırakmak
  • Gereksiz yere pub ile yapının görünürlüğünü açmak
  • Modül kısıtlamalarını görmezden gelerek bir alanın görünürlüğünü artırmaya çalışmak

Gerçek Hayat Örneği

Olumsuz Durum

Projede tüm yapı halka açık ve alanlar açık olarak tasarlanmış, geliştirme hızlandırılmıştır. Daha sonra alanlara doğrudan erişim sağlandığı için geriye dönük uyumluluk ve erişim kontrolü sağlamak zorlaşmıştır.

Artılar:

  • Hızlı başlangıç; getter yazmaya gerek yok

Eksiler:

  • Veri değişiklikleri üzerinde kontrol yok; kapsülleme bozuldu
  • İç yapı değişikliklerinde zorluk

Olumlu Durum

Halka açık bir yapı, özel alanlar ve halka açık kurucu/erişim yöntemleri ile tasarlanmıştır. Yapı yalnızca gerekli modül seviyesinde dışa aktarılmaktadır.

Artılar:

  • Güvenilir kapsülleme; kullanışlı API
  • İç uygulamayı değiştirirken kod kullanıcılarını kırmadan değişiklik yapma imkanı

Eksiler:

  • Ekstra metodlar yazmak gerekiyor; biraz daha fazla kod