এই জাভাস্ক্রিপ্ট প্যাটার্নটি কী বলা হয় এবং কেন এটি ব্যবহৃত হয়?


100

আমি তিনটি জেএস পড়ছি এবং একটি প্যাটার্ন লক্ষ্য করেছি যেখানে ফাংশনগুলি এর মতো সংজ্ঞায়িত করা হয়েছে:

var foo = ( function () {
    var bar = new Bar();

    return function ( ) {
        //actual logic using bar from above.
        //return result;
    };
}());

(উদাহরণ রাইকাস্ট পদ্ধতি দেখুন এখানে )।

সাধারণ জাতীয় পদ্ধতির প্রকরণটি দেখতে এরকম হবে:

var foo = function () {
    var bar = new Bar();

    //actual logic.
    //return result;
};

প্রথম সংস্করণটির সাথে তুলনা করা সাধারণ প্রকরণের তার মধ্যে পৃথক বলে মনে হচ্ছে:

  1. এটি একটি স্ব-কার্যকরকারী কার্যের ফলাফল নির্ধারণ করে।
  2. এটি এই ফাংশনের মধ্যে স্থানীয় ভেরিয়েবলকে সংজ্ঞায়িত করে।
  3. এটি যুক্তিযুক্ত আসল ফাংশনটি প্রদান করে যা স্থানীয় ভেরিয়েবলের ব্যবহার করে।

সুতরাং মূল পার্থক্যটি হ'ল প্রথম প্রকরণে বারটি একবার একবার নির্ধারিত হয়, আরম্ভের সময়, যখন দ্বিতীয় প্রকরণটি যতবার ডাকা হয় ততবার এই অস্থায়ী পরিবর্তনশীল তৈরি করে।

কেন এটি ব্যবহার করা হয় সে সম্পর্কে আমার সর্বোত্তম অনুমান এটি বারের জন্য উদাহরণগুলির সীমাবদ্ধ করে (কেবলমাত্র একটি থাকবে) এবং এইভাবে মেমরি পরিচালনার ওভারহেড সংরক্ষণ করে।

আমার প্রশ্নগুলো:

  1. এই ধারণাটি কি সঠিক?
  2. এই প্যাটার্নটির কোনও নাম আছে?
  3. কেন এটি ব্যবহার করা হয়?

4
পছন্দ করেছেন আমি এটিকে তিনটি জে হিসাবে ট্যাগ করেছিলাম কারণ আমি ভেবেছিলাম যে তিন জে'র অবদানকারীরা এর উত্তর দিতে সবচেয়ে যোগ্য তবে হ্যাঁ, এটি জেনেরিক জেএসের প্রশ্ন।
প্যাট্রিক ক্লুগ

4
আমি বিশ্বাস করি একে ক্লোজার বলা হয়। আপনি তাদের সম্পর্কে পড়তে পারেন।
স্ট্যাকফ্লোড হয়েছে

4
যদি বারটি তাত্ক্ষণিকভাবে এই একমাত্র জায়গা হয় তবে এটি সিঙ্গলটন প্যাটার্ন।
পল

8
স্মৃতি সংরক্ষণ করার জন্য অগত্যা নয়, তবে এটি রাষ্ট্রের সমস্ত অনুরোধ জুড়ে রাখতে পারে
জুয়ান মেন্ডেস

4
@ অরংআনসওয়ার: হুবহু নয়। এখানে বেনাম ফাংশন (যা বন্ধ হবে) তাত্ক্ষণিকভাবে কার্যকর করা হয়।
njzk2

উত্তর:


100

আপনার অনুমানগুলি প্রায় সঠিক। প্রথমে সেগুলি পর্যালোচনা করা যাক।

  1. এটি একটি স্ব-সম্পাদনকারী ফাংশনের রিটার্ন বরাদ্দ করে

একে তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন এক্সপ্রেশন বা আইআইএফই বলা হয়

  1. এটি এই ফাংশনের মধ্যে স্থানীয় ভেরিয়েবলকে সংজ্ঞায়িত করে

এটি জাভাস্ক্রিপ্টে ব্যক্তিগত অবজেক্ট ক্ষেত্র থাকার উপায় এটি privateঅন্যথায় কীওয়ার্ড বা কার্যকারিতা সরবরাহ করে না।

  1. এটি যুক্তিযুক্ত আসল ফাংশনটি প্রদান করে যা স্থানীয় ভেরিয়েবলের ব্যবহার করে।

আবার, মূল বিষয়টি হ'ল এই স্থানীয় ভেরিয়েবলটি ব্যক্তিগত

এই প্যাটার্নটির কোনও নাম আছে?

