2009-12-07 21 views
15

पर्ल में सामान्य अभ्यास 1; के साथ मॉड्यूल समाप्त करने के लिए निश्चित है ताकि आवश्यकता के लिए कॉल की सफलता के लिए जांच की जा सके। क्या कोई कारण है कि वापसी मूल्य एक और सही मूल्य नहीं हो सकता है? मेरे परीक्षण में, यह किसी भी समस्या का कारण नहीं दिखता है, लेकिन मैं जानना चाहता हूं कि किसी ने किसी भी मुद्दे पर चलना है (जैसे कि कुछ अन्य मॉड्यूल या प्रागमा या कुछ भी जो मान वास्तव में 1 होने की उम्मीद करते हैं और केवल सत्य नहीं) ।मान्य पर्ल मॉड्यूल वापसी मूल्य क्या हैं?

संपादित करें: लोकप्रिय राय से, और चूंकि यह केवल एक बार (अच्छी टिप) काम करेगा, कोड उदाहरण समाप्त हो गया है। लगता है आम सहमति है कि किसी भी सच्चे मान देने के लिए उसके सुरक्षित, लेकिन कभी कोड बुला में है कि मूल्य पर भरोसा करने के बाद से require पहले लोड हो रहा है के बाद 1 वापस आ जाएगी है

+0

आप ऐसा क्यों करना चाहते हैं? – innaM

+3

मुझे दो बार एक ही चीज़ टाइप करने से नफरत है। मैं सहमत हूं, मेरे पास एक रिफैक्टरिंग समस्या है, मैं बैठकों में भाग ले रहा हूं ... –

+7

रिफैक्टरिंग एक बात है, गोल्फ़िंग एक और है। ;) –

उत्तर

17

मैं थोड़ी देर के लिए अपने मॉड्यूल के अंत में मूर्ख चीजें डाल रहा हूं। कोई नुकसान नहीं है और इसका थोड़ा ईस्टर अंडे है। uny2k"Yes, this code is a joke."Class::Fields के साथ मददगार रूप से समाप्त होता है।

इसे एक कदम आगे ले जाना, कभी-कभी जब कोई फ़ंक्शन true और false लौटने के लिए प्रलेखित किया जाता है, तो मैं true के लिए 1 से कुछ कुछ वापस कर दूंगा। यह if foo() == 1 लिखने वाले लोगों को दंडित करना है जब उनका मतलब if foo() है। यह इसी अवधि मैं use constant TRUE => 1==1; use constant FALSE => !TRUE;

मैं उत्पादन कोड में इस्तेमाल एक मॉड्यूल के रिटर्न मान देखा है लिख रहा था के आसपास थी। मुझे बिल्कुल याद नहीं है क्यों। डेवलपर का तर्क था ... अत्याचार। मेरा मानना ​​है कि यह दो की जगह सिर्फ एक पंक्ति लिखना नहीं चाहता था। मुझे याद नहीं है कि उसने इसे क्यों निर्यात नहीं किया।

यह वही डेवलपर हैं जो %_ इस्तेमाल किया तर्क के आसपास पारित करने के लिए किया गया था (*_ प्रतीक वैश्विक संकुल भर में है) और 150 लाइन नक्शा बयान नक्शा बयान के अंदर लिखा था।

वापसी मान कहानियो से अलग का उपयोग कर, के खतरे, कि यह केवल एक बार काम करता है।

$ cat Foo.pm 
package Foo; 

return "Basset hounds got long ears"; 

$ cat test.plx 
#!/usr/bin/perl -w 

print require Foo, "\n"; 
print require Foo, "\n"; 

$ perl -I. test.plx 
Basset hounds got long ears 
1 

पहली कॉल require को Foo.pm मूल्यांकन करता है और वापसी मान देता है। दूसरी कॉल इसे पहले से ही %INC में देखती है और केवल सच होती है। और आप यह भी सुनिश्चित नहीं कर सकते कि कोड की आवश्यकता के लिए आप पहली चीज़ हैं। आप इसे do "Foo.pm" के साथ प्राप्त कर सकते हैं, लेकिन अब आप हर बार मॉड्यूल को पुनः परिभाषित कर रहे हैं, फिर से परिभाषित दिनचर्या, प्रदर्शन के लिए समस्याएं और संभवतः ग्लोबल्स को फिर से शुरू करने के बारे में चेतावनियां। यह इसके लायक नहीं है।

8

