2009-10-25 6 views
11

मैं Programming Perl पढ़ रहा हूँ, और मैं इस कोड का टुकड़ा मिला:किसी ऑब्जेक्ट इंस्टेंस पर नया कॉल करने का क्या फायदा है?

sub new { 
    my $invocant = shift; 
    my $class = ref($invocant) || $invocant; 
    my $self = { 
     color => "bay", 
     legs => 4, 
     owner => undef, 
     @_,     # Override previous attributes 
    }; 
    return bless $self, $class; 
} 
इस तरह कंस्ट्रक्टर्स साथ

, एक वस्तु उदाहरण पर new बुलाने की क्या लाभ है? मुझे लगता है कि यह वही है, है ना? मेरा अनुमान है कि अगर कोई ऐसा कन्स्ट्रक्टर लिखना चाहेगा, तो उसे कुछ और कोड जोड़ना होगा जो पहले ऑब्जेक्ट के गुणों को प्रतिलिपि बनाने के लिए कॉपी करता है। यह कुछ सच में स्वच्छ कॉम्पैक्ट कारखाने पैटर्न के लिए कर सकते हैं -

+0

नोट: संबंधित प्रश्न में कुछ बहुत अच्छी जानकारी: http://stackoverflow.com/questions/1621373/whats-the-benefit-of-calling- new-on-an-object-instance?rq= 1 – DVK

+0

लॉल, मैं अभी एक ही पुस्तक पढ़ रहा हूं –

उत्तर

12

तो तुम जानते हुए भी क्या मूल वर्ग के वस्तु है बिना एक ही वर्ग के किसी अन्य वस्तु का निर्माण कर सकते हैं।

उदाहरण के तौर पर, यह तब उपयोगी होता है जब आपके पास संसाधन वस्तुएं होती हैं जिन्हें आपको बनाने की आवश्यकता होती है, आवश्यकता होती है और कंप्यूटिंग की लागत किस तरह की संसाधन वस्तु उच्च होती है (कहें, एक लंबी चल रही डीबी क्वेरी)। इसलिए, एक कारखाना यह देखेगा कि क्या इसे पुराना संसाधन ऑब्जेक्ट पारित किया गया था और यदि ऐसा है, तो संसाधनों की पुन: कंप्यूटिंग की संसाधन लागत से बचने के लिए केवल $old_object->new() पर कॉल करके इसे बनाएं।

एक और उदाहरण के रूप में, यदि आप वर्ग पदानुक्रम जानवरों को संकेतित करते हैं, और एक सिमुलेशन में नए जानवरों के निर्माण के लिए एक कारखाना है, तो आप $newborn = $factory->make_new_animal($mother) कारखाने कार्यान्वयन केवल जा रहा है $object->new()

+0

फ़ंक्शन मूल उदाहरण से कुछ भी कॉपी नहीं करता है। यह सिर्फ 'रेफ ($ स्वयं)' का उपयोग कर कक्षा का नाम प्राप्त करता है, और कुछ भी नहीं। उसके बाद, यह एक पूरी तरह से नई वस्तु बनाता है। –

+0

लुकास - हाँ, कोड को सावधानीपूर्वक पर्याप्त नहीं पढ़ा ... खुजली उंगलियों :) मैंने उस समय तक "कॉपी कन्स्ट्रक्टर" संदर्भ संपादित किया था जब आपने टिप्पणी की थी :) – DVK

+1

@DVK: शायद आप एक उदाहरण दिखा सकते हैं? – ysth

7

साथ कह सकते हैं मैं किसी भी वास्तविक लाभ नहीं दिख रहा है । आप हमेशा ref($obj)->new कर सकते हैं या $obj->clone करने के लिए कोई तरीका है; इस तरह आप सोच नहीं रहे हैं कि उन दो $object->new में से कौन सा कर रहा है।

+0

ysth - मेरा जवाब देखें, '$ नवजात = $ फैक्ट्री-> make_new_animal ($ मां)' कॉल कर सकते हैं। कुछ मूल रूप से साफ फैक्ट्री जैसी चीजें हैं जिन्हें लागू किया जा सकता है यदि आपकी बेस क्लास में "मेरे जैसे एक बनाएं" नई विधि है। – DVK

+1

@ डीवीके: फिर make_one_like_me विधि के साथ बेहतर किया गया। – ysth

+1

किया जा सकता है - हाँ। "बेहतर" - बहस योग्य। मैं ठीक से दोनों को ढूंढता हूं, पुस्तक के एक के साथ एक पतली मार्जिन द्वारा अधिक स्पष्ट और straighforward। कॉलर साइड पर – DVK

5

के रूप में अन्य लोगों ने कहा, यह कि उदाहरण के प्रकार के बारे में पता होना करने के लिए बिना एक नई वस्तु उदाहरण के बहुरूपी निर्माण के लिए अनुमति देने के लिए है।

ऑब्जेक्ट क्लोनिंग के लिए, मैं सामान्य रूप से स्पष्ट क्लोन() या कॉपी() विधियों को लिखता हूं जो विशेषताओं और अन्य डेटा को सही ढंग से कॉपी कर सकते हैं, लेकिन कोई कारण नहीं है कि नया() इस भूमिका का ख्याल नहीं रख सकता है, लंबे समय तक क्योंकि यह स्पष्ट रूप से दस्तावेज है।

  1. विभिन्न व्यवहार को ओवरराइड करने के लिए
  2. बनाने की क्षमता का एक अलग वर्ग (एक बच्चा, या एक mixin/भूमिका (जैसे एक मूस भूमिका)) का उपयोग करने में सक्षम होने: हालांकि मैं उन्हें अलग से परिभाषित करने में दो फायदे देख कोड स्पष्ट है, जैसे कि एक नया "खाली" ऑब्जेक्ट बनाने के लिए आवश्यक चरणों को मौजूदा ऑब्जेक्ट क्लोन करने वालों की तुलना में बहुत अलग है।
संबंधित मुद्दे