2012-01-08 12 views
23

संभव डुप्लिकेट:
Who needs singletons?सर्वश्रेष्ठ अभ्यास

मैं हमेशा सबसे अच्छा अभ्यास के संबंध में लिखते हैं, लेकिन मैं यह भी समझने के लिए क्यों किसी दिए गए बात एक है चाहता हूँ सर्वोत्तम अभ्यास

मैंने एक लेख में पढ़ा है (मुझे दुर्भाग्य से याद नहीं है) कि सिंगलटन कक्षाओं को स्थैतिक कार्यों के साथ किए जाने और स्कोप रिज़ॉल्यूशन ऑपरेटर (: :) के साथ उपयोग किए जाने के बजाय तत्काल होने की प्राथमिकता दी जाती है। तो अगर मैं एक वर्ग कि मान्य करने के लिए अपने सभी उपकरणों में शामिल है, संक्षेप में है:

class validate { 
    private function __construct(){} 
    public static function email($input){ 
     return true; 
    } 
} 

मैं क्योंकि के रूप में ऐसी बातों के बारे में बताया गया है इस बुरा व्यवहार (या कम से कम के खिलाफ चेतावनी दी) माना जाता है, कचरा कलेक्टर और रखरखाव। तो "सिंगलटन क्लास स्टैटिक विधियों के रूप में" की आलोचना क्या है, यह है कि मैं एक वर्ग को तत्काल करता हूं, मैं 100% निश्चित हूं, मैं केवल एक बार तुरंत चालू हो जाऊंगा। मेरे लिए यह "डबल काम" करने जैसा लगता है, क्योंकि यह सब तैयार है। मैं क्या खो रहा हूँ?

इस मामले पर क्या विचार है? बेशक यह जीवन और मौत का मुद्दा नहीं है, लेकिन अगर कोई विकल्प सही है, तो कोई भी सही तरीके से कर सकता है :)

+1

संभावित डुप्लिकेट [किसके लिए सिंगलेट की आवश्यकता है?] (Http://stackoverflow.com/a/4596323/208809) – Gordon

उत्तर

51
+1

लिंक के लिए धन्यवाद; पहले से ही उन्हें पढ़ रहे हैं। मुझे लगता है कि मैंने गलत व्याख्या की हो सकती है कि हालांकि एक सिंगलटन क्या है (जो नीचे दिए गए उत्तर में इंगित किया गया है) –

+0

@ मार्कहुनर्मंडजेन्सन ने आपके प्रश्न को पढ़ने के लिए सोचा। टैट्स क्यों लिंक पोस्ट किया;)। – ThinkingMonkey

+1

कृपया ध्यान दें निर्भरता इंजेक्शन निर्भरता इंजेक्शन कंटेनर के बराबर नहीं है। डी निश्चित रूप से एक अच्छी बात है; डीआईसी इसे लागू करने का एक तरीका है और यह आवश्यक नहीं है कि एक आकार-फिट-सभी समाधान (इस तथ्य के बावजूद कि फिलहाल PHP दुनिया में यह "प्रचलित" है)। निर्भरता तोड़ने के लिए एक सेवा लोकेटर या समान पैटर्न भी एक स्वीकार्य तरीका हो सकता है। – liquorvicar

2

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

+0

यह निश्चित रूप से समझाएगा कि मुझे तर्क क्यों नहीं मिल रहा है कि इस तरह की कक्षा एक समस्या होगी। तो एक सिंगलटन प्रति वर्ग नहीं कहता है जो केवल एक बार तत्काल होता है, लेकिन विधि-केवल एक बार बुलाया जाता है? –

5

एक सिंगलटन वस्तु एक वस्तु है कि केवल एक बार instantiated है।

: यह Singleton Pattern है, जो एक (विरोधी) पैटर्न कैसे एक वर्ग है कि केवल एक बार instantiated जा सकता है, सिंगलटन (बड़े एस शुरुआत में) लिखना है के समान नहीं है

"सुनिश्चित करें कि कक्षा में केवल एक उदाहरण है, और इसके लिए वैश्विक बिंदु प्रदान करें।"

जहां तक ​​PHP का संबंध है, आपको आमतौर पर सिंगलटन पैटर्न को लागू करने की आवश्यकता नहीं है। वास्तव में आपको ऐसा करने से बचना चाहिए जब आप सर्वोत्तम अभ्यास के लिए पूछते हैं, क्योंकि यह खराब अभ्यास है।

इसके अतिरिक्त आपके द्वारा प्राप्त किए गए अधिकांश PHP कोड उदाहरण पैटर्न के आधा तैयार कार्यान्वयन हैं जो उपेक्षा करते हैं कि PHP कैसे काम करता है। ये फर्जी कार्यान्वयन पैटर्न में "सुनिश्चित" के अनुरूप नहीं होते हैं।

यह कुछ भी बताता है: अक्सर यह आवश्यक नहीं है। यदि एक मैला कार्यान्वयन पहले से ही काम करता है, तो पैटर्न के करीब आने के दौरान भी नहीं, स्थिति के लिए गलत पैटर्न का उपयोग किया गया है, यह एंटी-पैटर्न बनना शुरू हो गया है।

PHP में सामान्य रूप से किसी भी वर्ग के केवल एक उदाहरण के लिए यह सुनिश्चित करने की आवश्यकता नहीं होती है कि PHP अनुप्रयोग उस जटिल नहीं हैं जो आपको चाहिए (उदाहरण के लिए कोई भी थ्रेड नहीं है जिसे परमाणु को संदर्भित करने की आवश्यकता हो सकती है उदाहरण)।

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

तो डिजाइन पैटर्न लागू करने से पहले प्रो और विपक्ष का मूल्यांकन करने की आवश्यकता है। बस कुछ पैटर्न का उपयोग करना अक्सर सहायक नहीं होता है।

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

+0

ग्रेट उत्तर - धन्यवाद :) –

+3

आपका पहला वाक्यांश विरोधाभासी है :)। -1। "PHP अनुप्रयोगों के लिए भी जटिल नहीं हैं"। आप किसी भी भाषा का उपयोग कर जटिल सॉफ्टवेयर लिख सकते हैं। डिज़ाइन पैटर्न सॉफ़्टवेयर आर्किटेक्चर से संबंधित हैं जो अंतर्निहित तकनीक के लिए नहीं हैं। मैं डाउनवोट तीन गुना होगा लेकिन मैं नहीं कर सकता। :) –

+0

@ जीओ सी। मैंने ऐसा क्यों लिखा है कि PHP अनुप्रयोगों को आम तौर पर प्रक्रियाओं और धागे में परमाणुता की आवश्यकता नहीं होती है जो * अधिक * जटिल सॉफ़्टवेयर में थ्रेड-सुरक्षित सिंगलेट का उपयोग-मामला है। आप शायद बहुत तेजी से निर्णय लेते हैं क्योंकि आपको लगता है कि कुछ विशिष्ट भाषा पर हमला किया था, लेकिन ऐसा नहीं है। यह सिर्फ सामान्य PHP कोड को पैटर्न के कार्यान्वयन की आवश्यकता नहीं है। यदि आपको अभी भी इसकी आवश्यकता है, तो मैं अपने ब्लॉग पर उस पैटर्न को भी पेश करता हूं। – hakre