जावास्क्रिप्ट, NodeJs एट अल के साथ डिजाइन पैटर्न का महत्व


36

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

क्या आप एक जावास्क्रिप्ट डेवलपर के रूप में पारंपरिक डिजाइन पैटर्न को महत्वपूर्ण मानते हैं, जो अन्य भाषाओं / वातावरणों के साथ महत्वपूर्ण या कम महत्वपूर्ण है।

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


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

प्रतिक्रियाओं में बहुत रुचि ... प्रश्न के लिए +1 :)
usoban

2
Stoyan Stefanov की पुस्तक जावास्क्रिप्ट पैटर्न , जेएस में उपयोग किए जा सकने वाले पैटर्न पर एक बेहतरीन संसाधन है। उनमें से कई विशेष रूप से जेएस के लिए मौजूद हैं, न कि किसी अन्य भाषा के लिए।
इगोरगानापल्स्की

जावास्क्रिप्ट का अपना पैटर्न है। इगोर द्वारा उल्लिखित पुस्तक के अलावा, Addy Osmani का लर्निंग जावास्क्रिप्ट डिज़ाइन पैटर्न भी है , जो मुफ़्त है।
user16764

जवाबों:


23

क्या आप एक जावास्क्रिप्ट डेवलपर के रूप में पारंपरिक डिजाइन पैटर्न को महत्वपूर्ण मानते हैं, जो अन्य भाषाओं / वातावरणों के साथ महत्वपूर्ण या कम महत्वपूर्ण है।

शास्त्रीय डिजाइन पैटर्न जावास्क्रिप्ट पर लागू नहीं होते हैं।

क्या लागू होता है, मॉड्यूलर और कार्यात्मक कोड लिख रहा है।

आपको कंस्ट्रक्टर्स और प्रथम श्रेणी के कार्यों के मिश्रण का उपयोग करना चाहिए।

एक जावास्क्रिप्ट डेवलपर के रूप में मैं व्यक्तिगत रूप से जावास्क्रिप्ट को LISP के रूप में बल्कि जावा के इलाज के लिए धक्का देता हूं। तो मठों और उच्च स्तरीय कार्यात्मक शैली कोड का अनुकरण करने की कोशिश करें, बल्कि शास्त्रीय OOP कोड का अनुकरण करने का प्रयास करें।

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

फिर से डिजाइन पैटर्न वास्तव में इतना लागू नहीं होता है लेकिन नीचे तीन महत्वपूर्ण निर्माण हैं।

  1. बंद का उपयोग
  2. प्रथम श्रेणी के कार्यों का उपयोग
  3. के साथ या बिना वस्तु कारखानों का उपयोग new

कृपया कुछ प्रकार के संदर्भ छोड़ दें, जिसके लिए मैं पारंपरिक डिजाइन पैटर्न का उपयोग करके एक ही तरह के कोड को करने की तुलना में इस तरह की तकनीकों के उदाहरण दिखा सकता हूं।

आइए नज़र डालते हैं कुछ शास्त्रीय डिज़ाइन पैटर्नों पर और कैसे उन्हें जेएस में लागू करने के साथ-साथ वैकल्पिक पैटर्न जेएस के लिए अधिक अनुकूल हैं:

पर्यवेक्षक पैटर्न:

इसमें node.jsबस है events.EventEmitter। में jQueryयह है $.fn.bind&& $.fn.trigger। में backboneयह है Backbone.Events.triggerऔर Backbone.Events.bind। यह एक बहुत ही सामान्य पैटर्न है जिसका उपयोग दिन-प्रतिदिन के कोड में किया जाता है।

मैं कभी नहीं रुकता और सोचता हूं "अरे मैं यहां एक पर्यवेक्षक पैटर्न का उपयोग कर रहा हूं!"। नहीं, यह संदेशों को पास करने का एक निम्न स्तर का तरीका है या बदलाव को रोकने का तरीका है।

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

में WebSocketprototcol हमारे पास .onजो हम करने के लिए बाध्य करने के लिए उपयोग on("message", ...की घटनाओं। फिर से यह बहुत सामान्य है लेकिन यह एक स्ट्रीम पर एक पर्यवेक्षक है, बल्कि आपके शास्त्रीय OOP पर आधारित है while (byte b = Stream.ReadNextByte())

ऑब्जर्वर पैटर्न के ये सभी शक्तिशाली उपयोग हैं। लेकिन यह एक पैटर्न नहीं है जिसका आप उपयोग करते हैं। यह भाषा का एक सरल हिस्सा है। यह सिर्फ कोड है।

मेमेंटो पैटर्न:

यह बस JSON है। यह आपको एक वस्तु की स्थिति को क्रमबद्ध करने की अनुमति देता है ताकि आप एक कार्रवाई को पूर्ववत कर सकें।

function SomeObject() {
    var internalState;

    this.toJSON = function() {
        return internalState;
    }

    this.set = function(data) {
        internalState = data;
    }

    this.restore = function(json) {
        internalState = JSON.parse(json);
    }
}

var o = new SomeObject();
o.set("foo"); // foo
var memento = JSON.stringify(o);
o.set("bar"); // bar
o.restore(memento);

जावास्क्रिप्ट में हम मूल रूप से स्मृति चिन्ह के लिए एक एपीआई का समर्थन करते हैं। बस toJSONकिसी भी ऑब्जेक्ट पर एक विधि को परिभाषित करें । जब आप JSON.stringifyइसे कॉल करते हैं तो यह आंतरिक रूप .toJSONसे आपकी वस्तु पर कॉल करेगा वास्तविक डेटा जिसे आप JSON पर क्रमबद्ध करना चाहते हैं।

यह आपको अपने कोड का तुच्छ बनाने की अनुमति देता है।

फिर से मुझे यह एक यादगार पैटर्न का एहसास नहीं है। यह केवल क्रमिक उपकरण का उपयोग कर रहा है जो कि JSON है।

राज्य पैटर्न / रणनीति पैटर्न:

आपको राज्य पैटर्न की आवश्यकता नहीं है। आपके पास प्रथम श्रेणी के कार्य और गतिशील प्रकार हैं। बस कार्यों को इंजेक्ट करें या मक्खी पर गुण बदलें।


रेन्नोस, अच्छा जवाब। उदाहरण के लिए, मैं वैचारिक स्तर से अधिक सोच रहा था। उदाहरण के लिए: "एक पर्यवेक्षक पैटर्न ने स्थिति में मदद की ..."

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

प्रयास दृष्टिकोण और जवाब शानदार रेन्नोस हैं। धन्यवाद।
लुईस

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

आप प्रोटोटाइप पैटर्न के बारे में भूल गए - उर्फ बेवकूफ जावास्क्रिप्ट भी सामान्य ऊप नहीं है ;)
c69

