perl - 如何在 Moose 中使用单个构建器构建多个属性?

标签 perl moose

使用 Moose,是否可以创建一次构建多个属性的构建器?

我有一个项目,其中对象有几个“集合”的字段 - 如果请求集合中的任何成员,我想继续并填充它们。我的假设是,如果我需要姓名,我还需要生日,并且由于它们在同一个表中,所以在一个查询中同时获取两者会更快。

我不确定我的问题是否足够清楚,但希望一些示例代码能说明问题。

我有什么:

Package WidgetPerson;
use Moose;

has id => (is => 'ro', isa => 'Int' );
has name => (is => 'ro', lazy => 1, builder => '_build_name');
has birthdate => (is => 'ro', lazy => 1, builder => '_build_birthdate');
has address => (is => 'ro', lazy => 1, builder => '_build_address');

sub _build_name {
 my $self = shift;
 my ($name) = $dbh->selectrow_array("SELECT name FROM people WHERE id = ?", {}, $self->id);
 return $name;
}
sub _build_birthdate {
 my $self = shift;
 my ($date) = $dbh->selectrow_array("SELECT birthdate FROM people WHERE id = ?", {}, $self->id);
 return $date;
}
sub _build_address {
 my $self = shift;
 my ($date) = $dbh->selectrow_array("SELECT address FROM addresses WHERE person_id = ?", {}, $self->id);
 return $date;
}

但我想要的是:

has name => (is => 'ro', isa => 'Str', lazy => 1, builder => '_build_stuff');
has birthdate => (is => 'ro', isa => 'Date', lazy => 1, builder => '_build_stuff');
has address => (is => 'ro', isa => 'Address', lazy => 1, builder => '_build_address');
sub _build_stuff {
 my $self = shift;
 my ($name, $date) = $dbh->selectrow_array("SELECT name, birthdate FROM people WHERE id = ?", {}, $self->id);
 $self->name($name);
 $self->birthdate($date);
}
sub _build_address { 
 #same as before 
}

最佳答案

在这种情况下,当我不想像 Ether 的回答那样拥有单独的对象时,我所做的是为中间状态延迟构建属性。所以,例如:

has raw_row => (is => 'ro', init_arg => undef, lazy => 1, builder => '_build_raw_row');
has birthdate => (is => 'ro', lazy => 1, builder => '_build_birthdate');

sub _build_raw_row {
   $dbh->selectrow_hashref(...);
}

sub _build_birthdate {
    my $self = shift;
    return $self->raw_row->{birthdate};
}

为姓名等重复与 生日 相同的模式。

读取任何单个属性都会尝试从 raw_row 获取数据,其惰性构建器只会运行一次 SQL。由于您的属性都是只读的,因此如果其中一个属性发生更改,您不必担心更新任何对象状态。

此模式对于 XML 文档之类的东西也很有用——您保存的中间状态可以是例如一个 DOM,具有从 XPath 表达式或你拥有的东西懒惰地构建的各个属性。

关于perl - 如何在 Moose 中使用单个构建器构建多个属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42869183/

相关文章:

perl - Moose 角色中的方法名称冲突

perl - 我所有的 Moose 类都必须包含 'namespace::autoclean' 和 'make_immutable' 还是有某种方法可以默认获取这些?

javascript - 如何从 Perl 中提交按钮的 onclick 事件调用 Javascript 函数?

perl - 使用带空括号的 Perl 模块

perl - 为什么 Perl 5 的函数原型(prototype)不好?

perl - 如何在 Perl 和 Moose 中创建不可变对象(immutable对象)的循环图?

perl - 对 Moose 属性应用特定检查(除了 Moose 类型)

perl - HTML::Form Handler 角色和字段

arrays - Perl 压入已排序的数组

regex - 如何计算 Perl 中字符串开头的空格数?