PHP में सिंगलेट्स की आवश्यकता किसे है?
ध्यान दें कि एकल के लगभग सभी आपत्तियां तकनीकी दृष्टिकोण से आती हैं - लेकिन वे भी अपने दायरे में सीमित हैं। खासकर PHP के लिए। सबसे पहले, मैं सिंग्लेटन्स का उपयोग करने के कुछ कारणों की सूची दूंगा, और फिर मैं सिंग्नलों के उपयोग की आपत्तियों का विश्लेषण करूंगा। सबसे पहले, जिन लोगों को उनकी आवश्यकता है:
- जो लोग एक बड़े ढांचे / कोडबेस को कोड कर रहे हैं, जो कई अलग-अलग वातावरणों में उपयोग किए जाएंगे, उन्हें पहले से मौजूद, अलग-अलग फ्रेमवर्क / कोडबेस के साथ काम करना होगा, कई अलग-अलग, बदलते, यहां तक कि ग्राहकों और मालिकों के लिए अनुरोधों को लागू करने की आवश्यकता के साथ। / प्रबंधन / इकाई नेता करते हैं।
देखें, सिंगलटन पैटर्न स्वयं समावेशी है। जब किया जाता है, तो एक एकल वर्ग आपके द्वारा शामिल किए गए किसी भी कोड में कठोर होता है, और यह ठीक उसी तरह कार्य करता है जैसे आपने इसके तरीके और चर कैसे बनाए। और किसी दिए गए अनुरोध में हमेशा एक ही वस्तु होती है। चूंकि यह दो अलग-अलग वस्तुओं के लिए दो बार नहीं बनाया जा सकता है, आप जानते हैं कि एक कोड में किसी भी बिंदु पर एक सिंगलटन ऑब्जेक्ट क्या है - भले ही सिंगलटन को दो, तीन अलग-अलग, पुराने, यहां तक कि स्पेगेटी कोडबेस में डाला जाए। इसलिए, यह विकास के उद्देश्यों के संदर्भ में आसान बनाता है - भले ही उस परियोजना में कई लोग काम कर रहे हों, जब आप किसी सिंगलबेल को किसी भी कोडबेस में एक बिंदु पर आरंभीकृत होते हुए देखते हैं, तो आप जानते हैं कि यह क्या है, यह क्या करता है, यह कैसे होता है करता है, और यह जिस राज्य में है। यदि यह पारंपरिक वर्ग था, तो आपको उस वस्तु का ट्रैक रखने की आवश्यकता होगी जो पहली बार बनाई गई थी। कोड में उस बिंदु तक, और इसकी विशेष स्थिति तक इसमें कौन से तरीके लागू किए गए थे। लेकिन, एक सिंगलटन को वहीं छोड़ दें, और यदि आपने उचित डिबगिंग और सूचना विधियों को छोड़ दिया और इसे कोडिंग करते समय सिंगलटन में ट्रैकिंग करते हैं, तो आप वास्तव में जानते हैं कि यह क्या है। इसलिए, यह उन लोगों के लिए आसान बनाता है जिन्हें अलग-अलग कोडबेस के साथ काम करना पड़ता है, कोड को एकीकृत करने की आवश्यकता के साथ जो पहले अलग-अलग दर्शन के साथ किया गया था, या उन लोगों द्वारा किया गया जिनके साथ आपका कोई संपर्क नहीं है। (यह है, विक्रेता-परियोजना-कंपनी-जो कुछ भी नहीं है, कोई समर्थन नहीं है)। यह उन लोगों के लिए आसान बनाता है जिन्हें अलग-अलग कोडबेस के साथ काम करना पड़ता है, कोड को एकीकृत करने की आवश्यकता के साथ जो पहले अलग-अलग दर्शन के साथ किया गया था, या उन लोगों द्वारा किया गया, जिनके साथ आपका कोई संपर्क नहीं है। (यह है, विक्रेता-परियोजना-कंपनी-जो कुछ भी नहीं है, कोई समर्थन नहीं है)। यह उन लोगों के लिए आसान बनाता है जिन्हें अलग-अलग कोडबेस के साथ काम करना पड़ता है, कोड को एकीकृत करने की आवश्यकता के साथ जो पहले अलग-अलग दर्शन के साथ किया गया था, या उन लोगों द्वारा किया गया, जिनके साथ आपका कोई संपर्क नहीं है। (यह है, विक्रेता-परियोजना-कंपनी-जो कुछ भी नहीं है, कोई समर्थन नहीं है)।
- जिन लोगों को तीसरे पक्ष के एपीआई , सेवाओं और वेबसाइटों के साथ काम करने की आवश्यकता है ।
यदि आप करीब से देखते हैं, तो यह पहले के मामले से बहुत अलग नहीं है - थर्ड-पार्टी एपीआई, सेवाएं, वेबसाइट, केवल बाहरी, पृथक कोडबेस की तरह हैं, जिन पर आपका कोई नियंत्रण नहीं है। कुछ भी हो सकता है। इसलिए, एक सिंगलटन सत्र / उपयोगकर्ता वर्ग के साथ, आप किसी भी प्रकार के सत्र / प्राधिकरण कार्यान्वयन का प्रबंधन कर सकते हैं, जैसे कि OpenID , फेसबुक , ट्विटर और कई और अधिक - और आप SAME सिंगलटन ऑब्जेक्ट से एक ही समय में ये सभी कर सकते हैं - जो किसी भी कोड में किसी भी बिंदु पर एक ज्ञात स्थिति में, जो आप इसे प्लग इन करते हैं, आसानी से सुलभ है। आप अपनी स्वयं की वेबसाइट / एप्लिकेशन में SAME उपयोगकर्ता के लिए कई अलग-अलग, तृतीय-पक्ष API / सेवाओं के लिए कई सत्र बना सकते हैं और जो कुछ भी आप उनके साथ करना चाहते हैं वह कर सकते हैं।
बेशक, यह सब सामान्य वर्गों और वस्तुओं का उपयोग करके पारंपरिक तरीकों के साथ भी टोन किया जा सकता है - यहां पकड़ है, सिंगलटन टिडियर, नटर है और इसलिए इस तरह की स्थितियों में पारंपरिक वर्ग / वस्तु के उपयोग की तुलना में उस प्रबंधनीय / परीक्षण योग्य आसान के कारण।
- जिन लोगों को तेजी से विकास करने की आवश्यकता है
एकल के वैश्विक प्रकार के व्यवहार से फ्रेमवर्क के साथ किसी भी प्रकार का कोड बनाना आसान हो जाता है जिसमें निर्माण करने के लिए एकल के संग्रह होते हैं, क्योंकि एक बार जब आप अपने एकल वर्ग का अच्छी तरह से निर्माण करते हैं, तो स्थापित, परिपक्व और सेट विधियां आसानी से उपलब्ध होंगी और कहीं भी प्रयोग करने योग्य, कभी भी, एक सुसंगत फैशन में। आपकी कक्षाओं को परिपक्व करने में कुछ समय लगता है, लेकिन उसके बाद, वे ठोस और सुसंगत, और उपयोगी होते हैं। आप एक सिंगलटन में कई तरीके अपना सकते हैं, जो आप चाहते हैं, और हालांकि, यह ऑब्जेक्ट की मेमोरी फ़ुटप्रिंट को बढ़ा सकता है, यह तेजी से विकास के लिए आवश्यक समय में बहुत अधिक बचत लाता है - एक विधि जिसे आप किसी दिए गए उदाहरण में उपयोग नहीं कर रहे हैं एक एप्लिकेशन को किसी अन्य एकीकृत में उपयोग किया जा सकता है, और आप बस एक नई सुविधा को थप्पड़ मार सकते हैं जिसे क्लाइंट / बॉस / प्रोजेक्ट मैनेजर केवल कुछ संशोधनों द्वारा पूछता है।
तुम्हें नया तरीका मिल गया है। अब एकल के आपत्तियों और अपवित्र धर्मयुद्ध पर आपत्ति जताते हैं, जो उपयोगी है :
- सबसे बड़ी आपत्ति यह है कि यह कठिन परीक्षण करता है।
और वास्तव में, यह कुछ हद तक होता है, भले ही यह उचित सावधानी बरतने और आसानी से कोडिंग डिबगिंग रूटीन को अपने सिंग्लेटन्स में इस एहसास के साथ कम किया जा सकता है कि आप एक सिंगलटन को डिबग करेंगे। लेकिन देखिए, यह किसी भी अन्य कोडिंग दर्शन / विधि / पैटर्न की तुलना में बहुत अलग नहीं है - यह सिर्फ इतना है कि, सिंगललेट अपेक्षाकृत नए हैं और व्यापक नहीं हैं, इसलिए वर्तमान परीक्षण विधियां उनके साथ तुलनात्मक रूप से असंगत हैं। लेकिन प्रोग्रामिंग भाषाओं के किसी भी पहलू में यह अलग नहीं है - विभिन्न शैलियों को अलग-अलग दृष्टिकोण की आवश्यकता होती है।
एक बिंदु यह आपत्ति उसमें सपाट हो जाती है, यह इस तथ्य की अनदेखी करता है कि विकसित किए गए कारण 'परीक्षण' के लिए नहीं हैं, और परीक्षण केवल चरण / प्रक्रिया नहीं है जो अनुप्रयोग विकास में जाता है। उत्पादन उपयोग के लिए अनुप्रयोगों का विकास किया जाता है। और जैसा कि मैंने समझाया कि 'किसको सिंगलटन सेक्शन' की जरूरत है, सिंगलनेट कई अलग-अलग कोडबेस / एप्लिकेशन / थर्ड-पार्टी सर्विसेज के साथ कोड काम करने और इनसाइड करने की जटिलता से एक महान सौदे में कटौती कर सकते हैं। जो समय परीक्षण में खो सकता है, वह समय विकास और परिनियोजन में प्राप्त होता है। यह तृतीय-पक्ष प्रमाणीकरण / अनुप्रयोग / एकीकरण के इस युग में विशेष रूप से उपयोगी है - फेसबुक, ट्विटर, ओपनआईडी, कई और अधिक और कौन जानता है कि आगे क्या है।
हालांकि यह समझ में आता है - प्रोग्रामर अपने करियर के आधार पर बहुत अलग परिस्थितियों में काम करते हैं। और ऐसे लोगों के लिए जो अपेक्षाकृत बड़ी कंपनियों में काम करते हैं, जो परिभाषित विभागों में अलग-अलग, परिभाषित सॉफ्टवेयर / एप्लिकेशन को सहज अंदाज में करते हैं और बिना बजट कटौती / छंटनी के आसन्न कयामत के साथ और बहुत सारे सामानों के साथ बहुत सारी चीजें करने की आवश्यकता होती है। एक सस्ते / तेज / विश्वसनीय फैशन के लिए, सिंगलटन इतने आवश्यक नहीं लग सकते हैं। और यह उपद्रव / बाधा भी हो सकती है कि उनके पास क्या है।
लेकिन उन लोगों के लिए जिन्हें 'फुर्तीली' विकास की गंदी खाई में काम करने की ज़रूरत है, अपने ग्राहक / प्रबंधक / परियोजना से कई अलग-अलग अनुरोधों (कभी-कभी अनुचित) को लागू करने के लिए, पहले बताए गए कारणों के कारण सिंगलटन एक बचत अनुग्रह है।
- एक और आपत्ति यह है कि इसकी मेमोरी फुटप्रिंट अधिक है
क्योंकि प्रत्येक ग्राहक से प्रत्येक अनुरोध के लिए एक नया सिंगलटन मौजूद होगा, यह MAY PHP के लिए एक आपत्ति है। बुरी तरह से निर्मित और उपयोग किए गए एकल के साथ, किसी एप्लिकेशन के मेमोरी फ़ुटप्रिंट अधिक हो सकते हैं यदि कई उपयोगकर्ताओं को किसी भी बिंदु पर एप्लिकेशन द्वारा सेवा दी जाती है।
हालांकि, यह किसी भी तरह के दृष्टिकोण के लिए मान्य है जो आप चीजों को कोड करते समय ले सकते हैं। जो प्रश्न पूछे जाने चाहिए, क्या वे तरीके हैं, डेटा जो इन सिंगलेटों द्वारा आयोजित और संसाधित किए जाते हैं अनावश्यक हैं? यदि वे अनुरोधों में से कई के लिए आवश्यक हैं, तो आवेदन प्राप्त कर रहे हैं, भले ही आप एकल, उन विधियों और डेटा का उपयोग न करें, जो आपके आवेदन में किसी न किसी रूप में कोड के माध्यम से मौजूद होंगे। तो, यह सब एक सवाल बन जाता है कि जब आप किसी पारंपरिक क्लास ऑब्जेक्ट 1/3 को कोड प्रोसेसिंग में इनिशियलाइज़ करते हैं, तो आप कितनी मेमोरी सेव कर रहे होंगे, और उसमें 3/4 को नष्ट कर देंगे।
देखें, जब इस तरह से रखा जाता है, तो सवाल काफी अप्रासंगिक हो जाता है - आपके कोड में किसी भी तरह से अनावश्यक तरीकों, डेटा को नहीं रखा जाना चाहिए - भले ही आप सिंगलटन का उपयोग करें या नहीं। तो, एकल के लिए यह आपत्ति वास्तव में प्रफुल्लित करने वाली हो जाती है, यह मानती है कि आपके द्वारा उपयोग की जाने वाली कक्षाओं से बनाई गई वस्तुओं में अनावश्यक तरीके, डेटा होंगे।
- कुछ अवैध आपत्तियाँ जैसे 'कई डेटाबेस को बनाए रखना असंभव / कठिन बना देता है'
मैं भी इस आपत्ति को समझना शुरू नहीं कर सकता, जब सभी को एक से अधिक डेटाबेस कनेक्शन, एकाधिक डेटाबेस चयन, कई डेटाबेस प्रश्न, दिए गए सिंगलटन में एकाधिक परिणाम सेट बनाए रखने की आवश्यकता होती है, जब तक कि वे सिंगलटन में वैरिएबल / सरणियों में लंबे समय तक रख रहे हों उनकी जरूरत है। यह उन्हें सरणियों में रखने के रूप में सरल हो सकता है, हालांकि आप जिस भी विधि का उपयोग करना चाहते हैं, उसे आविष्कार कर सकते हैं। लेकिन आइए किसी दिए गए सिंगलटन में सबसे सरल मामले, चर और सरणियों के उपयोग की जांच करें:
नीचे दी गई कल्पना कीजिए कि किसी दिए गए डेटाबेस सिंगलटन के अंदर:
$ यह -> कनेक्शन = सरणी (); (गलत सिंटैक्स, मैंने आपको चित्र देने के लिए इसे इस तरह टाइप किया - चर की उचित घोषणा सार्वजनिक $ कनेक्शन = सरणी () है, और इसका उपयोग $ यह है-> कनेक्शन ['कनेक्शन'] स्वाभाविक रूप से)
आप सेट अप कर सकते हैं, और किसी भी समय इस शैली में एक सरणी में कई कनेक्शन रख सकते हैं। और उसी के लिए प्रश्न, परिणाम सेट और आगे जाते हैं।
$ यह -> क्वेरी (QUERYSTRING, 'queryname', $ this-> कनेक्शन ['particulrconnection]]);
जो चयनित कनेक्शन के साथ एक चयनित डेटाबेस के लिए एक क्वेरी कर सकता है, और बस आपके स्टोर में स्टोर कर सकता है
$ यह -> परिणाम
प्रमुख 'क्वेरीनाम' के साथ सरणी। बेशक, आपको इसके लिए अपनी क्वेरी विधि कोडित करनी होगी - जो करने के लिए तुच्छ है।
यह आपको डेटाबेस की लगभग अनंत संख्या (जितना संसाधन सीमा की अनुमति देता है) को बनाए रखने में सक्षम बनाता है, उतना ही अलग-अलग डेटाबेस कनेक्शन और परिणाम सेट करता है जितना आपको उनकी आवश्यकता है। और वे किसी भी दिए गए कोडबेस में किसी भी बिंदु पर कोड के किसी भी टुकड़े के लिए उपलब्ध हैं, जिसमें इस एकल वर्ग को त्वरित किया गया है।
बेशक, आपको स्वाभाविक रूप से परिणाम सेट, और कनेक्शन की ज़रूरत पड़ने पर मुक्त करना होगा - लेकिन यह बिना कहे चला जाता है, और यह एकल या किसी अन्य कोडिंग पद्धति / शैली / अवधारणा के लिए विशिष्ट नहीं है।
इस बिंदु पर, आप देख सकते हैं कि आप एक ही सिंगलटन में तीसरे पक्ष के अनुप्रयोगों या सेवाओं के लिए कई कनेक्शन / राज्यों को कैसे बनाए रख सकते हैं। इतना अलग नहीं है।
लंबी कहानी छोटी, अंत में, सिंगलटन पैटर्न केवल एक अन्य विधि / शैली / दर्शन है जिसके साथ प्रोग्राम करना है, और वे किसी भी अन्य के रूप में उपयोगी हैं जब वे सही जगह पर, सही फैशन में उपयोग किए जाते हैं। जो किसी चीज से अलग न हो।
आप देखेंगे कि अधिकांश लेखों में, जिनमें एकल गीतों को धराशायी किया गया है, आपको 'ग्लोबल्स' के 'दुष्ट' होने के संदर्भ में भी देखा जाएगा।
आइए इसका सामना करें - कुछ भी जो ठीक से उपयोग नहीं किया जाता है, दुर्व्यवहार, दुरुपयोग, आईएस बुराई है। यह किसी भी भाषा, किसी भी कोडिंग अवधारणा, किसी भी विधि तक सीमित नहीं है। जब भी आप किसी को 'एक्स बुराई है' जैसे कंबल बयान जारी करते हुए देखते हैं, तो उस लेख से भाग जाते हैं। संभावना बहुत अधिक है कि यह एक सीमित दृष्टिकोण का उत्पाद है - भले ही दृष्टिकोण किसी विशेष चीज में वर्षों के अनुभव का परिणाम है - जो आम तौर पर किसी दिए गए शैली / पद्धति में बहुत अधिक काम करने का परिणाम है - ठेठ बौद्धिक रूढ़िवाद।
इसके लिए अंतहीन उदाहरण दिए जा सकते हैं, जिनमें 'ग्लोबल्स इज़ एविल' से लेकर 'इफ्रेम्स इज़ दुष्ट' हैं। लगभग 10 साल पहले, यहां तक कि किसी भी आवेदन में एक iframe के उपयोग का प्रस्ताव भी विधर्मी था। फिर फेसबुक आता है, हर जगह इफ्रेम्स, और देखो क्या हुआ है - इफ्रेम्स इतने बुरे नहीं हैं।
अभी भी ऐसे लोग हैं जो ज़िद करते हैं कि वे 'दुष्ट' हैं - और कभी-कभी अच्छे कारण के लिए भी - लेकिन, जैसा कि आप देख सकते हैं, एक ज़रूरत है, iframes उस ज़रूरत को पूरा करते हैं और अच्छी तरह से काम करते हैं, और इसलिए पूरी दुनिया बस चलती है।
एक प्रोग्रामर / कोडर / सॉफ्टवेयर इंजीनियर की सबसे महत्वपूर्ण संपत्ति एक स्वतंत्र, खुला और लचीला दिमाग है।