নির্মাণকারীর ফাংশন বনাম কারখানা ফাংশন


150

কেউ কি জাভাস্ক্রিপ্টে কনস্ট্রাক্টর ফাংশন এবং কারখানার ফাংশনের মধ্যে পার্থক্য পরিষ্কার করতে পারেন।

অন্যটির পরিবর্তে কখন ব্যবহার করতে হবে?

উত্তর:


149

মূল পার্থক্যটি হ'ল একটি কনস্ট্রাক্টর ফাংশনটি newকীওয়ার্ডের সাথে ব্যবহৃত হয় (যার ফলে জাভাস্ক্রিপ্ট স্বয়ংক্রিয়ভাবে একটি নতুন অবজেক্ট তৈরি করে, thisসেই বস্তুর সাথে ফাংশনের মধ্যে সেট করে এবং বস্তুটি ফেরত দেয়):

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;
}

অবশ্যই আপনি ফ্যাক্টরি ফাংশনগুলি সেই সাধারণ উদাহরণের চেয়ে অনেক জটিল করে তুলতে পারেন।

কারখানার ফাংশনগুলির জন্য একটি সুবিধা হ'ল কিছু প্যারামিটারের উপর নির্ভর করে যখন বস্তুটি ফেরত দেওয়া হয় তখন বিভিন্ন ধরণের হতে পারে।


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

6
আমি এটি উল্লেখ করতে চেয়েছিলাম যে উভয় ক্ষেত্রে (কনস্ট্রাক্টর ফাংশন বনাম কারখানা ফাংশন) এর উদাহরণগুলি সামঞ্জস্যপূর্ণ হওয়া উচিত। কারখানার ফাংশনটির উদাহরণটিতে কারখানায় someMethodফিরে আসা জিনিসগুলির জন্য অন্তর্ভুক্ত নেই , এবং এটি এখানে কিছুটা কুয়াশাচ্ছন্ন হয়। কারখানার ফাংশনের অভ্যন্তরে, যদি কেউ কেবল এটি করে var obj = { ... , someMethod: function() {}, ... }, তবে প্রতিটি বস্তুর প্রত্যাবর্তন ঘটবে someMethodযার একটি অনুলিপি হ'ল এমন কিছু যা আমরা চাই না। ফ্যাক্টরি ফাংশন ব্যবহার newএবং prototypeঅভ্যন্তরে এটিই সহায়তা করবে।
ভারত খত্রি

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

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

1
@ ফেডেরিকো - কারখানার পদ্ধতিগুলিতে কেবল একটি সরল বস্তু ফিরে আসতে হবে না। তারা newঅভ্যন্তরীণভাবে ব্যবহার করতে পারেন , বা Object.create()একটি নির্দিষ্ট প্রোটোটাইপ দিয়ে একটি বস্তু তৈরি করতে ব্যবহার করতে পারেন ।
nnnnnn

110

কনস্ট্রাক্টর ব্যবহারের সুবিধা

  • বেশিরভাগ বই আপনাকে কনস্ট্রাক্টর এবং ব্যবহার করতে শেখায় new

  • this নতুন বস্তু বোঝায়

  • কিছু লোক var myFoo = new Foo();পড়ার মতো পছন্দ করে ।

