在我们的类中,我们有一个模式,我们创建一个属性来表示计算值。出于显而易见的原因,我们希望缓存计算的值,然后在基础值之一更改时使缓存无效。
所以我们目前有这个:
package FooBar;
use Moose;
has 'foo' => (
accessor => {
'foo' => sub {
my $self = shift;
if (@_ > 0) {
# writer
$self->{foo} = $_[0];
# reset fields that are dependant on me
$self->{bar} = undef;
}
# reader part;
return $self->{foo};
}
}
);
has 'bar' => (
accessor => {
'bar' => sub {
my $self = shift;
if (@_ > 0) {
# writer
$self->{bar} = $_[0];
}
# reader part;
$self->{bar} = calculate_bar($self->foo, $self->baz)
if (not defined($self->{bar}));
return $self->{bar};
}
}
);
sub calculate_bar { ... }
当计算值依赖于其他计算值时,这种长手方法变得非常繁琐且容易出错。
'bar' 是否有更智能/更简单的方法来监控它所依赖的属性,而不是让 'foo' 知道谁依赖它?另外如何避免通过哈希成员访问设置栏?