2010-03-19 7 views
6

पर्ल में, जब आपके पास नेस्टेड डेटा संरचना होती है, तो डी-रेफरेंसिंग तीरों को 2 डी और घोंसले के स्तर तक छोड़ने की अनुमति है। दूसरे शब्दों में, निम्न दोनों वाक्यविन्यास समान हैं:पर्ल में नेस्टेड डेरफ्रेंसिंग तीर: छोड़ने या छोड़ने के लिए नहीं?

my $hash_ref = { 1 => [ 11, 12, 13 ], 3 => [31, 32] }; 

my $elem1 = $hash_ref->{1}->[1]; 
my $elem2 = $hash_ref->{1}[1]; # exactly the same as above 

अब, मेरे सवाल है, इसका कोई खास कारण अन्य के ऊपर एक शैली का चयन करने के लिए है?

यह स्टाइलिस्ट विवाद की एक लोकप्रिय हड्डी प्रतीत होता है (बस एसओ पर, मैं गलती से this और this में 5 मिनट की जगह में घुस गया)।

अब तक सामान्य संदिग्धों की लगभग कोई भी कुछ भी निश्चित कहते हैं:

  • perldoc केवल कहते हैं, "आप सूचक dereferencing तीर छोड़ देते हैं करने के लिए स्वतंत्र हैं।"
  • Conway का "पर्ल बेस्ट प्रैक्टिस" कहता है, "जब भी संभव हो, तीरों के साथ अव्यवस्था" कहता है, लेकिन ऐसा लगता है कि मुख्य संदर्भ को संदर्भित करने के संदर्भ में केवल लागू होता है, न कि 2 डी स्तर के नेस्टेड डेटा संरचनाओं पर वैकल्पिक तीर।
  • "मास्टरिंग Bioinfirmatics के लिए पर्ल" लेखक जेम्स Tisdall बहुत ठोस वरीयता नहीं देता है या तो:

    "तेज बुद्धि पाठक देखा है कि हम सरणी के बीच तीर ऑपरेटरों को छोड़ते हुए लग रहे हो सकता है सबस्क्रिप्ट्स। (आखिरकार, ये अज्ञात सरणी के अज्ञात सरणी अज्ञात सरणी आदि के अज्ञात सरणी हैं, इसलिए उन्हें [$ array -> [$ i] -> [$ j] -> [$ के]?) पर्ल इसे अनुमति देता है; परिवर्तनीय नाम के बीच केवल तीर ऑपरेटर और पहली सरणी सबस्क्रिप्ट आवश्यक है। यह आंखों पर चीजों को आसान बनाता है और कार्पल सुरंग सिंड्रोम से बचने में मदद करता है। दूसरी तरफ, आप को पर डेरफ़्रेंसिंग तीर रखने के लिए पसंद कर सकते हैं, यह स्पष्ट कर लें कि आप संदर्भों से निपट रहे हैं। आपकी पसंद। "

  • UPDATED" मध्यवर्ती पर्ल ", अपने सह लेखक ब्रायन डी Foy के अनुसार, तीर छोड़ते हुए अनुशंसा करता है। नीचे ब्रायन की पूर्ण उत्तर देखें।

व्यक्तिगत रूप से, मैं 'के पक्ष में हूँ "हमेशा में तीर डाल दिया, क्योंकि यह अधिक पठनीय है और स्पष्ट है कि वे एक संदर्भ के साथ काम कर रहे"

अद्यतन अधिक विशिष्ट फिर से होने के लिए:। पठनीयता, एक बहु नेस्टेड अभिव्यक्ति के मामले में wher ई सबस्क्रिप्ट स्वयं अभिव्यक्ति हैं, तीर अभिव्यक्तियों को एक दूसरे से स्पष्ट रूप से अलग करके अभिव्यक्तियों को "दृष्टि से टोकननाइज़" करने में सहायता करते हैं।

+0

ब्रायन की - प्रणाली मुझे नहीं बताया है कि आप अपने जवाब है, देर से देख के लिए खेद अपडेट किया गया। – DVK

उत्तर

13

जब तक आप वास्तव में टाइपिंग या अत्यधिक लंबी लाइनों का आनंद नहीं लेते हैं, तब तक तीरों का उपयोग न करें जब आपको उनकी आवश्यकता न हो। सबस्क्रिप्ट के बगल में सदस्यता संदर्भों को दर्शाती है, इसलिए सक्षम प्रोग्रामर को इसे समझने के लिए अतिरिक्त संकेतों की आवश्यकता नहीं होती है।

मैं असहमत हूं कि अतिरिक्त तीरों के लिए यह अधिक पठनीय है।यह निश्चित रूप से अपरंपरागत है कि वे इस शब्द के दिलचस्प हिस्सों को एक दूसरे से दूर ले जाएं।

Intermediate Perl में, जहां हम वास्तव में संदर्भ सिखाते हैं, हम आपको अनावश्यक तीरों को छोड़ने के लिए कहते हैं।

इसके अलावा, याद रखें कि "पठनीयता" जैसी कोई चीज़ नहीं है। केवल वही है जो आपने (और दूसरों) ने अपनी आंखों को पैटर्न के रूप में पहचानने के लिए प्रशिक्षित किया है। आप चरित्र-दर-चरित्र चीजों को नहीं पढ़ते हैं, फिर पता लगाएं कि उनका क्या मतलब है। आप उन चीजों के समूह देखते हैं जिन्हें आपने पहले देखा है और उन्हें पहचान लिया है। बेस सिंटैक्स स्तर पर आप किस बारे में बात कर रहे हैं, आपकी "पठनीयता" केवल पैटर्न को पहचानने की आपकी क्षमता है। जितना अधिक आप इसका इस्तेमाल करते हैं, पैटर्न को पहचानना आसान है, इसलिए यह आश्चर्य की बात नहीं है कि अब आप जो भी करते हैं वह आपके लिए "पठनीय" है। नई शैली पहले अजीब लगती है, लेकिन अंततः अधिक पहचानने योग्य बन जाती है, और इस प्रकार अधिक "पठनीय"।

