Perl, hash'ler ve paketler temelinde prototip OOP'yi destekleyen dinamik bir dildir. Bir nesne oluşturmak için genellikle 'bless' kullanılır:
package Animal; sub new { my ($class, %args) = @_; return bless { %args }, $class; } sub speak { print "Bir hayvan ses çıkarır "; } package Dog; use parent 'Animal'; # veya our @ISA = ('Animal') sub speak { print "Hav! Hav! "; } my $dog = Dog->new(name => 'Rex'); $dog->speak; # Çıktı: Hav! Hav!
Burada 'new' yapıcısı, nesne verileri ile bir hash oluşturur ve bunu sınıf ile ilişkilendirir. Yöntemler, normal alt programlar olarak tanımlanır. Kalıtım, '@ISA' veya 'parent'/'base' modülü aracılığıyla mümkündür. Perl'de OOP esnektir ama katı değildir, bu da hem ek olanaklar hem de incelikler sunar.
Perl'de özel özellikler/yöntemler nasıl daha iyi uygulanır, 'private/protected' sözdiziminin eksikliğini göz önünde bulundurarak?
Cevap: Yerleşik bir mekanizma yoktur, ancak özel erişim, paket dışında leksik değişkenler veya isimlendirme anlaşmaları ('_private') ile sağlanır. Örneğin:
package Car; my $secret = 'gizli'; # paket için özel sub _private { ... } # anlaşma: dışarıdan çağrılmamalı
Bu yaklaşım erişimi korumaz, ancak standart olarak kabul edilir.
Hikaye
Bir projede, diğer nesnelere referans içeren bir dizi içeren bir nesne tanımlandı. Geliştiriciler yöntemleri $obj->method yerine method($obj) olarak çağırmayı unuttular, bu da kalıtım ve yöntemleri geçersiz kılma durumlarında beklenmedik sonuçlara yol açtı - sınıf yanlış tanımlandı ve ebeveyn yöntemleri yerine çocuk yöntemleri çağrıldı.
Hikaye
Nesnenin durumunu saklamak için paket değişkeni yerine leksik değişken kullanılması, durumdaki bir değişikliğin tüm sınıf örnekleri üzerinde yansımasına neden oldu, çünkü veriler ortak, bireysel değil, nesneye aitti.
Hikaye
Büyük projelerde dinamik sınıf yüklemesi sırasında kalıtım için '@ISA' değişkeni ile örtük çalışma, ebeveyn listelerinin zamanında güncellenmemesine neden oldu ve program beklenmedik bir şekilde yöntemleri kaybetti veya yanlış bir hiyerarşi aldı.