আফাইক আপনি এই প্যাটার্নটিকে মডিউল প্যাটার্ন বলতে পারেন । উদ্ধৃতি:

মডিউল প্যাটার্ন ক্লোজার ব্যবহার করে "গোপনীয়তা", রাষ্ট্র এবং সংগঠনকে আবদ্ধ করে। এটি সরকারী এবং ব্যক্তিগত পদ্ধতি এবং ভেরিয়েবলগুলির মিশ্রণটি लपेटানোর, টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো করে বিশ্বব্যাপী স্কোপ এ ফাঁসানো থেকে এবং অন্য কোনও বিকাশকারীর ইন্টারফেসের সাথে দুর্ঘটনাক্রমে সংঘর্ষের একটি উপায় সরবরাহ করে। এই নিদর্শনটির সাথে, ক্লোজারের মধ্যে থাকা সমস্ত কিছুকে ব্যক্তিগত রেখে কেবলমাত্র একটি সর্বজনীন এপিআই দেওয়া হবে।

এই দুটি উদাহরণের তুলনা করে, প্রথমটি কেন ব্যবহৃত হয় সে সম্পর্কে আমার সেরা অনুমানগুলি:

  1. এটি সিঙ্গলটন ডিজাইন প্যাটার্ন বাস্তবায়ন করছে।
  2. প্রথম উদাহরণ ব্যবহার করে যে কোনও নির্দিষ্ট ধরণের একটি অবজেক্ট তৈরি করা যায় তা নিয়ন্ত্রণ করতে পারে। কার্যকর জাভাতে বর্ণিত হিসাবে এই পয়েন্টের সাথে একটি ঘনিষ্ঠ মিল স্থিতিশীল কারখানা পদ্ধতি হতে পারে ।
  3. আপনার দক্ষতার সাথে যদি প্রতিবার একই জিনিসটির প্রয়োজন হয় তবে এটি দক্ষ

তবে যদি আপনার প্রতিবার কেবল ভ্যানিলা বস্তুর প্রয়োজন হয় তবে এই প্যাটার্নটি সম্ভবত কোনও মান যুক্ত করবে না।


4
অ্যাডি ওসমানির বই থেকে প্যাটার্নটি সঠিকভাবে চিহ্নিত করার জন্য +1। আপনি নিজের নামকরণে সঠিক - এটি প্রকৃতপক্ষে মডিউল প্যাটার্ন that উপায় দ্বারা এটির প্রকাশক মডিউল প্যাটার্ন।
বেনিয়ামিন গ্রুইনবাউম

4
আমি আপনার উত্তরটির সাথে সম্মত হই, 'বাইরের কোনও বেসরকারী ভেরিয়েবল' অংশ ব্যতীত। সমস্ত জেএস ভেরিয়েবলগুলি বর্ণের বাইরে 'বাক্সের বাইরে' রয়েছে, যা "প্রাইভেট" ভেরিয়েবলের (যেমন জাভাতে পাওয়া যায়) তুলনায় আরও শক্তিশালী / সাধারণ প্রক্রিয়া; সুতরাং জেএস "বেসরকারী" ভেরিয়েবলগুলিকে যেভাবে সমস্ত ভেরিয়েবল পরিচালনা করে তার বিশেষ-কেস হিসাবে সমর্থন করে।
ওয়ারবো

আমি "বেসরকারী ভেরিয়েবলগুলি" বলে মনে করি, আপনি ব্যক্তিগত "অবজেক্ট ফিল্ড" বলতে চেয়েছিলেন
ইয়ান রিংরোজ

4
কেবলমাত্র বিশদের জন্য: ক্লাসকোমেণ্ডা
নাগরাজ

4
@ লুকাহরবত: প্রকৃতপক্ষে জাভাস্ক্রিপ্ট অন্যান্য ভাষার চেয়ে বেশি "শক্তিশালী" নয় (আমি অভিব্যক্তিবাদী শব্দটিই পছন্দ করি)। প্রকৃতপক্ষে, এটি কম ভাবপূর্ণ, কারণ আপনার ভেরিয়েবলগুলি রক্ষা করার একমাত্র উপায় হ'ল কোনও পরিবর্তনশীল-পুনরায় ব্যবহারের বাজে কথা এড়াতে তাদের কার্যক্রমে ঘিরে রাখা। মডিউল প্যাটার্নটি ভাল জাভাস্ক্রিপ্ট কোড তৈরি করার একটি চূড়ান্ত প্রয়োজনীয়তা, তবে এটি ভাষার কোনও বৈশিষ্ট্য নয়, ভাষার দুর্বলতাগুলির দ্বারা দংশিত হওয়া এড়ানোর জন্য এটি আরও দু: খজনক কাজ।
ফ্যালানওয়ে

11

এটি বস্তুর প্রারম্ভিককরণের ব্যয়কে সীমাবদ্ধ করে এবং অতিরিক্ত ফাংশন আমন্ত্রণগুলি একই ব্যবহার করে তা নিশ্চিত করে বস্তুটি । এটি উদাহরণস্বরূপ, ভবিষ্যতে অনুরোধগুলি ব্যবহারের জন্য স্টেটটিকে অবজেক্টে সংরক্ষণ করার অনুমতি দেয়।

যদিও এটি সম্ভব যে এটি মেমরির ব্যবহার সীমিত করে দেয়, সাধারণত জিসি যেভাবেই অব্যবহৃত জিনিস সংগ্রহ করবে, সুতরাং এই প্যাটার্নটি খুব বেশি সাহায্য করবে না।

এই নিদর্শনটি বন্ধের একটি নির্দিষ্ট রূপ ।


4
জেএসে এটি সাধারণত 'মডিউল' হিসাবে প্রকাশিত হয়
লেশা ওগোনকোভ

4
আমি এটিকে "বন্ধের একটি নির্দিষ্ট রূপ" বলব না। এটি এমন একটি প্যাটার্ন যা বন্ধ ব্যবহার করে । প্যাটার্নটির নামটি এখনও ধরার জন্য রয়েছে।
ক্রিস হেইস

4
এর কি আসলেই কোনও নাম দরকার? সবকিছু কি একটি প্যাটার্ন হতে হবে? আমাদের কি সত্যিই "মডিউল প্যাটার্ন" বৈকল্পিকগুলির একটি অন্তহীন শ্রেনীর প্রয়োজন? এটি কি কেবল "কিছু স্থানীয় ভেরিয়েবলের সাথে একটি আইআইএফই হতে পারে যা কোনও ফাংশন ফেরত দেয়?"
Dagg Nabbit

4
@ ডাগনব্বিট প্রশ্নটি যখন "এই প্যাটার্নটি কী বলা হয়"? হ্যাঁ, এটির একটি নাম বা অন্যথায় একটি যুক্তিযুক্ত যুক্তি প্রয়োজন যা এটির একটি নেই। তদ্ব্যতীত, নিদর্শনগুলির একটি কারণ রয়েছে। আপনি কেন এখানে তাদের বিরুদ্ধে রেলিং করছেন তা আমি বুঝতে পারি না।
ক্রিস হেইস

4
@ ক্রিসহেইস এর যদি নামের প্রয়োজন হয় তবে তার যুক্তি নেই এমন যুক্তি দেওয়ার দরকার পড়বে কেন? এটা কোন মানে না। যদি এটির একটি দরকার হয় তবে এটি অবশ্যই একটি না। নিদর্শনগুলির সাথে আমার কোনও সমস্যা নেই তবে আমি মনে করি না যে প্রতিটি সাধারণ প্রতিমাটিকে নিদর্শন হিসাবে শ্রেণিবদ্ধ করা প্রয়োজন। এটি করা সীমিত উপায়ে চিন্তাভাবনার দিকে পরিচালিত করে ("এটি কি মডিউল প্যাটার্ন? আমি কি মডিউল প্যাটার্নটি সঠিকভাবে ব্যবহার করছি?" বনাম "আমার কিছু স্থানীয় ভেরিয়েবলের সাথে একটি আইআইএফই আছে যা কোনও ফাংশন ফিরিয়ে দেয়, এই নকশাটি কি আমার জন্য কাজ করে?")
Dagg Nabbit

8

আমি নিশ্চিত নই যে এই প্যাটার্নটির আরও সঠিক নাম আছে কিনা তবে এটি আমার কাছে একটি মডিউলের মতো লাগে এবং এটি ব্যবহারের কারণটি হ'ল উভয় ক্ষেত্রেই encapsulate করা এবং রাষ্ট্র বজায় রাখা।

বন্ধ (একটি ফাংশনের মধ্যে একটি ফাংশন দ্বারা চিহ্নিত) নিশ্চিত করে যে অভ্যন্তরীণ ফাংশনটির বাইরের ফাংশনের মধ্যে ভেরিয়েবলের অ্যাক্সেস রয়েছে।

আপনি যে উদাহরণটি দিয়েছেন fooতাতে বাহ্যিক ফাংশন সম্পাদন করে অভ্যন্তরীণ ফাংশনটি ফিরে আসে (এবং নির্ধারিত হয় ) যার অর্থ tmpObjectবন্ধের মধ্যেই চলতে থাকে এবং অভ্যন্তরীণ ফাংশনে একাধিক কল foo()একই উদাহরণে কাজ করবে tmpObject


5

