दिलचस्प पोस्ट
HTML डिफ़ॉल्ट बॉडी मार्जिन "आईडी को हल नहीं किया जा सकता है या फ़ील्ड नहीं है" त्रुटि? आप IDisposable और आईओसी के साथ कैसे सुलझ सकते हैं? JQuery का उपयोग करते हुए फ़ंक्शन में डेटा $ लौटें PhantomJS को HTTPS साइट खोलने में विफल Django में कस्टम फ़ील्ड के साथ यूजर मॉडल का विस्तार मैं कई SQLite डेटाबेस कैसे मर्ज कर सकता हूं? रेजेक्स के साथ जावास्क्रिप्ट में एचटीएमएल टैग निकालें कैसे एक बटन क्लिक पर ListView से वस्तुओं को गतिशील हटायें? समारोह हस्ताक्षर का वापसी प्रकार हिस्सा है? निर्माता अभिनंदन तंत्र / usr / bin / codeign निकास कोड 1 के साथ विफल गिट में एक शाखा पर एक शाखा 'मर्ज' के बजाय मैं 'अधिलेखित' कैसे करूँ? आप SQL सर्वर 2005 डेटाबेस में सभी मौजूदा कनेक्शन कैसे मार सकते हैं? आईआईएस 7 एपलीकेशन पूल में नेट फ्रेमवर्क 4.5 संस्करण कैसे सेट करें I

कन्स्ट्रक्टर फ़ंक्शन बनाम फ़ैक्टरी फ़ंक्शन

क्या कोई कन्स्ट्रक्टर फ़ंक्शन और जावास्क्रिप्ट में फैक्ट्री फ़ंक्शन के बीच अंतर को स्पष्ट कर सकता है।

दूसरे के बजाय एक का उपयोग कब करना है?

वेब के समाधान से एकत्रित समाधान "कन्स्ट्रक्टर फ़ंक्शन बनाम फ़ैक्टरी फ़ंक्शन"

मूल अंतर यह है कि एक कन्स्ट्रक्टर फ़ंक्शन का इस्तेमाल new कीवर्ड के साथ किया जाता है (जो जावास्क्रिप्ट को स्वचालित रूप से एक नई ऑब्जेक्ट बना देता है, फंक्शन में उस ऑब्जेक्ट में सेट करता है, और ऑब्जेक्ट लौटाता है):

 var objFromConstructor = new ConstructorFunction(); 

एक फ़ैक्टरी फ़ंक्शन को "नियमित" फ़ंक्शन कहा जाता है:

 var objFromFactory = factoryFunction(); 

लेकिन इसे "कारखाना" माना जाने के लिए किसी वस्तु का एक नया उदाहरण वापस करने की आवश्यकता होगी: यदि आप इसे सिर्फ एक बूलीयन या कुछ चीज़ों में लौटाते हैं, तो आप उसे "फ़ैक्ट्री" फ़ंक्शन नहीं कहते। यह स्वचालित रूप से new साथ नहीं होता है, लेकिन यह कुछ मामलों के लिए अधिक लचीलेपन की अनुमति देता है।

