我可以在构造函数中使用访问器方法吗?

Can I use accessor methods in a constructor?

我正在编写一个简单的 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 的对象构造中使用访问器是否可以接受?

在构造函数内部使用访问器使得我不需要构造函数本身的所有验证代码,因为输入是由访问器验证的,但这是不好的做法吗?

我有什么理由不想这样做吗?

是的,你可以做到。

但是从 OOP 的角度来看,将该代码移到 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? You can also use Type::Tiny 作为您的类型约束,即使您想坚持使用 手动 oop