2016-10-02 9 views
5

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

+0

वैश्विक चर नामकरण के साथ एक महत्वपूर्ण कारक बन जाता है। आपने तीन वैश्विक चर क्या नाम दिए हैं? –

उत्तर

5

विशिष्ट परिदृश्यों में वैश्विक चर का उपयोग करने में कुछ भी गलत नहीं है, खासकर वैश्विक सेटिंग्स या सिंगलटन ऑब्जेक्ट्स के लिए जो एक बार परिभाषित किए गए हैं और फिर बिना किसी संशोधन के आपके शेष कोड में उपयोग किए जाते हैं। कुंजी बिंदु चर बदलने से बचने के लिए है।

आपको राज्य के परिवहन के लिए वैश्विक चर का उपयोग करने के लिए नहीं है, यानी मूल्य बदलना। यदि आप अपने कोड में विभिन्न स्थानों पर वैश्विक चर के मान को बदलते हैं तो समस्या निवारण समस्याएं पीछे की ओर एक बड़ा दर्द बन जाती हैं, क्योंकि आप नियमित "चैनल" (पैरामीटर, वापसी मान) के बाहर जानकारी पास कर रहे हैं। यदि आपको अपने कोड में कहीं और वैश्विक वैरिएबल को संशोधित करने की आवश्यकता है तो यह वास्तव में हमेशा एक संकेत है कि आपको अपने आर्किटेक्चर का फिर से मूल्यांकन करना चाहिए।

+0

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

2

गतिशील Scoping

PowerShell का उपयोग कर PowerShell में वैश्विक चर बचना Dynamic Scoping लागू करता है। इन दिनों भाषा डिजाइन में यह दुर्लभ विकल्प है, लेकिन सही ढंग से लागू गतिशील स्कोपिंग वैश्विक चर की तुलना में नाम टकरावों पर डेवलपर को बेहतर नियंत्रण प्रदान करता है। यह समझने के लिए कि यह कैसे अपने मामले (रों) के लिए आवेदन कर सकता है, की सुविधा देता है निम्नलिखित खिलौना मॉड्यूल पर विचार करें:

# File Module1.psm1 

$module = "Module1" 
$Context = "User" 

function Log-Message($message) { 
    Write-Host "$module/${action}: $message ($LogLevel-$Context)" 
} 

function CommonCode { 
    Log-Message "In CommonCode" 
} 


function Invoke-Rollout($LogLevel = "Terse", $Context=$script:Context) { 
    $action = "Rollout" 
    CommonCode 
} 

function Invoke-Remove($LogLevel = "Terse", $Context=$script:Context) { 
    $action = "Remove" 
    CommonCode 
} 

function Set-Module1($Context=$script:Context) { 
    $script:Context = $Context 
} 

Export-ModuleMember -Function Invoke-Rollout, Invoke-Remove, Set-Module1 

यहाँ क्या महत्वपूर्ण है कि Log-Message में, चर $module, $action, $LogLevel और $LogContextवैश्विक नहीं हैं चर, इसके बजाय वे मुक्त चर हैं जिनके दायरे को अभी तक निर्धारित नहीं किया गया है। रनटाइम पर, पावरशेल गतिशील रूप से कॉल स्टैक में सबसे हालिया परिभाषा के आधार पर अपने बाध्यकारी को निर्धारित करेगा ...

विस्तार से इसे समझाने की कोशिश करने के बजाय, यह आपके लिए खिलौना मॉड्यूल के साथ खेलने के लिए सबसे अच्छा हो सकता है और देखें लॉगिंग पर गतिशील स्कॉइंग का प्रभाव क्या है। यहां कुछ प्रयोग किए गए हैं:

PS C:\temp> Import-Module -Force .\Module1.psm1 

PS C:\temp> Invoke-Rollout 
Module1/Rollout: In CommonCode (Terse-User) 

PS C:\temp> # For Sticky Change -- Set-Module1 
PS C:\temp> Set-Module1 -Context Machine 

PS C:\temp> Invoke-Rollout 
Module1/Rollout: In CommonCode (Terse-Machine) 

PS C:\temp> Invoke-Remove -LogLevel Verbose -Context XXX 
Module1/Remove: In CommonCode (Verbose-XXX) 

PS C:\temp> Invoke-Remove -Context User 
Module1/Remove: In CommonCode (Terse-User) 

PS C:\temp> $Context = "FooBar" # This should have no effet on Module1 

PS C:\temp> Invoke-Remove 
Module1/Remove: In CommonCode (Terse-Machine) 
संबंधित मुद्दे