2016-03-22 18 views
3

Saat ve tarih bilgilerini işleyen basit bir Perl modülü yazıyorum. Perl ile nesne yapımında bir erişimci kullanmak kabul edilebilir mi ...Bir kurucuda erişimci yöntemlerini kullanabilir miyim?

package Time; 

# Constructor 
sub new { 
    my $class = shift; 
    my %args = @_; 

    # Create an empty object 
    my $self = bless {}; 

    # Get input arguments 
    my $second = exists $args{'second'} ? $args{'second'} : (localtime)[0]; 

    # Use the accessor to validate and populate object data 
    $self->second($second); 

    return $self; 
} 

# Second accessor 
sub second { 
    my $self = shift; 
    my $second = shift; 

    # Input validation 
    if (defined $second) { 
     if ($second =~ m{^\d+$} && $second >= 0 && $second <= 59) { 
      $self->{'second'} = $second; 
     } 
     else { 
      die "'second' must be an integer between 0 and 59!"; 
     } 
    } 

    return $self->{'second'}; 
} 

Sorum şu: Aşağıda basitleştirilmiş yapıcı sürümü ve erişimci yöntemlerden biridir? yapıcı iç erişimciyi kullanma

giriş erişgeç tarafından doğrulandıktan beri bu yüzden yapıcı kendisi doğrulama kodunun tüm gerekmez yapar, ama bu yanlış bir uygulamadır?

Bunu yapmak istemem için herhangi bir sebep var mı?

+2

Perl'in bir kurucu kavramı yoktur. 'new', sadece diğerleri gibi statik bir yöntemdir. – ikegami

cevap

2

Evet, bunu yapabilirsiniz.

Ama bu init yöntem haline o kodu taşımak için mantıklı olabilir bir OOP perspektifinden

, böylece yapıcı yalnızca nesne oluşturur. Temel olarak bless adını verdikten sonra yapılır.
sub new { 
    my $class = shift; 

    # Create an empty object 
    my $self = bless {}; 

    # initialize the object 
    $self->init(@_); 

    return $self; 
} 

sub init { 
    my ($self, %args) = @_; 

    # Get input arguments 
    my $second = exists $args{'second'} ? $args{'second'} : (localtime)[0]; 

    # Use the accessor to validate and populate object data 
    $self->second($second); 

    return; 
} 

Eğer Moose kullanarak düşündünüz mü? manuel oop ile takılmak istiyorsanız bile, Type::Tiny tür kısıtlamalarınız için kullanabilirsiniz.

+0

Daha önce Moose'u kullandım, ancak üzerinde çalıştığım sunucuda kolayca bulunmuyor ve sadece uğraşmak istemediğim yeni yazılımlar veya kütüphaneler istemek için uzun bir süreç var ... Gerçekten hoşuma gidiyor bir init işlevi fikri olsa da. Oldukça zarif görünüyor. Teşekkürler! – tjwrona1992

+0

@ tjwrona1992 Moo ile gidip en kötü durumda [fatpack] (https://metacpan.org/pod/App::FatPacker) uygulamanızla birlikte yapabilirsiniz. – simbabque

+0

Ve diğer yandan, bir kez bununla uğraşırsanız, tüm projeleriniz için var. Bir sürecin olması, çoğu insandan daha iyi bir şekilde, CPAN kullanmasına izin verilmediğinden şikayetçi. ;) – simbabque

İlgili konular