Perl nesneleri, standart veri yapılarının (diziler, hash'ler, ölçekler) referanslarının "blessing" yoluyla gerçekleştirilir. Tarihsel olarak, Perl'deki OOP, anahtarların öznitelik adları ve değerlerin kendisi olduğu bir hash'e başvurulmasına dayanır. Bu yaklaşım esneklik sağlarken, disiplin gerektirir: dil katı kapsülleme veya erişim belirteçlerini gerçekleştirmez; her şey anlaşmalara dayanır.
Sorun: Açık kısıtlama olmadan, özniteliklere erişim her türlü koddan mümkündür; nesne invariants'ını kırmak, namespace'leri karıştırmak veya miras alma hatası yapmak kolaydır.
Çözüm — anlaşmalara sıkı sıkıya uymak: iç verileri bir anlaşma (örneğin, alt çizgi ile) aracılığıyla gizlemek, mümkün olduğunca accessor yöntemleri kullanmak ve karmaşık görevler için standart Moose, Moo, Class::Accessor gibi modülleri kullanmaktır.
Kod örneği:
package Animal; sub new { my $class = shift; my $self = { _name => shift }; bless $self, $class; return $self; } sub get_name { $_[0]->{_name} } package Dog; use parent 'Animal'; sub bark { print "Woof! "; } my $dog = Dog->new("Buddy"); print $dog->get_name; $dog->bark;
Anahtar özellikler:
bless kullanmadan bir Perl nesnesi oluşturmak mümkün mü?
Cevap: Hayır, sadece bless sıradan bir referansı, '->' metodu tarafından anlaşılan bir nesneye dönüştürür.
base/parent neden gereklidir ve @ISA ile arasındaki fark nedir?
Cevap: @ISA, temel sınıflara işaret eden bir dizidir. base/parent, @ISA ile çalışmayı otomatikleştirir ve modül mirasını daha güvenli hale getirir: çift mirası önler ve ek kontroller sağlar.
Çocuk sınıf, ebeveyn sınıfın yöntemlerini aynı isimle tanımladıysa, onları geçebilir mi?
Cevap: Evet, eğer çocuk sınıfta aynı isimle bir yöntem tanımlandıysa, '->' öncelikle onu seçecektir — klasik "method overriding" işler.
Animal modülünde veriler açık özniteliklerde saklanır ve doğrudan erişilir. Biri dışarıdan değerleri yanlışlıkla değiştirirse — nesne tutarsız bir duruma geçer.
Artılar:
Eksiler:
Modül accessor'ları kullanıyor, tüm iç alanlar _ ile başlıyor, yalnızca get/set yöntemleriyle veri işlemlerinin yapıldığı kesin bir spesifikasyon var, set'te kontroller uygulanmış.
Artılar:
Eksiler: