शिम क्या है?


जवाबों:


92

विकिपीडिया से:

कंप्यूटर प्रोग्रामिंग में, एक शिम एक छोटा पुस्तकालय है जो पारदर्शी रूप से एक एपीआई को स्वीकार करता है, पास किए गए मापदंडों को बदलकर, ऑपरेशन को स्वयं संभालता है, या ऑपरेशन को अन्यत्र पुनर्निर्देशित करता है। शिम आमतौर पर तब आते हैं जब एपीआई का व्यवहार बदल जाता है, जिससे पुराने अनुप्रयोगों के लिए संगतता समस्याएँ पैदा होती हैं जो अभी भी पुरानी कार्यक्षमता पर निर्भर हैं। इन मामलों में, पुराने एपीआई को अभी भी नए कोड के शीर्ष पर एक पतली संगतता परत द्वारा समर्थित किया जा सकता है। शिम का उपयोग विभिन्न सॉफ्टवेयर प्लेटफार्मों पर प्रोग्राम चलाने के लिए भी किया जा सकता है, क्योंकि वे इसके लिए विकसित किए गए थे।


82
यह उत्तर विकिपीडिया पर वास्तविक Google खोज करने से अलग नहीं है। एक उदाहरण अच्छा होगा।
नृत्य २

4
यह पुस्तकालयों में अंतर करने के लिए मुखौटा डिजाइन पैटर्न के उपयोग की तरह लगता है।
blz

84

विकिपीडिया में परिभाषित "शिम" शब्द को तकनीकी रूप से इसकी परिभाषा के आधार पर "संरचनात्मक" डिजाइन पैटर्न के रूप में वर्गीकृत किया जाएगा। "स्ट्रक्चरल" डिजाइन पैटर्न के कई प्रकार स्पष्ट रूप से वर्णित हैं (कुछ लोग डिफेक्टो कहेंगे) ऑब्जेक्ट ओरिएंटेड सॉफ्टवेयर डिजाइन पैटर्न संदर्भ "डिजाइन पैटर्न, पुन: प्रयोज्य ऑब्जेक्ट-ओरिएंटेड सॉफ्टवेयर के तत्व" को "गैंग ऑफ फोर" के रूप में जाना जाता है ।

"चार के गैंग" पाठ रूपरेखा के रूप में, "प्रॉक्सी", "एडाप्टर" और "फसाड" जो सब प्रदान करते हैं "शिम" प्रकार कार्यक्षमता में जाना जाता है कम से कम 3 अच्छी तरह से स्थापित पैटर्न। अधिकांश क्षेत्रों में यह अक्सर एक ही मूल अवधारणा के लिए अलग-अलग शब्दकोषों के उपयोग और मिस उपयोग का कारण होता है जो लोगों को भ्रम का कारण बनता है। अधिक विशिष्ट "स्ट्रक्चरल" डिजाइन पैटर्न "प्रॉक्सी" , "एडाप्टर" और "मुखौटा " का वर्णन करने के लिए "शिम" शब्द का उपयोग करना निश्चित रूप से इस प्रकार की स्थिति का एक स्पष्ट उदाहरण है। एक "शिम" अधिक विशिष्ट प्रकार के "स्ट्रक्चरल" पैटर्न "प्रॉक्सी", "एडेप्टर", "फेसडे" और संभवतः अन्य के लिए एक सामान्य शब्द है।


5
यह उत्तर इंगित करता है कि एक शिम एक डिज़ाइन पैटर्न (कई में से एक) है, कुछ समान डिज़ाइन पैटर्न का नाम देता है, और एक स्पर्शरेखा पर बंद हो जाता है कि लोग विभिन्न योगों द्वारा कैसे भ्रमित हो जाते हैं। लेकिन यह वास्तव में मूल प्रश्न का उत्तर नहीं देता है कि शिम क्या है, यह क्या करता है, या इसका उपयोग कैसे किया जाता है।
रिची थॉमस

53

कार्टून के माध्यम से सरल व्याख्या

एक शिम का उदाहरण:

मेरा कुत्ता राल्फ़ एक भाग्यशाली बैश-टैर्ड है (डबल सज़ा का इरादा)

सारांश

नोट: उपमा तनावपूर्ण है। आमतौर पर राल्फ़ को वास्तव में वही मिलेगा जो उन्होंने मांगा था - लेकिन एचओवी के मैकेनिक्स को जो प्राप्त हुआ वह कुछ ऐसा है जिसकी वह उम्मीद नहीं कर सकता है।

एक शिम कुछ कोड है जो किसी के बारे में समझदार होने के बिना, उसके द्वारा पूछे जाने वाले ('इंटरसेप्शन') का ध्यान रखता है। यह सामान्य अवधारणा है। अब आपको शिम पर विकिपीडिया प्रविष्टि को पढ़ने और समझने में सक्षम होना चाहिए।


13

शब्द की उत्पत्ति के लिए, Apple के शब्दकोश विजेट को छोड़ें

noun
   a washer or thin strip of material used to align parts, 
   make them fit, or reduce wear.

verb ( shimmed, shimming) [ trans. ]
   wedge (something) or fill up (a space) with a shim.

ORIGIN early 18th cent.: of unknown origin

यह वेब डिजाइनर शब्द का उपयोग करने के साथ काफी अच्छी तरह से फिट बैठता है।


13

यूनिट परीक्षण के लिए अन्य असेंबली से अपने आवेदन को अलग करने के लिए .net 4.5 Microsoft Fakes फ्रेमवर्क में शम्स का उपयोग किया जाता है । शिम डायवर्ट करने के लिए विशिष्ट विधियों को कॉल करते हैं जिन्हें आप अपने परीक्षण के हिस्से के रूप में लिखते हैं


