2013-02-11 67 views
5

मैं शुरू कर दिया उत्प्रेरक है कि इस तरह देखा का उपयोग कर कुछ पर्ल कोड लिखने:

package My::Controller; 
extends 'Catalyst::Controller'; 

sub handler :Path :Args(0) :Location(some/url) 
    my ($self, $c) = @_; 

    $self->do_something_with_arguments($c); 
    $self->make_a_decision($c); 
    $self->another_method($c); 
} 

तो मैंने सोचा। ओ ओ (? क्यों हर समय चारों ओर पास $ ग), और मैं इस के लिए बदल दिया:

package My::Controller; 
extends 'Catalyst::Controller'; 

has c => (is => "rw", isa => "Catalyst"); 

sub handler :Path :Args(0) :Location(some/url) 
    my ($self, $c) = @_; 
    $self->c($c); 

    $self->do_something_with_arguments; 
    $self->make_a_decision; 
    $self->another_method; 
} 

हैंडलर के लिए केवल एक प्रवेश बिंदु है, तो $ आत्म नहीं है> ग हमेशा सही ढंग से स्थापित किया जाएगा।

मेरे सहयोगियों ने कहा कि यदि कैटलिस्ट का उपयोग किया जाने वाला था, तो ठीक है, हर कोई इसका इस्तेमाल करेगा। वे चिंतित थे कि इस तरह से ऐसा करने से स्मृति रिसाव हो जाएगा क्योंकि अनुरोध समाप्त होने के बाद $ सी का संदर्भ जारी रहेगा। क्या यह सच है?

उत्तर

10

यह सही मायने में "मेमोरी रिसाव" नहीं है, जो ज्यादातर लोग सोचते हैं, क्योंकि इसका परिणाम असंबद्ध स्मृति वृद्धि नहीं होगा, लेकिन हां, आप अपने सामान्य जीवनकाल से अधिक समय तक अनुरोध का पालन कर रहे हैं । अगली बार जब आप कोई अनुरोध करते हैं तो इसे मुक्त कर दिया जाएगा जो $self->c को किसी और चीज़ पर सेट करता है, लेकिन जल्द से जल्द नहीं। सबसे महत्वपूर्ण बात यह है कि, यह काफी गलत डिजाइन है। या तो एक तर्क के रूप में संदर्भ पारित जारी रखें; या अपने कंट्रोलर विधियों को निजी कार्यों में बदल दें और उन्हें ->forward (जो संदर्भ को स्वचालित रूप से पास करता है) के साथ कॉल करें; या उचित होने पर मॉडल को मॉडल में ले जाएं, और मॉडल ACCEPT_CONTEXT है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^