অপূর্ণতা

  • তাত্ক্ষণিকতার বিবরণ কলিং এপিআই-এ ( newপ্রয়োজনীয়তার মাধ্যমে ) ফাঁস হয়ে যায় , সুতরাং সমস্ত কলারগুলি কন্সট্রাক্টর বাস্তবায়নে দৃ tight়ভাবে মিলিত হয়। যদি কখনও কারখানার অতিরিক্ত নমনীয়তা প্রয়োজন হয়, আপনাকে সমস্ত কলারকে রিফ্যাক্টর করতে হবে (স্বীকৃতিস্বরূপ নিয়মের চেয়ে ব্যতিক্রমী কেস)।

  • ভুলে যাওয়া newএমন একটি সাধারণ বাগ, কনস্ট্রাক্টরকে সঠিকভাবে ডাকা হয়েছে কিনা তা নিশ্চিত করার জন্য আপনাকে বয়লারপ্লেট চেক যুক্ত করার জন্য দৃ strongly়তার সাথে বিবেচনা করা উচিত if (!(this instanceof Foo)) { return new Foo() }। সম্পাদনা: ES6 (ES2015) যেহেতু আপনি newকোনও classকনস্ট্রাক্টরের সাথে ভুলতে পারবেন না , বা নির্মাণকারী একটি ত্রুটি নিক্ষেপ করবে।

  • আপনি যদি instanceofচেকটি করেন তবে এটি newপ্রয়োজনীয় হবে কিনা তা নিয়ে অস্পষ্টতা ছেড়ে দেয় । আমার মতে, এটি হওয়া উচিত নয়। আপনি newপ্রয়োজনীয়ভাবে কার্যকরভাবে সংক্ষিপ্তসারিত করেছেন , যার অর্থ আপনি # 1 এর অপূর্ণতা মুছতে পারেন। তবে তারপরে আপনি অতিরিক্ত বয়লারপ্লেট, একটি মূলধনপত্র এবং কম নমনীয় thisপ্রসঙ্গ সহ নাম ব্যতীত কেবলমাত্র একটি কারখানার ফাংশন পেয়েছেন

নির্মাতারা ওপেন / ক্লোজড নীতি ভেঙে দেয়

তবে আমার প্রধান উদ্বেগ হ'ল এটি উন্মুক্ত / বদ্ধ নীতি লঙ্ঘন করে। আপনি কোনও কনস্ট্রাক্টর রফতানি শুরু করেন, ব্যবহারকারীরা কনস্ট্রাক্টর ব্যবহার শুরু করেন, তারপরে আপনি বুঝতে পারেন যে কোনও কারখানার নমনীয়তা প্রয়োজন তার পরিবর্তে (উদাহরণস্বরূপ, অবজেক্ট পুলগুলি ব্যবহার করতে বাস্তবায়নটি স্যুইচ করার জন্য, বা কার্যকরভাবে প্রাসঙ্গিক পরিবেশে ইনস্ট্যান্টিয়েট করার জন্য) প্রোটোটাইপাল ওও ব্যবহার করে উত্তরাধিকারের আরও নমনীয়তা থাকতে হবে)।

আপনি আটকে আছেন, যদিও। আপনার কনস্ট্রাক্টরকে কল করে এমন সমস্ত কোড না ভেঙে আপনি পরিবর্তন করতে পারবেন না new। উদাহরণস্বরূপ, পারফরম্যান্স লাভের জন্য আপনি অবজেক্ট পুলগুলি ব্যবহার করতে স্যুইচ করতে পারবেন না।

এছাড়াও, কনস্ট্রাক্টর ব্যবহার করে এমন একটি প্রতারণামূলক দেয় instanceofযা কার্যকরভাবে প্রাসঙ্গিকের কাজ করে না এবং আপনার কনস্ট্রাক্টর প্রোটোটাইপটি অদলবদল হয়ে গেলে কাজ করে না। আপনি যদি thisআপনার নির্মাণকারীর কাছ থেকে ফিরে আসা শুরু করেন , এবং তারপরে একটি নির্বিচার বস্তু রফতানি করতে স্যুইচ করেন তবে এটি আপনার কনস্ট্রাক্টরে কারখানার মতো আচরণ সক্ষম করতে আপনাকে করতে হবে It

