बेंजामिन ने मुझे अपनी स्थिति स्पष्ट करने के लिए कहा, इसलिए मैंने अपनी पिछली पोस्ट को संपादित किया और आगे के विचार जोड़े।
बॉब मार्टिन क्लीन कोड के रूप में एक महान पुस्तक के लेखक हैं। उस पुस्तक में वस्तुओं और डेटा संरचनाओं नामक एक अध्याय (अध्याय 6.) है, जिसमें वह वस्तुओं और डेटा संरचनाओं के बीच सबसे महत्वपूर्ण अंतरों पर चर्चा करता है और दावा करता है कि हमें उनके बीच चयन करना है, क्योंकि उन्हें मिश्रण करना एक बहुत बुरा विचार है।
यह भ्रम कभी-कभी दुर्भाग्यपूर्ण संकर संरचनाओं की ओर जाता है जो आधी वस्तु और आधा डेटा संरचना हैं। उनके पास ऐसे कार्य होते हैं जो महत्वपूर्ण कार्य करते हैं, और उनके पास या तो सार्वजनिक चर या सार्वजनिक एक्सेसर्स और म्यूटेटर होते हैं, जो सभी इरादों और उद्देश्यों के लिए, निजी चर को सार्वजनिक करते हैं, अन्य बाहरी कार्यों को उन चर का उपयोग करने के लिए लुभाते हैं जिस तरह से एक प्रक्रियात्मक कार्यक्रम का उपयोग करेंगे। डेटा संरचना। 4 ऐसे संकर नए कार्यों को जोड़ना कठिन बनाते हैं लेकिन नए डेटा संरचनाओं को जोड़ना भी कठिन बनाते हैं। वे दोनों दुनिया के सबसे बुरे हैं। उन्हें बनाने से बचें। वे एक गुथे हुए डिज़ाइन के संकेत हैं, जिनके लेखक अनिश्चित हैं - या इससे भी बदतर, अज्ञानी हैं - चाहे उन्हें कार्यों या प्रकारों से सुरक्षा की आवश्यकता हो।
मुझे लगता है कि DOM इन ऑब्जेक्ट और डेटा संरचना संकर का एक उदाहरण है। उदाहरण के लिए DOM द्वारा हम इस तरह कोड लिखते हैं:
el.appendChild(node);
el.childNodes;
// bleeding internals
el.setAttribute(attr, val);
el.attributes;
// bleeding internals
el.style.color;
// at least this is okay
el = document.createElement(tag);
doc = document.implementation.createHTMLDocument();
// document is both a factory and a tree root
डोम स्पष्ट रूप से एक हाइब्रिड के बजाय एक डेटा संरचना होना चाहिए।
el.childNodes.add(node);
// or el.childNodes[el.childNodes.length] = node;
el.childNodes;
el.attributes.put(attr, val);
// or el.attributes[attr] = val;
el.attributes;
el.style.get("color");
// or el.style.color;
factory = new HtmlNodeFactory();
el = factory.createElement(document, tag);
doc = factory.createDocument();
JQuery फ्रेमवर्क प्रक्रियाओं का एक समूह है, जो DOM नोड्स के संग्रह को चुन और संशोधित कर सकता है और कई अन्य काम कर सकता है। जैसा कि लॉरेंट ने अपने पोस्ट में बताया, jQuery कुछ इस तरह से हुड के नीचे है:
html(select("#body"), "<p>hello</p>");
JQuery के डेवलपर्स ने इन सभी प्रक्रियाओं को एक एकल वर्ग में विलय कर दिया, जो ऊपर सूचीबद्ध सभी सुविधाओं के लिए जिम्मेदार है। तो यह स्पष्ट रूप से एकल जिम्मेदारी सिद्धांत का उल्लंघन करता है और इसलिए यह एक देव वस्तु है। केवल एक चीज क्योंकि यह कुछ भी नहीं तोड़ता है, क्योंकि यह एक एकल स्टैंडअलोन वर्ग है जो एक एकल डेटा संरचना (डोम नोड्स का संग्रह) पर काम करता है। अगर हम jQuery के उपवर्ग या किसी अन्य डेटा संरचना को जोड़ते हैं, तो परियोजना बहुत तेज़ी से ध्वस्त हो जाएगी। इसलिए मुझे नहीं लगता कि हम jo द्वारा oo के बारे में बात कर सकते हैं यह इस तथ्य के बावजूद कि यह एक वर्ग को परिभाषित करता है के बावजूद oo की तुलना में प्रक्रियात्मक है।
लॉरेंट क्या दावा करता है एक पूरी बकवास है:
तो इस सबका क्या मतलब है? वह jQuery (जैसे LINQ) ईश्वर वस्तु विरोधी पैटर्न नहीं है। इसके बजाय यह एक बहुत सम्मानित पैटर्न का मामला है जिसे डेकोरेटर कहा जाता है।
डेकोरेटर पैटर्न इंटरफ़ेस को बनाए रखने और मौजूदा कक्षाओं को संशोधित नहीं करके नई कार्यक्षमता जोड़ने के बारे में है। उदाहरण के लिए:
आप 2 वर्गों को परिभाषित कर सकते हैं जो समान इंटरफ़ेस को लागू करते हैं, लेकिन पूरी तरह से अलग कार्यान्वयन के साथ:
/**
* @interface
*/
var Something = function (){};
/**
* @argument {string} arg1 The first argument.
* @argument {string} arg2 The second argument.
*/
Something.prototype.doSomething = function (arg1, arg2){};
/**
* @class
* @implements {Something}
*/
var A = function (){
// ...
};
/**
* @argument {string} arg1 The first argument.
* @argument {string} arg2 The second argument.
*/
A.prototype.doSomething = function (arg1, arg2){
// doSomething implementation of A
};
/**
* @class
* @implements {Something}
*/
var B = function (){
// ...
};
/**
* @argument {string} arg1 The first argument.
* @argument {string} arg2 The second argument.
*/
B.prototype.doSomething = function (arg1, arg2){
// doSomething implementation of B
// it is completely different from the implementation of A
// that's why it cannot be a sub-class of A
};
यदि आपके पास ऐसे तरीके हैं जो केवल सामान्य इंटरफ़ेस का उपयोग करते हैं, तो आप ए और बी के बीच समान कोड को कॉपी-पेस्ट करने के बजाय एक या अधिक डेकोरेटर को परिभाषित कर सकते हैं। आप इन सज्जाकारों का उपयोग एक नेस्टेड संरचना में भी कर सकते हैं।
/**
* @class
* @implements {Something}
* @argument {Something} something The decorated object.
*/
var SomethingDecorator = function (something){
this.something = something;
// ...
};
/**
* @argument {string} arg1 The first argument.
* @argument {string} arg2 The second argument.
*/
SomethingDecorator.prototype.doSomething = function (arg1, arg2){
return this.something.doSomething(arg1, arg2);
};
/**
* A new method which can be common by A and B.
*
* @argument {function} done The callback.
* @argument {string} arg1 The first argument.
* @argument {string} arg2 The second argument.
*/
SomethingDecorator.prototype.doSomethingDelayed = function (done, arg1, arg2){
var err, res;
setTimeout(function (){
try {
res = this.doSomething(o.arg1, o.arg2);
} catch (e) {
err = e;
}
callback(err, res);
}, 1000);
};
तो आप मूल उदाहरणों को उच्च अमूर्त स्तर कोड में डेकोरेटर उदाहरणों के साथ स्थानापन्न कर सकते हैं।
function decorateWithManyFeatures(something){
var d1 = new SomethingDecorator(something);
var d2 = new AnotherSomethingDecorator(d1);
// ...
return dn;
}
var a = new A();
var b = new B();
var decoratedA = decorateWithManyFeatures(a);
var decoratedB = decorateWithManyFeatures(b);
decoratedA.doSomethingDelayed(...);
decoratedB.doSomethingDelayed(...);
यह निष्कर्ष कि jQuery किसी भी चीज़ का डेकोरेटर नहीं है, क्योंकि यह Array, NodeList या किसी अन्य DOM ऑब्जेक्ट के समान इंटरफ़ेस को लागू नहीं करता है। यह अपने स्वयं के इंटरफ़ेस को लागू करता है। मॉड्यूल को सज्जाकार के रूप में भी उपयोग नहीं किया जाता है, वे बस मूल प्रोटोटाइप को ओवरराइड करते हैं। तो डेकोरेटर पैटर्न का उपयोग पूरे jQuery लिब में नहीं किया जाता है। JQuery वर्ग बस एक विशाल एडॉप्टर है जो हमें कई अलग-अलग ब्राउज़रों द्वारा एक ही एपीआई का उपयोग करने देता है। ऊ के नजरिए से यह पूरी तरह गड़बड़ है, लेकिन यह वास्तव में मायने नहीं रखता है, यह अच्छी तरह से काम करता है, और हम इसका उपयोग करते हैं।
$
फ़ंक्शन याjQuery
ऑब्जेक्ट की आवश्यकता न हो ।