उदाहरण जो आप अपनी टिप्पणियों में देते हैं उसे पढ़ना मुश्किल नहीं है क्योंकि इसमें तीरों की कमी है। यह अभी भी तीर के साथ पढ़ने के लिए मुश्किल है:

$expr1->[$sub1{$x}]{$sub2[$y]-33*$x3}{24456+myFunct($abc)} 
$expr1->[$sub1{$x}]->{$sub2[$y]-33*$x3}->{24456+myFunct($abc)} 

मैं इस तरह कोड की इस प्रकार की लिखते हैं, चर नाम के इन प्रकार का उपयोग कर कंटेनर की तरह प्रत्येक स्तर है के बारे में अगले सांकेतिक शब्दों में बदलनेवाला याद दिलाने के लिए:

my $index = $sub1{$x}; 
my $key1 = $sub2[$y]-33*$x3; 
my $key2 = 24456+myFunct($abc); 

$expr1->[ $index ]{ $key1 }{ $key2 }; 

इसे और भी बेहतर बनाने के लिए, सबराउटिन में विवरण छुपाएं (यही वह है जो वे वहां हैं :) इसलिए आपको डेटा संरचना की उस गड़बड़ी के साथ सीधे खेलना नहीं है। यह अधिक पठनीय है कि उनमें से कोई भी:

my $value = get_value($index, $key1, $key2); 

    my $value = get_value(
    $sub1{$x}, 
    $sub2[$y]-33*$x3, 
    24456+myFunct($abc) 
    ); 
+0

भले ही ब्रायन को मेरे वोट की आवश्यकता नहीं है, लेकिन मुझे वास्तव में "शब्द के दिलचस्प भाग" बिंदु पसंद हैं। – Axeman

+0

ब्रायन - जेफोमी को मेरे बिंदु पर कोई इनपुट? जैसे सब्सक्रिप्शन के बीच अतिरिक्त अंतर उन्हें "दृष्टि से टोकननाइज़" करने में मदद करता है - यह $ -> [2] {c} लिखते समय थोड़ा मायने रखता है लेकिन "$ expr1 -> [$ sub1 {$ x}] {$ जैसे अधिक शामिल अभिव्यक्ति के साथ बहुत कुछ उप 2 [$ y] -33 * $ x3} {24456 + myFunct ($ abc)} "(मेरा वास्तविक कोड नहीं!) – DVK

+0

पीएस पूरी तरह से असंबंधित - लेकिन क्या आपके पास इस मेटा प्रश्न के लिए कोई जवाब है? http://meta.stackexchange.com/questions/42797/randal-schwartz-on-so-but-not-in-perl – DVK

1

मैंने हमेशा सभी तीरों को लिखा है। मैं आपसे सहमत हूं, वे अलग-अलग सबस्क्रिप्ट को अलग करते हैं। इसके अलावा मैं नियमित अभिव्यक्तियों के लिए घुंघराले ब्रेसिज़ का उपयोग करता हूं, इसलिए {foo}{bar} एक प्रतिस्थापन है: s{foo}{bar}$s->{foo}{bar} से $s->{foo}->{bar} से अधिक खड़ा है।

2

-> तीर के बाद से -;

मुझे नहीं लगता है, यह एक बड़ी बात है, हालांकि है करते कोड कि अतिरिक्त तीर छोड़ देता है पढ़ने एक समस्या (के रूप में किसी भी खरोज है कि एक मैं का उपयोग नहीं है के खिलाफ) नहीं है गैर-वैकल्पिक रूप से विधि कॉल के लिए उपयोग किया जाता है, मैं इसे केवल कॉल कोड के लिए उपयोग करना पसंद करता हूं। तो मैं निम्नलिखित का प्रयोग करेंगे: हमेशा वापस करने के लिए

$object->method; 
$coderef->(); 
$$dispatch{name}->(); 

$$arrayref[1]; 
$$arrayref[1][5]; 
@$arrayref[1 .. 5]; 
@$arrayref; 
$$hashref{foo}; 
$$hashref{foo}{bar}; 
@$hashref{qw/foo bar/}; 
%$hashref; 

दो sigils वापस एक भिन्नता का मतलब है, और संरचना अपसंदर्भन के सभी रूपों (अदिश, टुकड़ा, सभी) भर में लगातार बनी हुई है।

यह भी चर "एक साथ" जो मैं अधिक पठनीय को खोजने के सभी भागों रहता है, और यह छोटे :)

+0

लेकिन सभी बहिष्कारों में नहीं है दो सिग्ल्स बैक-टू-बैक :) –

+1

बिल्कुल, और चूंकि विधि के लिए विकल्प हैं, और विधि कॉल के लिए नहीं ... "मुझे लगता है कि दृश्य रूपक बहुत महत्वपूर्ण हैं। यह कैसा दिखता है। अलग-अलग चीजों को अलग दिखना चाहिए। उसी प्रकार का।" ~ लैरी दीवार। कॉलिंग कोड dereferencing के अन्य रूपों से बहुत अलग है। –

+2

$ {$ हैश {ए}} {बी} और $$ हैश {ए} {बी} पर विचार करें, और अनुभवहीन पेरलर को यह बताने के लिए कि वे अलग क्यों हैं। उन चीजों को अग्रणी तीर से अलग दिखाना बहुत आसान है। जैसा लैरी ने कहा, अलग-अलग चीजों को अलग दिखना चाहिए। –

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