কারখানাগুলি ব্যবহারের সুবিধা

  • কম কোড - কোনও বয়লারপ্লেটের প্রয়োজন নেই।

  • আপনি যেকোন স্বেচ্ছাচারিত বস্তুটি ফিরিয়ে দিতে পারেন এবং যেকোন স্বেচ্ছাসেবক প্রোটোটাইপ ব্যবহার করতে পারেন - আপনাকে একই ধরণের এপিআই প্রয়োগকারী বিভিন্ন ধরণের অবজেক্ট তৈরি করতে আরও নমনীয়তা দেয়। উদাহরণস্বরূপ, এমন একটি মিডিয়া প্লেয়ার যা এইচটিএমএল 5 এবং ফ্ল্যাশ প্লেয়ার উভয়েরই উদাহরণ তৈরি করতে পারে বা এমন ইভেন্ট লাইব্রেরি যা ডিওএম ইভেন্ট বা ওয়েব সকেটের ইভেন্টগুলি নির্গত করতে পারে। কারখানাগুলি কার্যকর কার্যকরকরণগুলি জুড়ে অবজেক্টগুলিও ইনস্ট্যান্ট করতে পারে, অবজেক্ট পুলগুলির সুবিধা নিতে পারে এবং আরও নমনীয় প্রোটোটাইপাল উত্তরাধিকারের মডেলগুলির জন্য মঞ্জুরি দেয়।

  • আপনার কারখানার কারখানা থেকে কনস্ট্রাক্টরে রূপান্তর করার দরকার নেই, তাই রিফ্যাক্টরিং কখনও সমস্যা হবে না।

  • ব্যবহার সম্পর্কে কোনও অস্পষ্টতা নেই new। না। (এটি thisখারাপ আচরণ করবে , পরের বিষয়টি দেখুন)।

  • thisআচরণ করবে যেমন স্বাভাবিকভাবে would - তাই আপনি (উদাহরণস্বরূপ পিতা বা মাতা বস্তুর অ্যাক্সেস করতে এটি ব্যবহার করতে পারেন, ভিতরে player.create(), thisবোঝায় player।, শুধু অন্য কোন পদ্ধতি would আবাহন মত callএবং applyএছাড়াও পুনঃস্থির this, প্রত্যাশিত হিসাবে আপনি পিতা বা মাতা বস্তুর উপর এগুলির নমুনা সংরক্ষণ, তাহলে সেই। কার্যকরভাবে কার্যকারিতা অদলবদল করার একটি দুর্দান্ত উপায় হতে পারে এবং আপনার অবজেক্ট ইনস্ট্যান্টেশনের জন্য খুব নমনীয় পলিমারফিজম সক্ষম করতে পারে।

  • পুঁজি করা বা না করা সম্পর্কে কোনও অস্পষ্টতা নেই। না। লিন্ট সরঞ্জামগুলি অভিযোগ করবে এবং তারপরে আপনি ব্যবহার করার চেষ্টা করতে প্ররোচিত হবেন newএবং তারপরে আপনি উপরে বর্ণিত সুবিধাটি পূর্বাবস্থায় ফিরিয়ে আনবেন।

  • কিছু মানুষ পছন্দ করেন var myFoo = foo();বা var myFoo = foo.create();পড়েন।

অপূর্ণতা

  • newআশানুরূপ আচরণ করে না (উপরে দেখুন)। সমাধান: এটি ব্যবহার করবেন না।

  • thisনতুন অবজেক্টের উল্লেখ নেই (পরিবর্তে, যদি কনস্ট্রাক্টরের সাথে ডট নোটেশন বা স্কোয়ার ব্র্যাকেট স্বরলিপি দেওয়া হয়, উদাহরণস্বরূপ foo.bar () - thisউল্লেখ করা হয় foo- ঠিক প্রতিটি অন্যান্য জাভাস্ক্রিপ্ট পদ্ধতির মতো - সুবিধা দেখুন)।


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

4
ওপেন / ক্লোজড লঙ্ঘন সম্পর্কিত: এই সমস্ত নির্ভরতা ইঞ্জেকশন সম্পর্কে নয়? যদি এ-এর বি দরকার হয় তবে ওয়েদার এ-কে নতুন বি () বা একটি কল বিফ্যাক্ট্রি.ক্রিয়েট () কল করে, উভয়ই সংযুক্তির পরিচয় দেয়। অন্যদিকে আপনি যদি কম্পোজিশনের মূলটিতে বি এর একটি উদাহরণ দেন তবে কীভাবে বি ইনস্ট্যান্টিয়েটেড হয় সে সম্পর্কে এটিকে কিছুই জানার দরকার নেই। আমি মনে করি উভয় নির্মাণকারী এবং কারখানাগুলির ব্যবহার রয়েছে; কনস্ট্রাক্টরগুলি সহজ ইনস্ট্যান্টেশন, কারখানাগুলি আরও জটিল তাত্ক্ষণিক জন্য। তবে উভয় ক্ষেত্রেই আপনার নির্ভরতা ইনজেকশন করা বুদ্ধিমানের কাজ।
স্টিফান বিলিয়েট

1
ইনজেকশন স্টেটের জন্য ডিআই ভাল: কনফিগারেশন, ডোমেন অবজেক্টস এবং আরও অনেক কিছু। এটি অন্য সব কিছুর জন্য ওভারকিল।
এরিক এলিয়ট

1
গোলমাল হ'ল প্রয়োজনীয়তা newমুক্ত / বদ্ধ নীতি লঙ্ঘন করে। এই মন্তব্যগুলির মঞ্জুরির চেয়ে আরও বড় আলোচনার জন্য মিডিয়াম.com/ জাভাস্ক্রিপ্ট- দৃশ্য / দেখুন দেখুন ।
এরিক এলিয়ট

3
যেহেতু যে কোনও ফাংশন জাভাস্ক্রিপ্টে একটি নতুন অবজেক্ট ফিরিয়ে দিতে পারে, এবং তাদের বেশিরভাগই newকীওয়ার্ড ছাড়াই এটি করে , আমি বিশ্বাস করি না যে newকীওয়ার্ডটি আসলে কোনও অতিরিক্ত পাঠযোগ্যতা সরবরাহ করে। আইএমও, কলকারীদের আরও বেশি টাইপ করতে সক্ষম করার জন্য হুপসের মধ্য দিয়ে ঝাঁপিয়ে পড়া নির্বোধ বলে মনে হয়।
এরিক এলিয়ট

39

একজন কনস্ট্রাক্টর আপনি যে শ্রেণীর উপর কল করেন সেটির একটি উদাহরণ দেয় returns একটি কারখানার ফাংশন যে কোনও কিছু ফিরিয়ে দিতে পারে। আপনি যখন স্বেচ্ছাসেবী মানগুলি ফিরিয়ে নিতে প্রয়োজন বা ক্লাসে একটি বড় সেটআপ প্রক্রিয়া থাকে তখন আপনি একটি কারখানা ফাংশন ব্যবহার করবেন।


5

একটি কনস্ট্রাক্টর ফাংশন উদাহরণ

function User(name) {
  this.name = name;
  this.isAdmin = false;
}

let user = new User("Jack");
  • newপ্রোটোটাইপযুক্ত একটি অবজেক্ট তৈরি করে User.prototypeএবং Userতৈরি করা অবজেক্টের সাথে তার thisমান হিসাবে কল করে ।

  • new এটির অপারেন্ডের জন্য একটি আর্গুমেন্ট এক্সপ্রেশনটিকে expressionচ্ছিক হিসাবে বিবেচনা করে:

         let user = new User;

    কোন যুক্তি ছাড়াই newকল করতে হবে User

  • newকনস্ট্রাক্টর কোনও বস্তুর মান ফেরত না দিলে এটি তৈরি করা বস্তুটি ফেরত দেয় , যা পরিবর্তে ফিরে আসে। এটি একটি প্রান্তের কেস যা বেশিরভাগ অংশে উপেক্ষা করা যায়।

সুবিধা - অসুবিধা

কনস্ট্রাক্টর ফাংশন দ্বারা নির্মিত বস্তুগুলি কনস্ট্রাক্টরের সম্পত্তি থেকে সম্পত্তি অর্জন করে এবং কনস্ট্রাক্টর ফাংশনে অপারেটর prototypeব্যবহার করে সত্য ফিরে আসে instanceOf

উপরের আচরণগুলি ব্যর্থ হতে পারে যদি আপনি prototypeইতিমধ্যে কনস্ট্রাক্টর ব্যবহারের পরে নির্মাণকারীর সম্পত্তির মান পরিবর্তন করে । এটি করা বিরল , এবং classকীওয়ার্ড ব্যবহার করে কনস্ট্রাক্টর তৈরি করা থাকলে এটি পরিবর্তন করা যাবে না ।

কনস্ট্রাক্টর ফাংশনগুলি extendsকীওয়ার্ড ব্যবহার করে বাড়ানো যেতে পারে ।

কনস্ট্রাক্টর ফাংশন nullত্রুটির মান হিসাবে ফিরে আসতে পারে না । যেহেতু এটি কোনও অবজেক্টের ডেটা টাইপ নয়, তাই এটি এড়ানো হবে new

একটি কারখানার ফাংশন উদাহরণ

function User(name, age) {
  return {
    name,
    age,
  }
};

let user = User("Tom", 23);

এখানে ফ্যাক্টরি ফাংশন ছাড়া ডাকা হয় new। ফাংশন প্রত্যক্ষ বা অপ্রত্যক্ষ ব্যবহারের জন্য সম্পূর্ণরূপে দায়বদ্ধ যদি এর তর্কগুলি এবং এটির আকারটি ফিরে আসে। এই উদাহরণে এটি আর্গুমেন্ট থেকে সেট করা কিছু বৈশিষ্ট্য সহ একটি সাধারণ [অবজেক্ট অবজেক্ট] প্রদান করে।

সুবিধা - অসুবিধা

কলার থেকে অবজেক্ট তৈরির বাস্তবায়ন জটিলতাগুলি সহজেই আড়াল করে। এটি একটি ব্রাউজারে নেটিভ কোড ফাংশনের জন্য বিশেষত কার্যকর।

কারখানার ফাংশনটিতে সর্বদা একই ধরণের জিনিসগুলি ফেরত দেওয়া উচিত নয় এবং এমনকি nullত্রুটি সূচক হিসাবে ফিরে আসতে পারে ।

সাধারণ ক্ষেত্রে, কারখানার ফাংশন কাঠামো এবং অর্থের পক্ষে সহজ হতে পারে।

প্রত্যাবর্তিত বস্তুগুলি সাধারণত কারখানার ফাংশনের prototypeসম্পত্তি থেকে উত্তরাধিকারী হয় না এবং falseএখান থেকে ফিরে আসে instanceOf factoryFunction

মূলশব্দটি ব্যবহার করে কারখানার ফাংশনটি নিরাপদে বাড়ানো যায় না extendsকারণ বর্ধিত বস্তুগুলি কারখানার ফাংশন দ্বারা ব্যবহৃত কনস্ট্রাক্টরের prototypeসম্পত্তি পরিবর্তে কারখানার ফাংশন সম্পত্তি থেকে উত্তরাধিকারী হয় prototype


1
এটি একই বিষয়ে এই প্রশ্নের জবাবে পোস্ট করা একটি দেরী উত্তর ,
traktor53

শুধু "নাল" নয়, তবে "নতুন" কনট্রাক্টর ফাংশন দ্বারা ফিরিয়ে দেওয়া কোনও প্রাকৃতিক ডেটাটাইপও উপেক্ষা করবে।
বিশাল

2

কারখানাগুলি "সর্বদা" আরও ভাল। তখন অবজেক্ট ওরিয়েন্টেটেড ভাষা ব্যবহার করার সময়

  1. চুক্তির বিষয়ে সিদ্ধান্ত নিন (পদ্ধতিগুলি এবং তারা কী করবে)
  2. ইন্টারফেসগুলি তৈরি করুন যা সেই পদ্ধতিগুলি প্রকাশ করে (জাভাস্ক্রিপ্টে আপনার ইন্টারফেস নেই তাই বাস্তবায়ন পরীক্ষা করার কোনও উপায় নিয়ে আসতে হবে)
  3. এমন একটি ফ্যাক্টরি তৈরি করুন যা প্রতিটি ইন্টারফেসের প্রয়োজনীয় প্রয়োগ বাস্তবায়ন করে।

বাস্তবায়নগুলি (নতুন দিয়ে তৈরি প্রকৃত বস্তুগুলি) কারখানার ব্যবহারকারী / গ্রাহক হিসাবে প্রকাশিত হয় না। এর অর্থ হ'ল কারখানা বিকাশকারী যতক্ষণ না চুক্তিটি ভঙ্গ করেন ততক্ষণ নতুন প্রবর্তন এবং প্রসার ঘটাতে পারে ... এবং এটি কারখানার গ্রাহককে তাদের কোড পরিবর্তন না করেই কেবল নতুন এপিআই থেকে উপকৃত হতে দেয় ... যদি তারা নতুন ব্যবহার করে এবং একটি "নতুন" বাস্তবায়ন আসে তবে তাদের যেতে হবে এবং "নতুন" ব্যবহারের জন্য "নতুন" ব্যবহার করা প্রতিটি লাইন পরিবর্তন করতে হবে ... কারখানায় তাদের কোড পরিবর্তন হয় না ...

কারখানা - অন্য যে কোনও কিছুর চেয়ে ভাল - বসন্তের কাঠামো পুরোপুরি এই ধারণার চারদিকে নির্মিত।


কারখানায় প্রতিটি লাইনে পরিবর্তন আনার সমস্যাটি কীভাবে সমাধান করা যায়?
কোড নাম জ্যাক

0

কারখানাগুলি বিমূর্তকরণের একটি স্তর এবং সমস্ত বিমূর্ততার মতো তাদের জটিলতাতে a.cost রয়েছে। কোনও ফ্যাক্টরি ভিত্তিক এপিআইয়ের মুখোমুখি হওয়ার সময় প্রদত্ত এপিআইয়ের জন্য কারখানাটি কী তা নির্ধারণ করে এপিআই গ্রাহক হয়ে উঠতে পারে। কনস্ট্রাক্টরগুলির সাথে আবিষ্কারের বিষয়টি তুচ্ছ।

সিটার এবং কারখানাগুলির মধ্যে সিদ্ধান্ত নেওয়ার সময় আপনার সিদ্ধান্ত নেওয়া দরকার যে সুবিধার দ্বারা জটিলতা ন্যায়সঙ্গত কিনা।

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


5
জাভাস্ক্রিপ্টে, কন্সট্রাক্টর ব্যবহারের ব্যয় কারখানার ব্যবহারের ব্যয়ের চেয়ে বেশি কারণ জেএসে যে কোনও ফাংশন কোনও নতুন অবজেক্ট ফিরিয়ে দিতে পারে। কনস্ট্রাক্টরগুলি জটিলতা যুক্ত করে: প্রয়োজনীয় প্রয়োজন new, পরিবর্তনের আচরণের thisপরিবর্তন, ফেরত মূল্য পরিবর্তন করা, একটি প্রোটোটাইপ রেফ সংযুক্ত করা, সক্ষম করা instanceof(যা মিথ্যা এবং এই উদ্দেশ্যে ব্যবহার করা উচিত নয়)। স্পষ্টতই, সেগুলি সমস্তই "বৈশিষ্ট্য"। অনুশীলনে, তারা আপনার কোডের মানের ক্ষতি করে hurt
এরিক এলিয়ট

0

পার্থক্যের জন্য, এরিক এলিয়ট খুব ভালভাবে স্পষ্ট করে বলেছেন,

তবে দ্বিতীয় প্রশ্নের জন্য:

অন্যটির পরিবর্তে কখন ব্যবহার করতে হবে?

আপনি যদি অবজেক্ট-ভিত্তিক পটভূমি থেকে আসছেন তবে কনস্ট্রাক্টর ফাংশনটি আপনার কাছে আরও প্রাকৃতিক দেখায়। এইভাবে আপনার newকীওয়ার্ডটি ব্যবহার করতে ভুলবেন না ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.