मुझे लगता है कि (1) वहाँ किसी भी मनमाने ढंग से सच लौटने के साथ कोई समस्या नहीं है आपके मॉड्यूल से मूल्य लेकिन (2) एक बड़ा समस्या है जो अस्पष्ट, अत्यधिक चालाक कोड है जिसमें आप मॉड्यूल कार्यान्वयन विवरण का फायदा उठाने का सुझाव देते हैं। ऐसा मत करो।

4

इसका उद्देश्य यह है कि यदि आपका मॉड्यूल झूठा लौटाता है, तो उस बिंदु पर आवश्यकताएं विफल हो सकती हैं। कोई भी सत्य या गलत होने से परे मूल्य पर कोई परवाह नहीं करता या निर्भर करता है।

आपको सूट का पालन करना चाहिए। आप इसे बना रहे हैं ताकि आपके मॉड्यूल वास्तविक मान पर निर्भर हों कि यह सत्य या गलत है या नहीं। उदाहरण के लिए, उदाहरण के लिए, यदि आपकी आवश्यकता 1 लौटने के लिए होती है, तो आवश्यकताएं सफल होंगी, लेकिन आपका चालाक कन्स्ट्रक्टर विफल हो जाएगा।

7

कुछ भी एक वैध वापसी मूल्य है। यदि आप सफल होने के लिए require चाहते हैं, तो यह एक वास्तविक मूल्य होने की आवश्यकता है। यदि आप सफल होने के लिए require नहीं चाहते हैं (उदा। असमर्थित प्लेटफ़ॉर्म, अनुपलब्ध लाइब्रेरी), तो झूठी मान का उपयोग करें।

यह देखने के लिए कि अन्य लोगों ने वापसी मूल्य के रूप में क्या उपयोग किया है, Acme::ReturnValue देखें।

लोग किसी भी चीज़ के लिए वापसी मूल्य का उपयोग करने की उम्मीद नहीं करते हैं, इसलिए मैं उस समय ऐसा करने की कोशिश करके लोगों को भ्रमित नहीं करता, इससे कोई फर्क नहीं पड़ता कि उस समय कितना चालाक लगता है। :)

+0

हे ब्रायन! तुम एक ईश्वर हो –

+0

दूसरे दिन हाय कहने का मतलब है, लेकिन मैं आलसी था। ऐसा लगता है कि आप अच्छी तरह से कर रहे हैं। :) –

6

Mark Dominus, Higher-Order Perl के लेखक, मेरी पसंदीदा बताते हैं:

मैं बहुत मुश्किल से ही इस्तेमाल किया है $flag = 'Cogito ergo sum'; जो हर किसी जानता है के रूप में स्वयं को जाहिर सभी संभव ब्रह्मांडों में सच है। यह अधिकतम पोर्टेबिलिटी सुनिश्चित करता है।

1

एक बात है कि आप require साथ में चलाने हूँ कि यह केवल मॉड्यूल द्वारा दिया गया मान पहली बार है कि मॉड्यूल लोड किया जाता है देता है। यदि मॉड्यूल पहले ही लोड हो चुका था, तो मॉड्यूल को फिर से लोड किए बिना रिटर्न 1 की आवश्यकता होती है।

do file कथन प्रत्येक बार फ़ाइल को फिर से लोड करेगा, और प्रत्येक बार फ़ाइल का रिटर्न मूल्य लौटाएगा। मैंने इसे किसी फ़ाइल में कॉन्फ़िगरेशन डेटा को अज्ञात हैश के रूप में संग्रहीत करने के लिए उपयोग किया है।

+0

'फ़ाइल करें' 'काम करता है ", लेकिन त्रुटि जांच करने में वाकई मुश्किल है। आप एक अलग लाइब्रेरी में डेटा संरचनाओं को सीधे पॉप्युलेट करने के बजाय वाईएएमएल जैसे परिभाषित पार्सेबल प्रारूप में कॉन्फ़िगरेशन डेटा संग्रहीत करने से बेहतर होगा। – Ether

+0

@ अन्य मैं कारणों के बारे में सोच सकता हूं कि एक पर्ल डेटा संरचना (इसकी असुरक्षित और असमर्थनीय) में कॉन्फ़िगर जानकारी को चिपकाने के लिए नहीं, लेकिन त्रुटि जांच उनमें से एक नहीं है। पर्ल आपके लिए जांच करता है। '$ फाइल करें || मरना पर्याप्त है। – Schwern

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