ProgramlamaPerl geliştirici, Backend geliştirici, Perl modül geliştirici

Perl'de fonksiyonlara ve değişkenlere erişim modifikatörleri nasıl uygulanmıştır? Diğer programlama dillerinde bulunan public/private/protected sisteminin neden Perl'de bulunmadığını ve Perl'de modül içindeki verilere erişimin nasıl kısıtlandığını açıklayınız.

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

Cevap.

Perl'de klasik bir erişim modifikatörleri sistemi, yani public/private/protected yoktur. Fonksiyonlara ve verilere erişim yönetimi tamamen anlaşmalar ve değişkenlerin kapsamı ile yapılmaktadır.

  • Modüldeki değişkenlere erişimi kısıtlamak için my anahtar kelimesi (dosya veya blok içinde leksik erişim) ve sembollerin dışa aktarımı (Exporter veya kendi mekanizmaları aracılığıyla) kullanılır.
  • Dışa aktarılmayan alt programlar (@EXPORT, @EXPORT_OK), varsayılan olarak modül için "içsel" kalırken, istenirse her zaman paket ön eki ile açıkça çağrılabilirler.
  • İçsel fonksiyonlar ve değişkenler genellikle alt çizgi (_internal_sub) ile başlar; bu, gizlilik hakkında bir anlaşma işlevi görür.

Örnek:

package MyLib; use Exporter 'import'; our @EXPORT_OK = qw(public_func); my $secret = 123; # Dışarıdan erişilemez. sub public_func { _internal_func(); } sub _internal_func { print "Bu içtsel! "; } 1;

İncelenmesi gereken soru.

Perl modülünün özel bir fonksiyonunu dışarıdan çağrılmaktan koruyan önlemler nelerdir? Onu doğrudan çağırmak mümkün mü?

Cevap: Aslında, bir paketin herhangi bir alt programını tam adıyla çağırmak mümkündür: MyLib::_internal_func(). Perl bu çağrıyı teknik olarak kısıtlamaz — koruma sadece anlaşma seviyesindedir.

Konuyla ilgili soruların karmaşaya yol açtığı gerçek hata örnekleri.


Hikaye

Geliştirici, @EXPORT_OK ile kısıtlama yapmayı unutarak modülden çok fazla fonksiyonu dışa aktardı. Sonuçta, kullanıcılar içsel fonksiyonlara kazara erişim sağladı ve isim çakışmalarına ve API'nin yanlış kullanımına yol açtı.


Hikaye

Büyük bir projede, iki ekip aynı içsel metodu (_ ile başlayan) kullanıyordu ve bunun özel olduğunu düşünüyordu. Daha sonra fonksiyonun arayüzü değiştirildi, bu da sistemin diğer kısmındaki çağrıları bozdu.


Hikaye

Bir projede, dışarıdan geliştirilen bir modülü değiştirerek dışa aktarılmamış metodlarını doğrudan çağırdılar. Dağıtım güncellemesi sonrası modül çalışmayı durdurdu, çünkü içsel fonksiyon isimleri değişti ve bu, uygulamanın çökmesine yol açtı.