在我們的課程中,我們有一個模式,我們創建一個屬性來表示一個 計算值。出於顯而易見的原因,我們希望緩存計算值 ,然後在其中一個基礎值發生更改時使緩存無效。Moose:屬性值更改時計算緩存結果到期嗎?
所以我們現在有這樣的:
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 { ... }
當計算 依賴於其它計算值值這個長手方法越來越非常繁瑣,而且容易出錯。
有沒有更智能/更簡單的方法來監控它所依賴的屬性 vs'foo'是否知道誰依賴於它?另外我怎樣才能避免通過散列 成員訪問設置欄?
嗯。我在使用Memoize緩存對象數據時遇到了問題。如果這個類的每個實例具有不同的值,會發生什麼? Memoize將永久緩存它們,而不管它們在對象被銷燬時不再有用的事實,對嗎?這意味着在一個持久的應用程序(這真的是唯一明智的地方使用穆斯),你可能會增長一個巨大的,無用的緩存。沒有? 當然,你可以手動(我想!)手動過期的東西亂七八糟,但這比上面的駝鹿/懶惰的例子更復雜,收益不大。 – Dan 2009-11-22 16:32:24
我從根本上不同意,不只是它/更少/複雜和更加透明,但是速度和收益是可以預測的,而邏輯就是它應該被應用而不是被其他訪問者攻擊的地方。所有你需要做的是子類Memoize :: Expire,並設置STORE子清除緩存,然後寫入哈希。 – 2009-11-23 03:06:29
我選擇這個作爲答案,因爲它極大地簡化了代碼,這正是我真正努力的目標。 計算結果未存儲在對象本身中的事實對我當前的實現來說不是問題。 謝謝EvanCaroll。 – clscott 2009-11-23 17:57:29