2010-02-13 6 views
6

AFAIK विरासत आमतौर पर इस तरह की स्थापना की है:क्या मुझे रनटाइम की बजाय संकलन-समय पर विरासत स्थापित करना चाहिए, और यदि ऐसा है तो क्यों? पर्ल में

package Mule; 
our @ISA = ("Horse", "Donkey"); 

वहाँ किसी भी उदाहरण हैं, जहां use base (या use parent) के बजाय बेहतर है कर रहे हैं?

BEGIN { 
    require Horse; 
    require Donkey; 
    push @ISA, qw(Horse Donkey); 
} 

यह tidier अगर आप उन लोगों से विरासत में और साथ ही मॉड्यूल कोड को लोड करने की आवश्यकता है:

+5

'बेस' और' पैरेंट 'मॉड्यूल आपको संकलन समय पर आईएसए रिश्तों को स्थापित करने की अनुमति देता है। इसके विपरीत, 'आईएसए' को संशोधित करना रन टाइम पर होता है। इस प्रकाश में, आपके प्रश्न को फिर से भरने का एक तरीका इस तरह है: क्या यह आमतौर पर बाद में विरासत स्थापित करने के लिए फायदेमंद है (संकलन-समय), और यदि ऐसा है तो क्यों? इन संबंधित प्रश्नों को भी देखें: http://stackoverflow.com/questions/1378309/whats-the-difference-between-use-base-and-isa-in-perl/1379276 और http://stackoverflow.com/questions/ 876,471/क्या-है-अंतर-बीच माता पिता और आधार में पर्ल-5। – FMc

+2

'BEGIN {@ISA = ...}; 'संकलन-समय पर भी होता है। – friedo

+0

@ एफएम टिप्पणी के लिए धन्यवाद :-) मैंने प्रश्न –

उत्तर

3

संकलन समय पर विरासत स्थापित करने से नीचे दिखाए गए निर्भरता लूप को डीबग करने के लिए विशेष रूप से कठिन से बचा जाता है।

# Child.pm 
package Child; 

our @ISA = qw(Mother); 

use Foo; 

# Mother.pm 
package Mother; 

sub wibble { 42 } 

# Foo.pm 
package Foo; 

use Child; 
Child->wibble; 

इससे पहले कि आप "बाल का उपयोग" अगर "फू का उपयोग करें" तो फू Mother पर अपनी अपनी विरासत की स्थापना से पहले Child->wibble कॉल करने के लिए कोशिश करेंगे। यदि इसके बजाय बच्चे use parent qw(Mother) पर था तो इसकी विरासत किसी और चीज को लोड करने की कोशिश करने से पहले स्थापित की जाएगी।

मैं निजी, कॉर्पोरेट कोड में इस तरह की निर्भरता पाश रहा हूं जो सार्वजनिक कोड की तुलना में थोड़ा अधिक अंतर्निहित है। यह डीबग करने के लिए बेकार है, यही कारण है कि मैं हमेशा संकलन समय पर विरासत स्थापित करने की सिफारिश करता हूं।

+0

धन्यवाद, यह एक उपयोगी उदाहरण है। – FMc

5
use base qw(Horse Donkey); 

यह मोटे तौर पर के बराबर है। BTW, वहाँ एकाधिक वंशानुक्रम में समस्याएं हैं, लेकिन एक अलग सवाल :)

संपादित thats:। संकलन समय v रन-टाइम फायदे:

  • आप संकलन समय की जांच की सुरक्षा है आधार का उपयोग करें जिसका अर्थ है कि आपकी स्क्रिप्ट तब भी प्रारंभ नहीं होगी जब आपका बेस मॉड्यूल फाइल सिस्टम पर मौजूद न हो।
  • आप चलाने के समय के दौरान किसी विशेष मॉड्यूल का उपयोग करने के लिए तय करने के लिए चाहते हैं, तो आप परीक्षण और अपने माता-पिता के लिए मॉड्यूल जोड़ सकते हैं:

    अगर (eval {आवश्यकता एक्स}) { धक्का @ISA, ' एक्स'; }

+3

का उपयोग किया है आप उपयोग माता-पिता qw (बेस क्लास) का उपयोग कर सकते हैं या बेस क्यूड (बेस क्लास) का उपयोग कर सकते हैं। माता-पिता आधार पर बेहतर है क्योंकि इसमें बहुत कम अंधेरा जादू है, लेकिन यह आधार की तरह कोर में नहीं है। –

+0

मैं 'पैरेंट' के बारे में और जानने के लिए पर्ल में बहुत जंगली हूं। धन्यवाद @Leon +1 – ziya

+1

'बेस' मॉड्यूल तब काम करेगा जब अभिभावक वर्ग एक ही फ़ाइल में है। Http://search.cpan.org/perldoc?base देखें। – FMc

1

के बारे में संकलन बनाम-रन-टाइम:

पर्ल में, मॉड्यूल (संकुल/नामस्थान) आम तौर पर अलग फ़ाइलों में रहते हैं। अर्थात। Some::Module कुछ/Module.pm में मिलेगा। इस सेटअप में, संकलन-बनाम रन-टाइम अंतर इससे कोई फर्क नहीं पड़ता। use() के माध्यम से लोड होने वाले मॉड्यूल का रन-टाइम कॉलिंग कोड के संकलन-समय से पहले होगा। ऑब्जर्वर:

फ़ाइल Some/Module.pm:

package Some::Module; 
BEGIN{ print "Some::Module - compile time\n" } 
print "Some::Module - run time\n"; 
1; 

फ़ाइल test.pl:

BEGIN{ print "Just started compiling the program.\n" } 
use Some::Module; 
BEGIN{ print "main - compile time\n" } 
print "main - run time\n"; 

उत्पादन होगा:

Just started compiling the program. 
Some::Module - compile time 
Some::Module - run time 
main - compile time 
main - run time 

इसलिए, एक our @ISA = qw(Base); के संकलन से पहले निष्पादित किया जाएगा आपके टी लोड करने के बाद मुख्य कार्यक्रम जारी है वह मॉड्यूल।

यह सही है, हालांकि, @ISA को असाइन करना यह सुनिश्चित नहीं करता है कि बेस क्लास लोड हो गया है। यही कारण है कि हमारे पास use base और use parent प्रागमा हैं। यदि आपको विशेष रूप से use base (फ़ील्ड) की किसी भी विशेषताओं की आवश्यकता नहीं है और न ही use parent पर प्रदान की जाने वाली लंबी पिछली संगतता की आवश्यकता है, तो मेरा सुझाव है कि आप अधिक हल्के वजन use parent का उपयोग करें।

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