वास्तव में एक सरल उदाहरण में ऊपर उल्लिखित फ़ंक्शंस ऐसा कुछ दिखाई दे सकता है:

 function ConstructorFunction() { this.someProp1 = "1"; this.someProp2 = "2"; } ConstructorFunction.prototype.someMethod = function() { /* whatever */ }; function factoryFunction() { var obj = { someProp1 : "1", someProp2 : "2", someMethod: function() { /* whatever */ } }; // other code to manipulate obj in some way here return obj; } 

बेशक आप कारखाने के कार्यों को उस सरल उदाहरण से अधिक जटिल बना सकते हैं।

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

फ़ैक्ट्री फ़ंक्शंस का एक फायदा यह है कि जब कुछ पैरामीटर के आधार पर लौटाए जाने वाले ऑब्जेक्ट कई अलग-अलग प्रकार के हो सकते हैं।

कन्स्ट्रक्टरों के उपयोग के लाभ

  • अधिकांश किताबें आपको कंस्ट्रक्टर और new का उपयोग करने के लिए सिखाती हैं

  • this नए ऑब्जेक्ट को संदर्भित करता है

  • कुछ लोग जैसे var myFoo = new Foo(); पढ़ता है।

कमियां

  • तात्कालिकता का विवरण कॉलिंग एपीआई ( new आवश्यकता के जरिए) में लीक हो जाता है, इसलिए सभी कॉल करने वाले कन्स्ट्रक्टर कार्यान्वयन के लिए कसकर युग्मित हैं। यदि आपको कभी भी फैक्ट्री की अतिरिक्त लचीलेपन की आवश्यकता होती है, तो आपको सभी कॉलर्स (नियम के बजाय असाधारण मामला) को फिर से लागू करना होगा।

  • new भूलना ऐसा एक सामान्य बग है, आपको दृढ़ता से एक बायलरप्लेट चेक जोड़ने पर विचार करना चाहिए कि यह सुनिश्चित करने के लिए कि कन्स्ट्रक्टर को सही तरीके से कहा जाता है ( if (!(this instanceof Foo)) { return new Foo() } ) संपादित करें: ES6 (ES2015) के बाद से आप एक class कन्स्ट्रक्टर के साथ new नहीं भूल सकते हैं या कन्स्ट्रक्टर एक त्रुटि फेंक देगा।

  • यदि आप जांच के instanceof देखते हैं, तो यह अस्पष्टता को छोड़ता है कि क्या new आवश्यक है या नहीं। मेरी राय में, यह नहीं होना चाहिए आपने new आवश्यकता को प्रभावी ढंग से कम सर्किट किया है, जिसका मतलब है कि आप दोष # 1 को मिटा सकते हैं लेकिन फिर आपको बस एक फ़ैक्टरी फ़ंक्शन मिल गया है , लेकिन नाम , अतिरिक्त बॉयलरप्लेट, कैपिटल लेटर, और कम लचीला this संदर्भ में।

कन्स्ट्रक्टर ओपन / क्लोज़ प्रिंसिपल को तोड़ देते हैं

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

आप फंस रहे हैं, यद्यपि। आप सभी कोड को तोड़ने के बिना बदलाव नहीं कर सकते हैं जो आपके कन्स्ट्रक्टर को new साथ कॉल करता है। उदाहरण के लिए, आप प्रदर्शन लाभों के लिए ऑब्जेक्ट पूल का उपयोग नहीं कर सकते।

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

कारखानों का उपयोग करने के लाभ

  • कम कोड – कोई बॉयलरप्लेट आवश्यक नहीं है।

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

  • आपको किसी कारखाने से कन्स्ट्रक्टर में बदलने की कोई आवश्यकता नहीं होती है, इसलिए रिफैक्टरिंग कभी भी एक समस्या नहीं होगी।

  • new उपयोग करने के बारे में कोई अस्पष्टता नहीं है मत करो। (यह this तरह से खराब व्यवहार करेगा, अगले बिंदु देखें)।

  • यह सामान्य रूप से व्यवहार करता है – ताकि आप इसे मूल वस्तु (उदाहरण के लिए, player.create() अंदर पहुंचने के लिए उपयोग कर सकते हैं, this किसी भी अन्य पद्धति के आह्वान की तरह player को संदर्भित करता है। यदि आप मूल वस्तु पर प्रोटोटाइप स्टोर करते हैं, तो यह गतिशील रूप से स्वैप कार्यक्षमता को स्वैप करने का एक शानदार तरीका हो सकता है, और आपके ऑब्जेक्ट त्वरण के लिए बहुत लचीला बहुरूपता सक्षम कर सकता है।

  • क्या इस बारे में कोई अस्पष्टता नहीं है कि उसे कैपिटल बनाना है या नहीं मत करो। लिंट टूल शिकायत करेंगे, और फिर आप new का उपयोग करने की कोशिश करने के लिए परीक्षा लेंगे, और फिर आप ऊपर वर्णित लाभ को पूर्ववत करेंगे।

  • कुछ लोग तरह var myFoo = foo(); या var myFoo = foo.create(); पढ़ता है।

कमियां

  • new अपेक्षा के अनुरूप व्यवहार नहीं करता (ऊपर देखें)। समाधान: इसका उपयोग न करें।

  • this नए ऑब्जेक्ट का उल्लेख नहीं करता है (इसके बजाय, अगर कन्स्ट्रक्टर को डॉट नोटेशन या स्क्वायर ब्रैकेट नोटेशन के साथ लागू किया जाता है, जैसे foo.bar () – this foo को संदर्भित करता है – जैसे कि हर दूसरे जावास्क्रिप्ट पद्धति – लाभ देखें)।

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

कारखाने "हमेशा" बेहतर होते हैं ऑब्जेक्ट केंद्रित भाषाओं का उपयोग करते समय

  1. अनुबंध पर फैसला (तरीकों और वे क्या करेंगे)
  2. उन तरीकों का खुलासा करने वाले इंटरफेस बनाएं (जावास्क्रिप्ट में आपके पास इंटरफेस नहीं है, इसलिए आपको कार्यान्वयन को जांचने के कुछ तरीके से आने की जरूरत है)
  3. एक कारखाना बनाएं जो आवश्यक प्रत्येक इंटरफ़ेस का कार्यान्वयन देता है

कार्यान्वयन (नए वस्तुओं के साथ वास्तविक वस्तुएं) फ़ैक्टरी उपयोगकर्ता / उपभोक्ता के सामने नहीं आती हैं। इसका मतलब यह है कि कारखाना डेवलपर विस्तार और नए कार्यान्वयन तब तक कर सकता है जब तक वह अनुबंध नहीं तोड़ता है … और यह कारखाने उपभोक्ता को अपने कोड को बदलने के बिना नये एपीआई से लाभ देने की अनुमति देता है … अगर वे नए इस्तेमाल करते हैं और एक "नया" कार्यान्वयन आता है तो उन्हें हर पंक्ति में जाना होगा और "नया" कार्यान्वयन का उपयोग करने वाली हर पंक्ति का उपयोग करना होगा … कारखाने के साथ उनका कोड बदल नहीं पाता …

कारखानों – सब कुछ से बेहतर – स्प्रिंग फ्रेमवर्क पूरी तरह से इस विचार के आसपास बनाया गया है

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

जब सीटीओ और कारखानों के बीच निर्णय लेना है, तो आपको यह तय करने की आवश्यकता है कि क्या जटिलता को लाभ से उचित है या नहीं।

यह ध्यान देने योग्य है कि जावास्क्रिप्ट कन्स्ट्रस्ट्रक्टर अनियंत्रित कारखानों के अलावा किसी और चीज़ को लौटाने के द्वारा किया जा सकता है तो जेएस में आप दोनों दुनिया का सर्वश्रेष्ठ प्राप्त कर सकते हैं – खोजयोग्य API और ऑब्जेक्ट पूलिंग / कैशिंग