10

इस उत्तर को व्यक्तिपरक राय के रूप में लें।

क्या आप एक जावास्क्रिप्ट डेवलपर के रूप में पारंपरिक डिजाइन पैटर्नों को महत्वपूर्ण मानते हैं या अन्य भाषाओं / वातावरणों के साथ महत्वपूर्ण हैं?

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

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

सामान्य तौर पर मैं कहूंगा कि पारंपरिक डिजाइन पैटर्न उतने ही महत्वपूर्ण हैं जितना कि वे अन्य भाषाओं में हैं, लेकिन जावास्क्रिप्ट विशिष्ट पैटर्न पारंपरिक लोगों की तुलना में अधिक महत्वपूर्ण हैं।

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

के अलावा आवश्यक जावास्क्रिप्ट डिजाइन पैटर्न मैं ज्यादातर इन का उपयोग करें:

1. कंस्ट्रक्टर पैटर्न (प्रोटोटाइप के साथ)

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

2. मॉड्यूल पैटर्न का खुलासा

एनकैप्सुलेशन के साथ प्रतिरूपकता प्रदान करता है।

3. DRY पैटर्न

यह बल्कि विशिष्ट परिदृश्य है, हालांकि हर डेवलपर को इसका अधिक से अधिक (im) उपयोग करना चाहिए।


धन्यवाद! अच्छा जवाब, और जिस तरह की प्रतिक्रिया की मुझे उम्मीद थी। यद्यपि प्रश्न को व्यक्तिपरक के रूप में देखा जा सकता है, लेकिन इस तरह की एक अच्छी प्रतिक्रिया से पता चलता है कि एक उपयुक्त उत्तर है। 'साइन अप' से पहले अधिक प्रतिक्रियाओं का इंतजार करेंगे।

2

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

यह प्रोग्रामर को अधिक आसानी से संवाद करने की अनुमति भी देता है। आप पैटर्न के संदर्भ में अपने सहकर्मी से भी बात कर सकते हैं। यदि आप कहते हैं कि मेरे पास मेरा ऑब्जर्वर है, तो यह अच्छी तरह से समझा जाता है कि किस तरह का चल रहा है।

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

पैटर्न के बारे में सुपर उल्लेखनीय कुछ भी नहीं है, सबसे अच्छी बात यह है कि वे ऐसे विचार हैं, जिन्हें बार-बार उपयोगी माना जाता है।


1

क्या आप एक जावास्क्रिप्ट डेवलपर के रूप में पारंपरिक डिजाइन पैटर्न को महत्वपूर्ण या कम महत्वपूर्ण मानते हैं

वे महत्वपूर्ण हैं।

ऐसा इसलिए है क्योंकि पुन: प्रयोज्य समाधानों के लिए अवधारणा भाषा को पार कर सकती है। - सिंटैक्स परिवर्तन - कार्यान्वयन परिवर्तन - पैटर्न के लिए धारणा अभी भी मौजूद है।

किसी भी भाषा के डेवलपर्स सीखने के पैटर्न से उन्नत JS सीख सकते हैं, वाक्य रचना नहीं। जिन लोगों को यह पता नहीं है वे गायब हैं।

कृपया शीर्ष तीन डिज़ाइन पैटर्न को नाम दें, जैसे कि जावास्क्रिप्ट डेवलपर नियमित रूप से उपयोग करता है

ऐसे पैटर्न हैं जो अक्सर उपयोग किए जाते हैं जो कुछ "बहस" करेंगे। हालांकि, उन्हें यह जानना अच्छा है क्योंकि वे उन्नत जेएस में बेहद सामान्य और शक्तिशाली हैं।

1- नेमस्पेस - किसी वस्तु में अपना कोड लपेटें।

var x = (फ़ंक्शन () {}) ();

2- ObjectConfiguration, Factory-like pattern। -एक फ़ंक्शन को ऑब्जेक्ट, न कि vars का एक गुच्छा।

var उत्पाद = कारखाना ({});

3- कॉलबैक फ़ंक्शन। - कार्य पूरा होने पर, एक पैरामीटर को एक पैरामीटर के रूप में कहा जाता है।

फ़ंक्शन लॉन्गटस्क (फ़ंक्शन () {// कॉल किए जाने पर});

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

बहुत बढ़िया सवाल।

उम्मीद है की वो मदद करदे।

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