আপনার কোড এবং থ্রি.জেএস কোডের মধ্যে মূল পার্থক্যটি হ'ল থ্রি.জেএস কোডে চলকটি tmpObjectকেবল একবার আরম্ভ করা হয়, এবং তারপরে ফিরে ফাংশনটির প্রতিটি অনুরোধ দ্বারা ভাগ করা হয়।

এটি staticসি-জাতীয় ভাষায় ভেরিয়েবলগুলি কীভাবে ব্যবহৃত হয় তার অনুরূপ কলগুলির মধ্যে কিছু স্থিতি রাখার জন্য দরকারী ।

tmpObject একটি ব্যক্তিগত ভেরিয়েবল কেবলমাত্র অভ্যন্তরীণ ফাংশনটিতে দৃশ্যমান।

এটি মেমরির ব্যবহার পরিবর্তন করে, তবে এটি মেমরির সংরক্ষণের জন্য ডিজাইন করা হয়নি।


5

আমি উদ্ঘাটিত মডিউল প্যাটার্নের ধারণাটি প্রসারিত করে এই আকর্ষণীয় থ্রেডে অবদান রাখতে চাই, যা নিশ্চিত করে যে সমস্ত পদ্ধতি এবং ভেরিয়েবলগুলি স্পষ্টভাবে প্রকাশ না হওয়া পর্যন্ত গোপনীয় রাখা হবে।

এখানে চিত্র বর্ণনা লিখুন

পরবর্তী ক্ষেত্রে, সংযোজন পদ্ধতিটিকে কলকুলেটর.এডিডি () বলা হত;


0

প্রদত্ত উদাহরণে, প্রথম স্নিপেট foo () ফাংশনে প্রতিটি কলের জন্য tmpObject এর একই উদাহরণ ব্যবহার করবে, যেখানে দ্বিতীয় স্নিপেটের মতো, প্রতিবার tmpObject একটি নতুন উদাহরণ হবে।

প্রথম স্নিপেট ব্যবহার করা যেতে পারে তার একটি কারণ হ'ল ভেরিয়েবল tmpObject কে foo () এর কলগুলির মধ্যে ভাগ করা যায়, তার মান ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ঘোষিত হওয়ার সুযোগ ছাড়াই।

প্রথম স্নিপেটের অবিলম্বে সম্পাদিত ফাংশন সংস্করণটি আসলে এটির মতো দেখায়:

var tmpObject = new Bar();

function foo(){
    // Use tmpObject.
}

তবে নোট করুন যে এই সংস্করণটিতে foo () এর মতো একই সুযোগে tmpObject রয়েছে, সুতরাং এটি পরে চালিত হতে পারে।

একই কার্যকারিতা অর্জনের আরও ভাল উপায় হ'ল পৃথক মডিউল ব্যবহার করা:

মডিউল 'foo.js':

var tmpObject = new Bar();

module.exports = function foo(){
    // Use tmpObject.
};

মডিউল 2:

var foo = require('./foo');

আইইএফ এর পারফরম্যান্স এবং একটি নামী foo ক্রিয়েটর ফাংশনের মধ্যে একটি তুলনা: http://jsperf.com/ief-vs- নাম- ফাংশন


4
আপনার 'আরও ভাল' উদাহরণটি কেবল নোডজেএসে কাজ করে এবং আপনি কীভাবে এটি আরও ভাল তা ব্যাখ্যা করেননি।
বেনজামিন গ্রুয়েনবুম

আলাদা মডিউল তৈরি করা "আরও ভাল" নয়, এটি অন্যরকম। বিশেষত, এটি হ'ল উচ্চ-অর্ডার ফাংশনগুলি প্রথম অর্ডার অবজেক্টগুলিতে ডাউন করে দেয়। প্রথম-আদেশের কোডটি পদক্ষেপ করা সহজ হতে ঝোঁক, তবে সাধারণত আরও ভারবস হয় এবং আমাদের মধ্যবর্তী ফলাফলগুলি পুনরায় উল্লেখ করতে বাধ্য করে।
ওয়ারবো

@ বেনজামিন গ্রুয়েনবাউম মডিউলগুলি কেবল নোডে নয়, অনেকগুলি ক্লায়েন্ট-সাইড মডিউল সমাধান রয়েছে, উদাহরণস্বরূপ, ব্রাউজ করুন। আমি মডিউলটির সমাধানটিকে "আরও ভাল" হিসাবে বিবেচনা করি কারণ এটি আরও পাঠযোগ্য, ডিবাগ করা সহজ, এবং কী সুযোগে রয়েছে এবং কোথায় রয়েছে সে সম্পর্কে এটি আরও স্পষ্ট।
কোরি নন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.