12

Microsoft के लेख "डीमिस्टिफ़ाइंग शिम्स" के अनुसार :

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

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

लेख एक उदाहरण के रूप में विंडोज एपीआई का उपयोग करता है, और मुझे निम्नलिखित वाक्य प्रासंगिक मिला:

आवेदन आम तौर पर इस बात से अनजान है कि अनुरोध विंडोज के बजाय एक शिम डीएलएल के लिए जा रहा है, और विंडोज इस बात से अनजान है कि अनुरोध एप्लिकेशन के अलावा किसी अन्य स्रोत से आ रहा है (क्योंकि शिम डीएलएल आवेदन की प्रक्रिया के अंदर सिर्फ एक और डीएलएल है) ।

इस उद्धरण को सामान्य करने के लिए, दो कार्यक्रमों जो "शिम सैंडविच" की "रोटी" बनाते हैं, उनके समकक्ष कार्यक्रम से बात करने और शिम से बात करने के बीच अंतर करने में सक्षम नहीं होना चाहिए।

शिम का उपयोग करने के कुछ पेशेवरों और विपक्ष क्या हैं?

फिर से, लेख से:

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

इस प्रश्न के संदर्भ में, उपरोक्त लिंक को पढ़ने के बाद "प्रॉक्सी", "एडेप्टर", और "मुखौटा" जैसे शब्द अधिक अर्थ (कम से कम मेरे लिए) बनाते हैं।


3

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

हालांकि, मुझे लगता है कि मैं एक अच्छा उदाहरण जोड़ सकता हूं, जो जावास्क्रिप्ट ES5 शिम ( https://github.com/es-shims/es5-shim ) है:

जावास्क्रिप्ट पिछले कुछ वर्षों के दौरान बहुत विकसित हुआ है, और भाषा विनिर्देश में कई अन्य परिवर्तनों के बीच, इसकी मुख्य वस्तुओं में बहुत सारे नए तरीके जोड़े गए हैं।

उदाहरण के लिए, ES2015 विनिर्देश (उर्फ ES5) में, पद्धति findको Arrayप्रोटोटाइप में जोड़ा गया है । तो मान लीजिए कि आप इस स्पेसिफिकेशन से पहले JavasScript इंजन का उपयोग करके अपना कोड चला रहे हैं (उदा: Node 0.12) जो अभी तक उस विधि की पेशकश नहीं करता है। ES5 शिम को लोड करके, इन नए तरीकों को जोड़ा जाएगाArray प्रोटोटाइप में , जिससे आप उनका उपयोग कर पाएंगे, भले ही आप नए जावास्क्रिप्ट विनिर्देश पर न चल रहे हों।

आप पूछ सकते हैं: पर्यावरण को नए संस्करण में बदलने के बजाय कोई ऐसा क्यों करेगा?

बहुत सारे वास्तविक मामलों के परिदृश्य हैं जहां यह दृष्टिकोण समझ में आता है। एक अच्छा उदाहरण:

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

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

इसके बजाय, आप इस शिम का उपयोग कर सकते हैं और इन नए तरीकों का उपयोग कर सकते हैं, इस तथ्य का लाभ उठाते हुए कि यह फिक्स / कार्यक्षमता अपग्रेड के बाद संगत होगी, क्योंकि आप पहले से ही ज्ञात विशेषताओं का उपयोग कर रहे हैं जो अगले विनिर्देश में उपलब्ध हैं। और एक बोनस कारण है: चूंकि ये विधियाँ अगले भाषा विनिर्देश के मूल निवासी हैं, इसलिए एक अच्छा मौका है कि वे किसी भी क्रियान्वयन की तुलना में तेजी से चलेंगे जो कि आप कर सकते थे यदि आपने अपना संस्करण बनाने की कोशिश की थी।

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

PS: 1) आप इन जावास्क्रिप्ट शिम से संबंधित शब्द "पॉलीफ़िल" देखेंगे। पॉलिफ़िल एक विशेष प्रकार का शिम है जो विभिन्न ब्राउज़र स्तर के विनिर्देशों में आगे संगतता प्रदान करने के लिए उपयोग किया जाता है। वैसे, ऊपर दिया गया मेरा उदाहरण इस तरह के उदाहरण से बिल्कुल मेल खाता है।

2) शम्स इस उदाहरण तक सीमित नहीं हैं (भविष्य की रिलीज़ में उपलब्ध कार्यक्षमता को जोड़ना)। अलग-अलग उपयोग के मामले हैं जिन्हें शिम भी माना जाएगा।

3) यदि आप उत्सुक हैं कि यह विशिष्ट पॉलीफ़िल कैसे लागू किया जाता है, तो आप जावास्क्रिप्ट Array.find चश्मा खोल सकते हैं और उस पृष्ठ के अंत में स्क्रॉल कर सकते हैं, जहाँ आपको इस पद्धति के लिए एक कैनोनिकल कार्यान्वयन मिलेगा।


0

SHIM सुरक्षा जांच का एक और स्तर है जो सभी सेवाओं के लिए किया जाता है, अपस्ट्रीम सिस्टम की सुरक्षा के लिए। SHIM सर्वर हर आने वाले अनुरोध को सत्यापित करता है, हेडर उपयोगकर्ता क्रेडेंशियल्स के साथ, उपयोगकर्ता क्रेडेंशियल्स के खिलाफ, जो अनुरोध (SOAP / RESTFUL) में पारित किए जाते हैं।

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