मुझे एक कठपुतली मानकीकृत वर्ग का उपयोग क्यों करना चाहिए?


12

आम तौर पर जटिल कठपुतली मॉड्यूल के साथ काम करते समय, मैं नोड स्तर पर या एक कक्षा के अंदर चर सेट करूँगा। जैसे,

node 'foo.com' {
  $file_owner = "larry" 
  include bar 
}

class bar { 
  $file_name = "larry.txt"
  include do_stuff
}

class do_stuff {
  file { $file_name:
    ensure => file,
    owner  => $file_owner,
  }
}

कैसे / कब / क्यों पैराट्राइज्ड कक्षाएं इस स्थिति में मदद करती हैं? आप अपने कठपुतली मॉड्यूल की संरचना के लिए कैसे मानकीकृत कक्षाओं का उपयोग कर रहे हैं?


2
इस उदाहरण को खोजने वाले सभी लोगों पर ध्यान दें, यह कोड वैश्विक वैरिएबल लुकअप दिखाता है जिन्हें पपेट संस्करण <3.0 में अनुमति दी गई थी। कठपुतली> 3.0 में, आप चर को दायरे से बाहर नहीं कर सकते हैं, और चर तक पहुंचने के लिए नामस्थान का उपयोग करना चाहिए। इस उदाहरण में, आपको उन संबंधित चर का उपयोग $bar::file_nameऔर उपयोग करना होगा $::file_owner। हालाँकि, जब पैरामीरीज़ेड कक्षाओं का उपयोग किया जाता है, तो पैरामीटर के माध्यम से एक वर्ग में पारित होने वाले चर स्थानीय रूप से स्कोप किए गए चर बन जाते हैं।
robbyt

जवाबों:


12

परिमाणित कक्षाएं आपके कोड को बेहतर ढंग से संरचना करने में आपकी मदद करने के लिए एक भाषा निर्माण हैं। यह आपको वैश्विक चर (जैसे आपके उदाहरण में) का उपयोग करने से रोकता है।

कल्पना कीजिए कि आपने अपने नोड विवरण में 20 और कक्षाएं शामिल की हैं और सभी को कुछ वैरिएबल की आवश्यकता होगी जो कि मैनिफ़ेस्ट के ग्लोबल या नोड स्कोप में सेट किए जा रहे हैं। इसके अलावा, मानकीकृत कक्षाएं आपको आसानी से डिफ़ॉल्ट पैरामीटर रखने की अनुमति देती हैं, इसलिए आप कई अलग-अलग जगहों पर $file_ownerसमान मूल्य (जैसे larry) प्रदान करने के बजाय डिफ़ॉल्ट मान का उपयोग कर सकते हैं।

आपका उदाहरण स्निपेट (दो अतिरिक्त नोड्स के साथ) इस प्रकार लिखा जा सकता है:

node 'example.com' { 
  class { bar: }
}

node 'example.net' {
  class { bar: owner = "harry" }
}

node 'example.net' {
  class { bar: file_name = "barry.txt" }
}

class bar($owner = "larry", $file_name = "larry.txt") { 
  class { do_stuff: owner => $owner, file_name => $file_name }
}

class do_stuff($owner, $file_name) {
  file { $file_name:
    ensure => file,
    owner  => $owner,
  }
}

वैश्विक चर के आपके उपयोग के साथ, आपको $ownerप्रत्येक नोड में नामांकित चर घोषित करने की आवश्यकता होगी और आप $file_nameप्रति नोड चर / पैरामीटर को अधिलेखित करने में सक्षम नहीं होंगे । इसके बजाय आपको barप्रत्येक नोड के लिए एक और वर्ग घोषित करने की आवश्यकता होगी ।

कठपुतली की भाषा के विकास और निश्चित रूप से भाषा गाइड पर कुछ अच्छे उदाहरण दिए गए हैं कि कैसे इस भाषा के निर्माण के पीछे मानकीकृत वर्गों और औचित्य का उपयोग किया जाए:


8

इसके बारे में सोचने का सबसे अच्छा तरीका है कि आप पहले से ही कठपुतली मुहावरों को जानने के साथ शुरू करने के बजाय उस पर से आएं।

आप पहली जगह में क्या करने की कोशिश कर रहे हैं, एक कक्षा में पैरामीटर पारित कर रहे हैं - आपको यह जानकारी देने की आवश्यकता है कि यह तय करने के लिए कि किसी फ़ंक्शन के लिए तर्कों को कैसे व्यवहार करना है। यह कहें कि यह बहुत ख़तरनाक था और आपके पास एक फ़ंक्शन था जिसका नाम multiply_squares था। आप इसे पसंद करेंगे multiply_squares(3, 4), 3 और 4 को कुछ वैश्विक चर सेट नहीं करेंगे और फिर उन्हें फंक्शन के अंदर से पढ़ेंगे!

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.