আমি জিজ্ঞাসা করতে চাই - আমি আস্তে আস্তে jQuery শিখছি।
একটু ভেবে দেখতে একটি হল সঠিক উদাহরণস্বরূপ একটি এর ঈশ্বর অবজেক্ট বিরোধী প্যাটার্ন । মূলত, সবকিছু $
ফাংশনে যায় , যাই হোক না কেন।
আমি কি ঠিক আছি এবং jQuery আসলেই এই অ্যান্টি-প্যাটার্নের উদাহরণ?
আমি জিজ্ঞাসা করতে চাই - আমি আস্তে আস্তে jQuery শিখছি।
একটু ভেবে দেখতে একটি হল সঠিক উদাহরণস্বরূপ একটি এর ঈশ্বর অবজেক্ট বিরোধী প্যাটার্ন । মূলত, সবকিছু $
ফাংশনে যায় , যাই হোক না কেন।
আমি কি ঠিক আছি এবং jQuery আসলেই এই অ্যান্টি-প্যাটার্নের উদাহরণ?
উত্তর:
এই প্রশ্নের উত্তর দেওয়ার জন্য, আমি আপনাকে অন্য কাঠামোর সম্পর্কে একটি বাজে প্রশ্ন জিজ্ঞাসা করতে যাচ্ছি যে ডওম উপাদানগুলির সাথে একই রকম সম্পত্তি রয়েছে যা জিকুয়েরি হেরফের করে দেয়, এটি ভাল পুরানো পুনরুক্তি। প্রশ্ন হচ্ছে:
একটি সাধারণ পুনরাবৃত্তকারী আপনার কত অপারেশন প্রয়োজন ?
প্রদত্ত ভাষায় যে কোনও আইট্রেটার এপিআই দেখে সহজেই প্রশ্নের উত্তর দেওয়া যায়। আপনার 3 টি পদ্ধতি দরকার:
আপনার এটাই দরকার। যদি আপনি এই 3 টি অপারেশন সম্পাদন করতে পারেন তবে আপনি কোনও ক্রমের উপাদানগুলির ক্রমটি যেতে পারেন।
তবে কেবল এটিই নয় যা আপনি সাধারণত উপাদানগুলির ক্রম দিয়েই করতে চান, তাই না? আপনার সাধারনত অনেক উচ্চ স্তরের লক্ষ্য অর্জন করতে হয়। আপনি প্রতিটি উপাদান দিয়ে কিছু করতে চাইতে পারেন, আপনি কিছু শর্ত অনুযায়ী বা অন্য কয়েকটি পদ্ধতির একটি অনুসারে এগুলি ফিল্টার করতে চাইতে পারেন। আরও উদাহরণের জন্য .NET- এ লিনকিউ লাইব্রেরিতে আইনিউনারেবল ইন্টারফেসটি দেখুন ।
আপনি দেখতে পাচ্ছেন কতজন আছে? এবং এটি আইনুমেবল ইন্টারফেসে রাখতে পারে এমন সমস্ত পদ্ধতির কেবলমাত্র একটি উপসেট কারণ আপনি সাধারণত তাদের আরও উচ্চতর লক্ষ্য অর্জনের জন্য একত্রিত করেন।
তবে এখানেই মোচড়। এই পদ্ধতিগুলি IEnumerable ইন্টারফেসে নেই। এগুলি হ'ল সরল ইউটিলিটি পদ্ধতি যা প্রকৃতপক্ষে ইনপুট হিসাবে একটি আইওনামারেবল নেয় এবং এটি দিয়ে কিছু করে। সুতরাং সি # ভাষায় এটির মতো মনে হচ্ছে আইইনুমারবেল ইন্টারফেসে বাজিলিয়ান পদ্ধতি রয়েছে, IEnumerable কোনও godশ্বর অবজেক্ট নয়।
এখন jQuery ফিরে। এই প্রশ্নটি আবার জিজ্ঞাসা করুন, এবার কোনও ডিওএম উপাদান দিয়ে।
একটি ডিওএম এলিমেন্টে আপনার কয়টি অপারেশন দরকার?
আবার উত্তরটি বেশ সোজা। আপনার প্রয়োজনীয় সমস্ত পদ্ধতি হ'ল বৈশিষ্ট্য এবং শিশু উপাদানগুলি পড়ার / সংশোধন করার পদ্ধতি। এটা সম্বন্ধে. সমস্ত কিছু কেবলমাত্র সেই প্রাথমিক ক্রিয়াকলাপগুলির সংমিশ্রণ।
তবে আপনি কোনও ডিওএম উপাদানগুলির সাথে কত উচ্চ স্তরের জিনিসগুলি করতে চান? ভাল, একটি Iterator হিসাবে একই: একটি বাজিলিয়ান বিভিন্ন জিনিস। এবং এখানেই jQuery আসে j jQuery, মূলত দুটি জিনিস সরবরাহ করে:
যদি আপনি সুগারযুক্ত ফর্মটি গ্রহণ করেন তবে আপনি বুঝতে পারবেন যে ডকুম উপাদানগুলি নির্বাচন / সংশোধন করে jQuery সহজেই ফাংশনগুলির একগুচ্ছ হিসাবে রচনা করা যেতে পারে। উদাহরণ স্বরূপ:
$("#body").html("<p>hello</p>");
... লেখা যেতে পারে:
html($("#body"), "<p>hello</p>");
শব্দার্থকভাবে এটি ঠিক একই জিনিস। তবে প্রথম ফর্মটিতে বড় সুবিধা রয়েছে যে বিবৃতিগুলির বাম থেকে ডান দিকের ক্রমটি ক্রিয়াকলাপ কার্যকর হবে will মাঝখানে দ্বিতীয় সূচনা, যা আপনি প্রচুর ক্রিয়াকলাপকে একসাথে একত্রিত করলে কোড পড়া খুব শক্ত হয়ে যায়।
তো এসবের মানে কি? যে jQuery (লিনকুইয়ের মতো) Godশ্বর অ্যান্টি-প্যাটার্ন অবজেক্ট নয়। এটি পরিবর্তে খুব সম্মানজনক প্যাটার্নের একটি মামলা যা ডেকোরেটর বলে ।
কিন্তু তারপরে আবার, $
এই সমস্ত ভিন্ন কাজ করার ওভাররাইড সম্পর্কে কী ? ঠিক আছে, এটি সত্যই সিনট্যাকটিক চিনি। এর মতো সমস্ত কল $
এবং এর ডেরাইভেটিভগুলি $.getJson()
সম্পূর্ণ আলাদা জিনিস যা কেবল একই নামগুলি ভাগ করে নেওয়ার জন্য ঘটে যাতে আপনি তাত্ক্ষণিকভাবে অনুভব করতে পারেন যে সেগুলি jQuery এর অন্তর্ভুক্ত। $
একটি এবং শুধুমাত্র একটি কাজ সম্পাদন করে: আপনার কাছে jQuery ব্যবহার করার জন্য সহজেই একটি স্বীকৃতিযোগ্য সূচনার পয়েন্ট দিন। এবং আপনি যে jQuery অবজেক্টে কল করতে পারেন সেই সমস্ত পদ্ধতি কোনও godশ্বর বস্তুর লক্ষণ নয়। এগুলি কেবল বিভিন্ন ইউটিলিটি ফাংশন যা প্রতিটি একটি ডিওএম উপাদানটিতে একটি এবং একমাত্র জিনিসটি আর্গুমেন্ট হিসাবে পাস করেছে। ডট নোটেশনটি কেবল এখানে কারণ এটি লিখিত কোডকে আরও সহজ করে।
না - $
ফাংশনটি কেবলমাত্র তিনটি কাজের জন্য ওভারলোডড । বাকি সমস্তগুলি শিশু ফাংশন যা কেবল এটির নামস্থান হিসাবে ব্যবহার করে ।
Math
। যেহেতু জেএসে কোনও বিল্ট-ইন নেমস্পেস নেই, তারা কেবল এটির জন্য একটি অবজেক্ট ব্যবহার করে। যদিও আমি নিশ্চিত নই যে বিকল্পটি কী হবে? গ্লোবাল নেমস্পেসে সমস্ত ফাংশন এবং বৈশিষ্ট্য রাখবেন?
মূল jQuery ফাংশন (উদাঃ $("div a")
) মূলত একটি ফ্যাক্টরি পদ্ধতি যা jQuery ধরণের একটি উদাহরণ দেয় যা DOM উপাদানগুলির সংগ্রহকে উপস্থাপন করে।
JQuery ধরণের এই দৃষ্টান্তগুলিতে একটি বিশাল সংখ্যক DOM ম্যানিপুলেশন পদ্ধতি উপলব্ধ রয়েছে যা উদাহরণ দ্বারা প্রতিনিধিত্ব করা DOM উপাদানগুলিতে কাজ করে। যদিও এটি খুব সম্ভবত বড় হওয়া শ্রেণি হিসাবে বিবেচনা করা যেতে পারে, তবুও এটি Godশ্বরের অবজেক্টের ধরণটির সাথে খাপ খায় না।
অবশেষে, মাইকেল বর্গওয়ার্ট যেমন উল্লেখ করেছেন, সেখানে প্রচুর পরিমাণে ইউটিলিটি ফাংশন রয়েছে যা name একটি নেমস্পেস হিসাবে ব্যবহার করে এবং কেবলমাত্র ডোম সংগ্রহ jQuery অবজেক্টের সাথে সম্পর্কিত।
$
এটি কোনও বস্তু নয়, এটি একটি নেমস্পেস।
এর মধ্যে রয়েছে এমন অনেক ক্লাসের কারণে আপনি কি জাভা.আলংকে godশ্বর অবজেক্ট বলবেন? এটি কল করার জন্য একেবারে বৈধ সিনট্যাক্স java.lang.String.format(...)
, jQuery এ যে কোনও কিছু কল করার জন্য ফর্মের অনুরূপ।
কোনও বস্তু, godশ্বর বস্তু হওয়ার জন্য, প্রথমে একটি যথাযথ অবজেক্ট হতে হবে - এতে ডেটা এবং বুদ্ধি উভয়ই থাকে upon jQuery শুধুমাত্র পদ্ধতি রয়েছে।
এটিকে দেখার আরও একটি উপায়: কোনও বস্তু কতটা godশ্বর বস্তুর সম্মতি তা বোঝার জন্য একটি ভাল মাপকাঠি - নিম্ন সংহতি মানে godশ্বর অবজেক্টের বেশি। সংহতি বলেছেন ণ বহুল পরিমাণে কতগুলি পদ্ধতি ব্যবহার করে তা ডেটা ব্যবহার করে। যেহেতু জিকুয়েরিতে কোনও ডেটা নেই, আপনি গণিতটি করেন - সমস্ত পদ্ধতিতে সমস্ত ডেটা ব্যবহার হয়, তাই jQuery অত্যন্ত সমন্বিত, সুতরাং thusশ্বরের অবজেক্ট না হয়ে।
বেনিয়ামিন আমাকে আমার অবস্থান পরিষ্কার করতে বলেছিলেন, তাই আমি আমার আগের পোস্টটি সম্পাদনা করে আরও চিন্তাভাবনা যুক্ত করেছি।
ক্লিন কোড নামে একটি দুর্দান্ত বইয়ের লেখক বব মার্টিন। Book বইটিতে অবজেক্টস এবং ডেটা স্ট্রাকচার নামে একটি অধ্যায় (অধ্যায়)) রয়েছে, যা তিনি অবজেক্টস এবং ডেটা স্ট্রাকচারের মধ্যে সবচেয়ে গুরুত্বপূর্ণ পার্থক্য নিয়ে আলোচনা করেন এবং দাবি করেন যে আমাদের মধ্যে তাদের নির্বাচন করতে হবে, কারণ সেগুলি মিশ্রণ একটি খুব খারাপ ধারণা।
এই বিভ্রান্তি কখনও কখনও দুর্ভাগ্যজনক হাইব্রিড কাঠামোর দিকে নিয়ে যায় যা অর্ধেক অবজেক্ট এবং অর্ধেক ডেটা স্ট্রাকচার। তাদের ফাংশন রয়েছে যা তাৎপর্যপূর্ণ কাজ করে, এবং তাদের পাবলিক ভেরিয়েবল বা পাবলিক অ্যাকসেসর এবং মিউটরগুলিও রয়েছে যা সমস্ত উদ্দেশ্য এবং উদ্দেশ্যে ব্যক্তিগত ভেরিয়েবলগুলিকে পাবলিক করে তোলে, অন্যান্য বহিরাগত ক্রিয়াকলাপগুলিকে প্রক্রিয়াকরণের প্রোগ্রামটি যেভাবে ব্যবহার করবে সেভাবে ব্যবহার করতে প্ররোচিত করে other ডেটা স্ট্রাকচার ৪. এই জাতীয় সংকরগুলি নতুন ফাংশন যুক্ত করা শক্ত করে তোলে তবে নতুন ডেটা স্ট্রাকচার যুক্ত করা শক্ত করে তোলে। তারা উভয় বিশ্বের সবচেয়ে খারাপ। এগুলি তৈরি করা এড়িয়ে চলুন। এগুলি একটি আবদ্ধ নকশার সূচক যাঁর লেখকরা functions বা তার থেকেও খারাপ, অজ্ঞ — তাদের ফাংশন বা প্রকার থেকে সুরক্ষা প্রয়োজন কিনা তা সম্পর্কে অনিশ্চিত।
আমি মনে করি 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 ফ্রেমওয়ার্ক হ'ল প্রক্রিয়াগুলির একটি গোছা, যা ডিওএম নোডের সংগ্রহ নির্বাচন এবং সংশোধন করতে পারে এবং আরও অনেকগুলি কাজ করতে পারে। লরেন্ট যেমন তার পোস্টে উল্লেখ করেছেন, jQuery হুডের নীচে এরকম কিছু:
html(select("#body"), "<p>hello</p>");
JQuery এর বিকাশকারীরা এই সমস্ত প্রক্রিয়াটি একটি একক শ্রেণিতে মার্জ করে যা উপরে তালিকাভুক্ত সমস্ত বৈশিষ্ট্যের জন্য দায়ী। সুতরাং এটি স্পষ্টতই একক দায়িত্বের নীতি লঙ্ঘন করে এবং তাই এটি godশ্বরের অবজেক্ট। একমাত্র জিনিস কারণ এটি কোনও কিছু ভঙ্গ করে না, কারণ এটি একটি একক স্ট্যান্ডেলোন শ্রেণি যা একটি একক ডেটা স্ট্রাকচারের (ডিওএম নোডের সংগ্রহ) কাজ করে। আমরা jQuery সাবক্লাস বা অন্য কোনও ডেটা স্ট্রাকচার যুক্ত করলে প্রকল্পটি খুব দ্রুত ধসে পড়বে। সুতরাং আমি মনে করি না যে আমরা jQuery দ্বারা oo সম্পর্কে কথা বলতে পারি oo এর চেয়ে এটি প্রক্রিয়াগত নয় যদিও এটি কোনও শ্রেণির সংজ্ঞা দেয়।
লরেন্ট যা দাবি করে তা সম্পূর্ণ বাজে কথা:
তো এসবের মানে কি? যে jQuery (লিনকুইয়ের মতো) Godশ্বর অ্যান্টি-প্যাটার্ন অবজেক্ট নয়। এটি পরিবর্তে খুব সম্মানজনক প্যাটার্নের একটি মামলা যা ডেকোরেটর বলে।
ডেকোরেটর প্যাটার্নটি ইন্টারফেসটি রেখে এবং বিদ্যমান ক্লাসগুলি সংশোধন না করে নতুন কার্যকারিতা যুক্ত করার বিষয়ে। উদাহরণ স্বরূপ:
আপনি 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 কোনও কিছুর সাজসজ্জার সামগ্রী নয়, কারণ এটি অ্যারে, নোডলিস্ট বা অন্য কোনও ডিওএম অবজেক্টের মতো একই ইন্টারফেস প্রয়োগ করে না। এটি নিজস্ব ইন্টারফেস প্রয়োগ করে। মডিউলগুলি পাশাপাশি সজ্জা হিসাবে ব্যবহৃত হয় না, তারা কেবল আসল প্রোটোটাইপকে ওভাররাইড করে। সুতরাং ডেকোরেটর প্যাটার্নটি পুরো jQuery লাইবে ব্যবহৃত হয় না। JQuery শ্রেণিটি কেবল একটি বিশাল অ্যাডাপ্টার যা আমাদের বিভিন্ন ব্রাউজার দ্বারা একই API ব্যবহার করতে দেয়। ওও দৃষ্টিকোণ থেকে এটি একটি সম্পূর্ণ জগাখিচুড়ি, তবে এটি আসলে কার্যকর নয়, এটি কার্যকরভাবে কাজ করে, এবং আমরা এটি ব্যবহার করি।
$
ফাংশন বা কোনওjQuery
জিনিসের প্রয়োজন হয় না