हमारे वर्गों में हमारे पास एक पैटर्न है जहां हम गणना मूल्य का प्रतिनिधित्व करने के लिए एक विशेषता बनाते हैं। स्पष्ट कारणों से हम गणना मूल्य को कैश करना चाहते हैं और उसके बाद अंतर्निहित मानों में से एक बदलते समय कैश को अमान्य कर देना चाहते हैं।मूस: विशेषता मान बदलते समय गणना के कैश किए गए परिणाम समाप्त हो रहे हैं?
तो हम वर्तमान में इस है:
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 { ... }
यह लंबे हाथ विधि बहुत कठिन और त्रुटि प्रवण हो रही है जब परिकलित मानों अन्य गणना मूल्यों पर निर्भर।
क्या पर निर्भर गुणों की निगरानी करने के लिए 'बार' के लिए एक स्मार्ट/सरल तरीका है, यह 'foo' बना रहा है, जो इस पर निर्भर है? मैं हैश सदस्य पहुंच के माध्यम से सेटिंग बार से कैसे बच सकता हूं?
एचएम। मुझे ऑब्जेक्ट डेटा कैश करने के लिए Memoize का उपयोग करके अपने सिर को प्राप्त करने में समस्याएं हैं I क्या होता है यदि इस वर्ग के प्रत्येक उदाहरण के अलग-अलग मूल्य हैं? याद रखें उन्हें इस तथ्य के बावजूद हमेशा के लिए कैश करेगा जब ऑब्जेक्ट नष्ट हो जाए, तो वे अब उपयोगी नहीं होंगे, है ना? जिसका मतलब एक सतत ऐप में है (और यह वास्तव में मूस का उपयोग करने के लिए एकमात्र समझदार जगह है) आप संभावित रूप से एक विशाल, बेकार कैश विकसित करने जा रहे हैं। नहीं? बेशक , आप कर सकते हैं सामान मैन्युअल समाप्त हो रही (मुझे लगता है कि!), लेकिन यह है कि छोटे से लाभ के लिए ऊपर मूस/आलसी उदाहरण के ऊपर जिस तरह से अधिक जटिलता है, .. – Dan
मैं मौलिक रूप से असहमत हैं, के बारे में गंदगी न सिर्फ है यह/कम/जटिल और अधिक पारदर्शी लेकिन गति हिट और लाभ अनुमानित है और तर्क यह है कि यह अन्य एक्सेसर्स में हैक किए जाने के बजाय होना चाहिए। आपको बस इतना करना है कि सबक्लास Memoize :: हैश को लिखने से पहले कैश को साफ़ करने के लिए निकालें और स्टोर उप सेट करें। –
मैंने इसे उत्तर के रूप में चुना क्योंकि यह कोड को काफी सरल बनाता है, जो मैं वास्तव में प्रयास कर रहा था। तथ्य यह है कि गणना का परिणाम ऑब्जेक्ट में संग्रहीत नहीं है, यह मेरे वर्तमान कार्यान्वयन के लिए कोई समस्या नहीं है। धन्यवाद इवान कैरोल। – clscott