2016-03-22 3 views
3

Я пишу простой модуль Perl, который обрабатывает информацию о времени и дате. Ниже представлена ​​упрощенная версия конструктора и один из методов доступа:Могу ли я использовать методы доступа в конструкторе?

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'}; 
} 

Мой вопрос ... Допустимо использовать аксессоры в строительстве объекта в Perl?

Использование аксессора внутри конструктора делает так, что мне не нужен весь код проверки в самом конструкторе, поскольку вход подтвержден аксессуаром, но является ли это неправильной практикой?

Есть ли причина, по которой я не хотел бы этого делать?

+2

У Perl нет концепции конструктора. 'new' - это просто статический метод, как любой другой. – ikegami

ответ

2

Да, вы можете это сделать.

Но с точки зрения ООП может иметь смысл переместить этот код в метод init, поэтому только конструктор создает объект. Это делается в основном после того, как вы позвонили bless.

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; 
} 

Рассматривали ли вы с помощью Moose? Вы также можете использовать Type::Tiny для ограничений типа, даже если вы хотите придерживаться инструкции oop.

+0

Я раньше использовал Moose, но он недоступен на сервере, над которым я работаю, и есть длительный процесс запроса нового программного обеспечения или библиотек, с которыми я просто не хочу иметь дело ... Мне действительно нравится однако идея функции init. Это выглядит довольно элегантно. Благодаря! – tjwrona1992

+0

@ tjwrona1992 вы можете пойти с Moo, а в худшем случае [fatpack] (https://metacpan.org/pod/App::FatPacker) это с вашим приложением. – simbabque

+0

С другой стороны, если вы имеете дело с ним один раз, у вас есть это для всех ваших проектов. Наличие процесса soooo намного лучше, чем большинство людей, жалующихся на то, что им не разрешено использовать CPAN. ;) – simbabque