【问题标题】:Can I use accessor methods in a constructor?我可以在构造函数中使用访问器方法吗?
【发布时间】:2016-07-09 15:38:35
【问题描述】:

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

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

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

【问题讨论】:

  • Perl 没有构造函数的概念。 new 和其他方法一样只是一个静态方法。

标签: perl oop constructor accessor


【解决方案1】:

是的,你可以这样做。

但从 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?您也可以使用Type::Tiny 作为您的类型约束,即使您想坚持使用manual oop

【讨论】:

  • 我以前使用过 Moose,但它在我正在使用的服务器上并不容易使用,并且请求新软件或库的过程很长,我只是不想处理...虽然我真的很喜欢 init 函数的想法。它看起来相当优雅。谢谢!
  • @tjwrona1992 您可以使用 Moo,在最坏的情况下 fatpack 使用您的应用程序。
  • 另一方面,如果您处理一次,您的所有项目都会使用它。拥有一个流程比这里的大多数人抱怨他们不允许使用 CPAN 要好得多。 ;)
猜你喜欢
  • 1970-01-01
  • 2011-07-10
  • 2018-06-30
  • 2010-12-19
  • 1970-01-01
  • 2011-04-08
  • 2019-12-11
  • 2022-11-09
  • 2020-01-15
相关资源
最近更新 更多