2012-02-29 22 views
7

मान लें कि मैं Bar नामक एक वर्ग बना रहा हूं। फ़ाइल Bar.pm शुरू होता हैपर्ल क्लास नामकरण सम्मेलन

package Bar; 

अन्य Bar वर्गों के साथ टकराने से बचने के लिए, मैं एक उपनिर्देशिका Foo में फ़ाइल डाल दिया। तो अब, जब मैं क्लास का उपयोग, मैं लिखने के लिए है

use Foo::Bar; 

मेरा प्रश्न है, मैं Foo::Bar के वर्ग का नाम बदलने की जरूरत है? दूसरे शब्दों में, मैं

package Foo::Bar; 

को Bar.pm की पहली पंक्ति को बदलने की जरूरत है? समस्या यह है कि, यदि मैं ऐसा करता हूं, तो मुझे अब कक्षा को Foo::Bar के रूप में संदर्भित करना होगा, उदा।

my $obj = Foo::Bar->new(); 
Foo::Bar->doClassMethod(); 

जो कष्टप्रद है (एक ही समस्या this question में चर्चा की गई थी), खासकर जब से मैं कक्षा तरीकों के शौकीन हूँ।

उत्तर

9

हां, आपको के ठीक मिलान से package का नाम बदलना होगा।

+0

क्या आप थोड़ा "होना" के अर्थ पर विस्तार कर सकते हैं? मैं पूछता हूं क्योंकि यह पैकेज नाम बदलने के बिना ** (संकलित और चलाता है) ** काम करता है। इसे बदलने के नतीजे क्या हैं? – shawkinaw

+9

@shawkinaw यदि आप नहीं करते हैं, तो 'उपयोग' कथन की 'आयात' विधि सही वर्ग नहीं मिलेगी, और अन्य वर्ग विधियों सहित कन्स्ट्रक्टर (अक्सर) मिस्फीयर करेंगे। यह 'उपयोग' कथन में मामला गलत होने जैसा है। यह मामला-असंवेदनशील फाइल सिस्टम पर काम करता है, लेकिन केवल दुर्घटना से, और अन्य सभी प्रकार की चीजें हो जाती हैं। ऐसा मत करो। बस अपनी फाइल, पैकेज बनाएं, और सभी लाइनों का बिल्कुल उपयोग करें। अब से वर्षों में आपके पास कुछ और करने का कोई कारण हो सकता है, लेकिन यह केवल गंभीर और युद्ध-शब्द अनुभव के साथ आता है। यह अभी भी संदिग्ध है। – tchrist

+0

ठीक है, स्पष्टीकरण के लिए धन्यवाद। – shawkinaw

1

आपको सख्ती से आवश्यकता नहीं है (यानी यह एक स्टाइल निर्णय है, संकलक लागू नहीं करता है), लेकिन सॉफ़्टवेयर को आसानी से वितरित करने के लिए perlmod/perlnewmod में निर्धारित प्रासंगिक दिशानिर्देशों का पालन करना एक अच्छा विचार है।

आईओओ, यदि लंबे नाम आपको परेशान करते हैं, तो स्वत: पूर्णता वाला एक संपादक प्राप्त करें।

1

का हवाला देते हुए perldoc -f require:

तो EXPR एक bareword है, का की आवश्यकता होती है "/" ​​आप के लिए फ़ाइल नाम में, यह करने के लिए आसान बनाने के लिए के साथ एक ".pm" विस्तार और ने "::" मान लिया गया है लोड मानक मॉड्यूल। मॉड्यूल लोड करने के इस रूप में आपके नामस्थान को बदलने का जोखिम नहीं उठाता है। दूसरे शब्दों में, आप इस कोशिश करता है, तो:

require Foo::Bar;  # a splendid bareword 

वास्तव में निर्देशिका @INC सरणी में निर्दिष्ट में "फू/Bar.pm" फ़ाइल के लिए दिखेगा समारोह की आवश्यकता है।

तो, हाँ, यह परंपरा है कि अगर आपके मॉड्यूल @INC में कुछ $dir के लिए $dir/Foo/Bar.pm पर स्थित है, तो यह Foo::Bar बुलाया जाना चाहिए है।

2

यदि आपको लगता है कि कक्षा का नाम BarBar नामक अन्य वर्गों के साथ संघर्ष हो सकता है तो फ़ाइल को स्थानांतरित करने में सहायता नहीं होगी। यदि आपका प्रोग्राम अंततः Bar और Foo::Bar दोनों का उपयोग करता है तो दोनों को एक ही नामस्थान में लोड किया जाएगा। उस समय आपके कार्यक्रम का क्या होता है किसी का अनुमान है।

यदि लंबी कक्षा के नाम टाइप नहीं करना चाहते हैं तो आप नाम रखने के लिए एक चर का उपयोग कर सकते हैं।

use My::Long::Class::Name::For::Bar; 
my $bar_class = 'My::Long::Class::Name::For::Bar'; 

$bar_class->class_method(); # the same as My::Long::Class::Name::For::Bar->class_method() 
+0

सच है, लेकिन संभवतः आप एक ही समय में दो अलग-अलग 'बार' कक्षाएं लोड नहीं करेंगे। लेकिन मैं आपकी बात देखता हूँ। यह अच्छा होगा अगर पर्ल आपको कक्षाओं को संक्षिप्त नाम से संदर्भित करने दे, लेकिन केवल तभी जब कोई अस्पष्टता न हो। टीसीएल, इसके सभी दोषों के लिए, जब तक यह अद्वितीय नहीं है, तब तक आप प्रक्रियाओं को संक्षिप्त नाम से बुला सकते हैं। – shawkinaw

0

पैकेज Local इस उपयोग के लिए आरक्षित है।उदाहरण के लिए, यदि आप पैकेज Bar.pm बनाते हैं, तो आप पैकेज Local::Bar पर कॉल कर सकते हैं और जानते हैं कि यह सीपीएएन में कुछ के साथ संघर्ष नहीं करेगा।

डिफ़ॉल्ट रूप से, @INC में वर्तमान निर्देशिका शामिल है, ताकि आप Local उपनिर्देशिका बना सकें और फिर अपने सभी संकुल वहां रख सकें। एक कंपनी में, मैं Local पैकेज नामस्थान समूह में और डेवलपर्स के नामों को भी विभाजित कर दूंगा। उदाहरण के लिए, मैं Local::Cm::Bar या Local::David::Bar का उपयोग कर सकता था। इस तरह, अगर मैं फैसला करता हूं कि मैं ऐलिस की बार कक्षा का उपयोग कर सकता हूं, तो मैं बस Local::Alice::Bar शामिल कर सकता था।

हां, मानक सीपीएएन नियम बताते हैं कि पैकेज नामस्थानों में आपके नाम का उपयोग न करें, लेकिन Local पैकेज कभी भी सीपीएएन में नहीं जाते हैं।

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