angular.service বনাম কৌণিক.ফ্যাক্টরি


1065

আমি উভয়ই কৌনিক.ফ্যাক্টরি () এবং কৌণিক.সার্ভিস () পরিষেবাগুলি ঘোষনা করতে ব্যবহার করতে দেখেছি ; তবে, সরকারী নথিতে আমি কোথাও খুঁজে পাচ্ছি নাangular.service

দুটি পদ্ধতির মধ্যে পার্থক্য কী?
কোনটি কোনটির জন্য ব্যবহার করা উচিত (ধরে নিলে তারা বিভিন্ন কাজ করে)?



4
আমি "[কৌণিক সেগুলি] পরিষেবা ফ্যাক্টরি" অনুসন্ধান করেছি, তবে আমি এটিও মনে রেখেছিলাম যে এটি সম্পর্কে ইতিমধ্যে একটি প্রশ্ন ছিল (কারণ আমি সেই প্রশ্নটি লিখতে / ভেবেছিলাম নিজেই এক পর্যায়ে)।
রাজকোক

2
একটি অনুসন্ধানে, বর্গাকার বন্ধনীগুলি কোনও ট্যাগকে বোঝায়?
জ্যাকব

11
@ জ্যাকব স্কোয়ার ব্র্যাকেটগুলি আপনার অনুসন্ধানকে সঙ্কুচিত করছে। [কৌণিক জাল] নির্দেশাবলী - ইতিমধ্যে কৌণিক জাল দিয়ে ট্যাগ করা প্রশ্নের জন্য 'নির্দেশিকা' অনুসন্ধান করবে।
মাহবুব 10

1
@ মাহবুব অন্য কথায়, "হ্যাঁ" :)
ব্রায়ান

উত্তর:


1268
  angular.service('myService', myServiceFunction);
  angular.factory('myFactory', myFactoryFunction);

যতক্ষণ না আমি নিজের কাছে এভাবে রাখি ততক্ষণ পর্যন্ত এই ধারণাটি সম্পর্কে আমার মাথা জড়িয়ে যেতে সমস্যা হয়েছিল:

পরিষেবা : আপনি যে ফাংশনটি লিখেছেন তা নতুন-যুক্ত হবে :

  myInjectedService  <----  new myServiceFunction()

কারখানা : আপনি যে ফাংশনটি (কনস্ট্রাক্টর) লিখেছেন তা হ'ল :

  myInjectedFactory  <---  myFactoryFunction()

আপনি এটি দিয়ে যা করেন তা আপনার উপর নির্ভর করে তবে কিছু দরকারী নিদর্শন রয়েছে ...

যেমন কোনও পাবলিক এপিআই প্রকাশ করার জন্য কোনও পরিষেবা ফাংশন লেখার মতো :

function myServiceFunction() {
  this.awesomeApi = function(optional) {
    // calculate some stuff
    return awesomeListOfValues;
  }
}
---------------------------------------------------------------------------------
// Injected in your controller
$scope.awesome = myInjectedService.awesomeApi();

অথবা একটি সর্বজনীন এপিআই প্রকাশের জন্য কারখানা ফাংশন ব্যবহার করে :

function myFactoryFunction() {
  var aPrivateVariable = "yay";

  function hello() {
    return "hello mars " + aPrivateVariable;
  }

  // expose a public API
  return {
    hello: hello
  };
}
---------------------------------------------------------------------------------
// Injected in your controller
$scope.hello = myInjectedFactory.hello();

বা কোনও কনস্ট্রাক্টরকে ফেরত দেওয়ার জন্য কারখানার ফাংশন ব্যবহার করে :

function myFactoryFunction() {
    return function() {
        var a = 2;
        this.a2 = function() {
            return a*2;
        };
    };
}
---------------------------------------------------------------------------------
// Injected in your controller
var myShinyNewObject = new myInjectedFactory();
$scope.four = myShinyNewObject.a2();

কোনটি ব্যবহার করবেন? ...

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

var myShinyNewObject = new myInjectedService.myFunction()

যা এর চেয়ে তর্কযোগ্যভাবে কম কাঙ্ক্ষিত:

var myShinyNewObject = new myInjectedFactory();

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


আরও একটি বিষয়, তারা সবাই সিলেটলেট ...

এছাড়াও মনে রাখবেন যে উভয় ক্ষেত্রেই কৌনিকটি আপনাকে একটি সিঙ্গলটন পরিচালনা করতে সহায়তা করে। আপনি নিজের পরিষেবা বা ফাংশনটি কোথায় বা কতবার ইনজেক্ট করবেন না কেন, আপনি একই জিনিস বা ফাংশনের একই রেফারেন্স পাবেন। (যখন কোনও কারখানায় কেবল কোনও সংখ্যা বা স্ট্রিংয়ের মতো কোনও মূল্য ফেরৎ দেওয়া ব্যতীত that সেক্ষেত্রে আপনি সর্বদা একই মান পাবেন তবে কোনও রেফারেন্স নয়))


2
এটিকে নিউবেবলের চেয়ে অবজেক্ট কনস্ট্রাক্টর বলা ভাল?
marksyzm

2
@ হুগো, আমি প্রদর্শন করছিলাম যে আপনি উভয়ের সাথে কার্যকরভাবে একই জিনিসটি সম্পাদন করতে পারবেন, বাক্য গঠনটি ভিন্ন হবে কেবল।
গিল বিরমন

105
আমি নিশ্চিত নই যে পরিষেবা এবং কারখানার মধ্যে পার্থক্য সম্পর্কে আমি কতবার পড়তে হবে তা নিশ্চিত করার আগে আমি উভয়ই প্রয়োজনীয়
ডিএমাক দ্য ডাস্ট্রোয়ার

10
"নতুন" বলতে আমাদের ইতিমধ্যে একটি ক্রিয়া আছে, এটি "তাত্ক্ষণিক"। শুধু রেফারেন্সের জন্য। :)
sscarduzio

7
কারখানাগুলি হ'ল ফাংশন যা আহ্বান জানানো হয়, যাতে তারা কিছু ফিরিয়ে দিতে পারে। অন্যদিকে, পরিষেবাগুলি কৌণিক মাধ্যমে তাত্ক্ষণিকভাবে পরিচালিত হয় new fn(), সুতরাং তাদের অবশ্যই একটি উদাহরণ ফিরে আসতে হবে।
গিল বিরমন

318

সহজভাবে করা ..

// Service
service = (a, b) => {
  a.lastName = b;
  return a;
};

// Factory
factory = (a, b) => Object.assign({}, a, { lastName: b });

const fullName = { firstName: 'john' };

// Service
const lastNameService = (a, b) => {
  a.lastName = b;
  return a;
};
console.log(lastNameService(fullName, 'doe'));

// Factory
const lastNameFactory = (a, b) => 
  Object.assign({}, a, { lastName: b })
console.log(lastNameFactory(fullName, 'doe'));


169
বন্ধু, তোমাকে ধন্যবাদ। অন্যান্য উত্তরের বিবরণ বৈধ নয়, তবে কিছু সময় আপনার 10 সেকেন্ড সংস্করণ প্রয়োজন।
আর ক্লেন

4
কেবল পরিষেবা ফাংশন কিছুই ফেরত না। This.name = ... দেখানোর জন্য এটি একটি API প্রকাশক হয় যথেষ্ট।
পিক্সিটসেট

3
তবে আপনি যদি ফিরে যান এবং আপত্তি করেন তবে এটি এর পরিবর্তে এটি ব্যবহার করবে। jsfiddle.net/Ne5P8/1221
MrB

@ এমআরবি, এটি একটি সাধারণ জাভাস্ক্রিপ্ট বৈশিষ্ট্য, কৌনিক বা এই প্রশ্নের প্রসঙ্গে নির্দিষ্ট নয়।
ওম শঙ্কর

@ ওম শঙ্কর, উপরের উত্তরটি দেখায় যে পার্থক্যটি হ'ল এই বনাম কোনও প্রত্যাবর্তিত বস্তুর ব্যবহার। আমি দেখছিলাম যে "এটি" একটি ডিফল্ট মান যা কোনও পরিষেবার সাথে ব্যবহার করা হবে তবে আপনি যদি কোনও মান ফেরত দেন তবে এটি প্রায় একটি কারখানার মতো কাজ করবে। তবে ফ্লিপ সাইডে কোনও কারখানায় প্রত্যাবর্তিত মানের প্রয়োজন হবে অন্যথায় ত্রুটি ঘটবে - (এই উদাহরণে দেখানো হয়েছে - jsfiddle.net/hmoc0q3v/1 )।
MrB

247

এখানে প্রাথমিক পার্থক্য রয়েছে:

সেবা

বাক্য গঠন: module.service( 'serviceName', function );

ফলাফল: পরিষেবা নাম যখন ইনজেক্টেবল আর্গুমেন্ট হিসাবে ঘোষণা করার সময় আপনাকে কোনও ফাংশনটি পাস করার উদাহরণ সরবরাহ করা হবে module.service

ব্যবহার: কেবল ইনজেকশন ফাংশন রেফারেন্স যুক্ত করে প্রার্থনা করতে দরকারী যে ইউটিলিটি ফাংশন ভাগ করে নেওয়ার জন্য দরকারী হতে পারে ( )। সঙ্গে injectedArg.call( this )বা অনুরূপ চালানো যেতে পারে ।

কারখানা

বাক্য গঠন: module.factory( 'factoryName', function );

ফলাফল: যখন ইঞ্জেকশনভিত্তিক একটা যুক্তি আপনার সাথে প্রদান করা হবে যেমন factoryName ঘোষণা মান ফাংশন রেফারেন্স আবাহন করার মাধ্যমে ফিরিয়ে দেওয়া হয় প্রেরণ module.factory

ব্যবহার: উদাহরণস্বরূপ তৈরি করতে নতুন করা যেতে পারে এমন কোনও 'শ্রেণি' ফাংশন ফেরত দেওয়ার জন্য দরকারী হতে পারে।

এখানে পরিষেবা এবং কারখানা ব্যবহার করে উদাহরণ দেওয়া আছেAngularJS পরিষেবা বনাম কারখানা সম্পর্কে আরও পড়ুন ।

আপনি সার্ভিস বনাম কারখানার সম্পর্কে বিভ্রান্ত স্ট্যাকওভারফ্লোতে অ্যাংুলারজেএস ডকুমেন্টেশন এবং অনুরূপ প্রশ্নটিও দেখতে পারেন ।


27
আমি আপনার কারখানার উদাহরণ ব্যবহারের সাথে একমত নই। উভয় পরিষেবা এবং কারখানাগুলি (একটি ফাংশনটি ধরে নিয়েছে বলে ধরে নেওয়া হচ্ছে It এটি কেবলমাত্র একটি মান বা কোনও অবজেক্ট হতে পারে) নতুন করা যেতে পারে। প্রকৃতপক্ষে কোনও পরিষেবা হ'ল একমাত্র বিকল্প যা আপনাকে ফাংশন উদাহরণ হিসাবে সরবরাহ করা হ'ল নতুনভাবে যোগ্য হওয়ার গ্যারান্টিযুক্ত। আমি বলব যে কোনও পরিষেবাতে একটি ফ্যাক্টরি ব্যবহার করার সুবিধাটি হ'ল এটি সম্পত্তি - ব্যক্তিগত এবং জনসাধারণের কাছে অ্যাক্সেসের উপর কিছুটা নিয়ন্ত্রণের অনুমতি দেয় যেখানে পরিষেবাটির সমস্ত সম্পত্তি প্রকৃতির দ্বারা প্রকাশিত হয়। এবং আমি কোনও সরবরাহকারীর কারখানার কারখানা হিসাবে মনে করি - এটি কেবল কনফিগার করার সময় ইনজেক্টেবল এবং কনফিগারযোগ্য।
অঙ্কিত আর

1
: আপনার মন্তব্যের জন্য @DrewR ধন্যবাদ, আমি একটি কারখানা ব্যবহার সরকারি ও বেসরকারি পদ্ধতি একটি ভাল উদাহরণ পাওয়া stackoverflow.com/a/14904891/65025
edzillion

আমাকে এই বিষয়ে @ ড্র্রুআর এর সাথে একমত হতে হবে। আমি কারখানার আগে বস্তুগুলি ফেরত দেওয়ার জন্য ব্যবহার করেছি, তবে সত্যই এই মুহুর্তে এটি কেবল $providersসমস্ত সময় ব্যবহার করা উপযুক্ত ।
jedd.ahyoung

পরিষেবা স্বয়ংক্রিয়ভাবে কনস্ট্রাক্টর ইনস্ট্যান্ট করছে, তাই না?
মার্টিয়ান2049

1
@ ড্র্রুআর - আমার উপলব্ধি থেকে, এটি সত্য যে আপনি কোনও কারখানার মাধ্যমে আপনার মতো সেবা থেকে একই নতুন 'কার্যকর প্রভাব অর্জন করতে পারেন, তবে এটি এর অর্থ কী তা নয়। এটির মূল লক্ষ্যটি হ'ল যখন আপনি কেবল কিছু ইউটিলিটি অবজেক্ট ফিরিয়ে দিতে চান এবং তার জন্য এটি আরও উপযুক্ত সিনট্যাক্স সরবরাহ করে - আপনি কেবল this.myFunc = function(){}আপনার সেবায় লিখতে পারেন (অবজেক্টটি তৈরি করতে কোড লিখন থেকে আপনাকে বাঁচায় যেমন আপনি কারখানার সাথে করতে চান) )।
জর্পটকোড

137

টিএল; ডিআর

1) আপনি যখন কারখানাটি ব্যবহার করেন আপনি কোনও বস্তু তৈরি করেন, এতে বৈশিষ্ট্য যুক্ত করুন, তারপরে একই জিনিসটি ফিরিয়ে দিন। আপনি যখন এই ফ্যাক্টরিটিকে আপনার নিয়ামকের মধ্যে পাস করেন তখন অবজেক্টের সেই বৈশিষ্ট্যগুলি এখন আপনার কারখানার মাধ্যমে সেই নিয়ামকটিতে উপলব্ধ।

app.controller('myFactoryCtrl', function($scope, myFactory){
  $scope.artist = myFactory.getArtist();
});

app.factory('myFactory', function(){
  var _artist = 'Shakira';
  var service = {};

  service.getArtist = function(){
    return _artist;
  }

  return service;
});


২) আপনি যখন পরিষেবাটি ব্যবহার করছেন তখন কৌণিক এটিকে 'নতুন' কীওয়ার্ড দিয়ে পর্দার আড়ালে ইনস্ট্যান্ট করে। তার কারণে, আপনি 'এটি'-তে বৈশিষ্ট্য যুক্ত করবেন এবং পরিষেবাটি' এটি 'ফেরত দেবে। আপনি যখন পরিষেবাটি আপনার নিয়ামকের মধ্যে পাস করেন, 'এই' এর এই বৈশিষ্ট্যগুলি এখন আপনার পরিষেবার মাধ্যমে সেই নিয়ামকটিতে উপলভ্য হবে।

app.controller('myServiceCtrl', function($scope, myService){
  $scope.artist = myService.getArtist();
});

app.service('myService', function(){
  var _artist = 'Nelly';
  this.getArtist = function(){
    return _artist;
  }
});



নন টিএল; ডিআর

1) কারখানা
কারখানাগুলি কোনও পরিষেবা তৈরি এবং কনফিগার করার সর্বাধিক জনপ্রিয় উপায়। টিএল যা বলেছিল তার চেয়ে সত্য আর কিছুই নেই; আপনি কেবল একটি অবজেক্ট তৈরি করুন, এতে বৈশিষ্ট্য যুক্ত করুন, তারপরে একই জিনিসটি ফিরিয়ে দিন। তারপরে আপনি যখন কারখানাটি আপনার নিয়ামকের মধ্যে পাস করবেন তখন অবজেক্টের সেই বৈশিষ্ট্যগুলি এখন আপনার কারখানার মাধ্যমে সেই নিয়ামকটিতে উপলব্ধ। আরও বিস্তৃত উদাহরণ নীচে।

app.factory('myFactory', function(){
  var service = {};
  return service;
});

এখন আমরা 'পরিষেবাদি'র সাথে সংযুক্ত থাকা যে কোনও বৈশিষ্ট্য আমাদের কন্ট্রোলারে' মাইফ্যাক্টরি 'পাস করার পরে আমাদের জন্য উপলব্ধ থাকবে।

এখন আমাদের কলব্যাক ফাংশনে কিছু 'প্রাইভেট' ভেরিয়েবল যুক্ত করা যাক। এগুলি সরাসরি নিয়ামকের কাছ থেকে অ্যাক্সেসযোগ্য হবে না, তবে আমরা প্রয়োজনে এই 'ব্যক্তিগত' ভেরিয়েবলগুলিকে পরিবর্তন করতে সক্ষম হতে শেষ পর্যন্ত 'পরিষেবা' তে কিছু গেটর / সেটার পদ্ধতি সেট করব।

app.factory('myFactory', function($http, $q){
  var service = {};
  var baseUrl = 'https://itunes.apple.com/search?term=';
  var _artist = '';
  var _finalUrl = '';

  var makeUrl = function(){
   _artist = _artist.split(' ').join('+');
    _finalUrl = baseUrl + _artist + '&callback=JSON_CALLBACK';
    return _finalUrl
  }

  return service;
});

এখানে আপনি লক্ষ্য করবেন যে আমরা সেই ভেরিয়েবলগুলি / ফাংশনটিকে 'পরিষেবার' সাথে সংযুক্ত করছি না। আমরা পরে এগুলি ব্যবহার বা সংশোধন করার জন্য কেবল এগুলি তৈরি করছি।

  • আইটিউনস এপিআই-র প্রয়োজনীয় বেস ইউআরএল API
  • _আর্টিস্ট হলেন সেই শিল্পী যা আমরা দেখতে চাই
  • _ফাইনাল ইউআরএল একটি চূড়ান্ত এবং সম্পূর্ণরূপে নির্মিত ইউআরএল যেখানে আমরা আইটিউনসকে কল করব মেকআরএল একটি ফাংশন যা আমাদের আইটিউনস বন্ধুত্বপূর্ণ ইউআরএল তৈরি এবং ফিরিয়ে আনবে।

এখন যেহেতু আমাদের সহায়ক / ব্যক্তিগত ভেরিয়েবল এবং ফাংশনটি রয়েছে, আসুন 'পরিষেবা' অবজেক্টে কিছু বৈশিষ্ট্য যুক্ত করুন। আমরা 'পরিষেবা' যাই থাকি না কেন আমরা যে কোনও নিয়ামককে 'মাই ফ্যাক্টরি' দিয়ে যাব আমরা সরাসরি ব্যবহার করতে সক্ষম হব।

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

নীচে সেটআর্টিস্ট একজন শিল্পীকে গ্রহণ করে এবং আপনাকে শিল্পী সেট করার অনুমতি দেয়। getArtist শিল্পী কলটিউনস ফিরিয়ে আনে প্রথমে আমরা আমাদের with http অনুরোধের সাথে ব্যবহার করব এমন ইউআরএল তৈরি করার জন্য মেকআরল () কল করে। তারপরে এটি একটি প্রতিশ্রুতি অবজেক্ট সেট আপ করে, আমাদের চূড়ান্ত ইউআরএল দিয়ে একটি request HTTP অনুরোধ করে, তারপরে যেহেতু $ http কোনও প্রতিশ্রুতি ফিরিয়ে দেয়, আমরা আমাদের অনুরোধের পরে .success বা .error কল করতে সক্ষম হয়েছি। তারপরে আমরা আইটিউনস ডেটা দিয়ে আমাদের প্রতিশ্রুতিটি সমাধান করি, বা আমরা 'একটি ত্রুটি হয়েছিল' এমন বার্তা দিয়ে তা প্রত্যাখ্যান করি।

app.factory('myFactory', function($http, $q){
  var service = {};
  var baseUrl = 'https://itunes.apple.com/search?term=';
  var _artist = '';
  var _finalUrl = '';

  var makeUrl = function(){
    _artist = _artist.split(' ').join('+');
    _finalUrl = baseUrl + _artist + '&callback=JSON_CALLBACK'
    return _finalUrl;
  }

  service.setArtist = function(artist){
    _artist = artist;
  }

  service.getArtist = function(){
    return _artist;
  }

  service.callItunes = function(){
    makeUrl();
    var deferred = $q.defer();
    $http({
      method: 'JSONP',
      url: _finalUrl
    }).success(function(data){
      deferred.resolve(data);
    }).error(function(){
      deferred.reject('There was an error')
    })
    return deferred.promise;
  }

  return service;
});

এখন আমাদের কারখানাটি সম্পূর্ণ। আমরা এখন যে কোনও কন্ট্রোলারে 'মাইফ্যাক্টরি' ইনজেক্ট করতে সক্ষম হয়েছি এবং তারপরে আমরা আমাদের পদ্ধতিগুলিকে কল করতে সক্ষম হব যা আমরা আমাদের পরিষেবা অবজেক্টের সাথে সংযুক্ত করেছি (সেটআর্টিস্ট, গেটআর্টিস্ট, এবং কলআইটিউনস)।

app.controller('myFactoryCtrl', function($scope, myFactory){
  $scope.data = {};
  $scope.updateArtist = function(){
    myFactory.setArtist($scope.data.artist);
  };

  $scope.submitArtist = function(){
    myFactory.callItunes()
      .then(function(data){
        $scope.data.artistData = data;
      }, function(data){
        alert(data);
      })
  }
});

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

2) পরিষেবা
কোনও পরিষেবা তৈরি করার সময় সবচেয়ে বড় জিনিসটি হ'ল এটি 'নতুন' কীওয়ার্ড দিয়ে ইনস্ট্যান্ট করা। আপনার জাভাস্ক্রিপ্ট গুরুগুলির জন্য এটি আপনাকে কোডের প্রকৃতির একটি বড় ইঙ্গিত দেবে। আপনারা জাভাস্ক্রিপ্টের সীমিত পটভূমিতে বা যারা 'নতুন' কীওয়ার্ডটি আসলে কী করেন তার সাথে খুব বেশি পরিচিত নন, তাদের জন্য কিছু জাভাস্ক্রিপ্ট মূলসূত্রগুলি পর্যালোচনা করুন যা পরিশেষে কোনও পরিষেবার প্রকৃতি বুঝতে আমাদের সহায়তা করবে।

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

প্রথমে আমাদের কনস্ট্রাক্টর তৈরি করা যাক।

var Person = function(name, age){
  this.name = name;
  this.age = age;
}

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

এখন আসুন আমরা আমাদের ব্যক্তির প্রোটোটাইপটিতে একটি পদ্ধতি যুক্ত করি যাতে এটি আমাদের ব্যক্তি 'শ্রেণি'র প্রতিটি উদাহরণে উপলব্ধ।

Person.prototype.sayName = function(){
  alert('My name is ' + this.name);
}

এখন, যেহেতু আমরা প্রোটোটাইপের উপর sayName ফাংশনটি রেখেছি, ততক্ষণ প্রতিটি ব্যক্তির সেই উদাহরণটির নাম সতর্কতার জন্য sayName ফাংশনটি কল করতে সক্ষম হবে।

এখন যেহেতু আমাদের পার্সোন কনস্ট্রাক্টর ফাংশন এবং এর প্রোটোটাইপে আমাদের sayName ফাংশন রয়েছে, আসুন প্রকৃতপক্ষে ব্যক্তির একটি উদাহরণ তৈরি করি তারপরে sayName ফাংশনটি কল করি।

var tyler = new Person('Tyler', 23);
tyler.sayName(); //alerts 'My name is Tyler'

সুতরাং সমস্ত একসাথে একজন ব্যক্তির কনস্ট্রাক্টর তৈরির জন্য কোড, এর প্রোটোটাইপটিতে একটি ফাংশন যুক্ত করে, একজন ব্যক্তি উদাহরণ তৈরি করে এবং তার প্রোটোটাইপে ফাংশনটি কল করার পরে এটি দেখতে এরকম দেখাচ্ছে।

var Person = function(name, age){
  this.name = name;
  this.age = age;
}
Person.prototype.sayName = function(){
  alert('My name is ' + this.name);
}
var tyler = new Person('Tyler', 23);
tyler.sayName(); //alerts 'My name is Tyler'

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

'নতুন' কীওয়ার্ডটি আসলে জাভাস্ক্রিপ্টে কী করছে সে সম্পর্কে আপনি কীভাবে ভাবতে পারেন তার নীচে কোডটি রয়েছে। এটি মূলত উপরের অনুচ্ছেদের একটি কোড উদাহরণ। আমি 'ইন্টারপ্রিটার ভিউ' বা নোটের ভিতরে দোভাষী যেভাবে কোডটি দেখি সেভাবে রেখেছি।

var Person = function(name, age){
  //The line below this creates an obj object that will delegate to the person's prototype on failed lookups.
  //var obj = Object.create(Person.prototype);

  //The line directly below this sets 'this' to the newly created object
  //this = obj;

  this.name = name;
  this.age = age;

  //return this;
}

জাভাস্ক্রিপ্টে 'নতুন' কীওয়ার্ডটি আসলে কী করে সে সম্পর্কে এই জ্ঞান থাকা, কৌণিকের মধ্যে একটি পরিষেবা তৈরি করা বোঝা সহজ হওয়া উচিত।

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

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

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

app.service('myService', function($http, $q){
  var baseUrl = 'https://itunes.apple.com/search?term=';
  var _artist = '';
  var _finalUrl = '';

  var makeUrl = function(){
    _artist = _artist.split(' ').join('+');
    _finalUrl = baseUrl + _artist + '&callback=JSON_CALLBACK'
    return _finalUrl;
  }
});

এখন, আমরা আমাদের সমস্ত পদ্ধতি যুক্ত করব যা আমাদের নিয়ামকটিতে 'এটি'র জন্য উপলব্ধ available

app.service('myService', function($http, $q){
  var baseUrl = 'https://itunes.apple.com/search?term=';
  var _artist = '';
  var _finalUrl = '';

  var makeUrl = function(){
    _artist = _artist.split(' ').join('+');
    _finalUrl = baseUrl + _artist + '&callback=JSON_CALLBACK'
    return _finalUrl;
  }

  this.setArtist = function(artist){
    _artist = artist;
  }

  this.getArtist = function(){
    return _artist;
  }

  this.callItunes = function(){
    makeUrl();
    var deferred = $q.defer();
    $http({
      method: 'JSONP',
      url: _finalUrl
    }).success(function(data){
      deferred.resolve(data);
    }).error(function(){
      deferred.reject('There was an error')
    })
    return deferred.promise;
  }

});

এখন ঠিক আমাদের কারখানার মতোই, সেটআর্টিস্ট, গেটআরটিস্ট, এবং কলআইটিউনস যে কোনও কন্ট্রোলারে আমরা মাই সার্ভিসটিতে যাব তা উপলব্ধ থাকবে। এখানে মাই সার্ভিস নিয়ন্ত্রক (যা আমাদের ফ্যাক্টরি নিয়ামকের মতো প্রায় একই)

app.controller('myServiceCtrl', function($scope, myService){
  $scope.data = {};
  $scope.updateArtist = function(){
    myService.setArtist($scope.data.artist);
  };

  $scope.submitArtist = function(){
    myService.callItunes()
      .then(function(data){
        $scope.data.artistData = data;
      }, function(data){
        alert(data);
      })
  }
});

আমি আগে যেমন উল্লেখ করেছি, একবার আপনি সত্যিই 'নতুন' কী করে তা বুঝতে পারার পরে, পরিষেবাগুলি অ্যাঙ্গুলারের কারখানার কাছে প্রায় অভিন্ন।


12
আপনি সরাসরি আপনার ব্লগে একটি লিঙ্ক সরবরাহ করতে চাইতে পারেন। tylermcginnis.com/angularjs-factory-vs-service-vs-provider আমি দেখতে পেলাম যে কিছুটা সহজ পড়া সহজ।
টাইলার কলিয়ের

3
এখানে আপনার ব্লগটি পুনরাবৃত্তি করার সাথে কোনও ভুল নেই, তবে আমি সম্মত হই যে এটি একটি গ্রেটা ব্লগ পোস্ট।
আর ক্লেভেন

5
প্রত্যেকে হুডের নীচে কী করে তার বিস্তৃত বিশদ বিবরণ, তবে কেন কেউ কখন কোনও কারখানার উপর পরিষেবা ব্যবহার করতে পছন্দ করবে তা এখনও পরিষ্কার নয়। অন্য কথায়, কখন আমি কোনও নতুন কারখানাটি বনাম তৈরির পছন্দ করব by আমি মনে করি এটিই সবচেয়ে বড় বিভ্রান্তি।
demisx

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

4
আমি মনে করি না যে এটি সঠিক, @ অজনিম। অন্যরা যেমন বলেছে, উভয়ই সিলেটলেট সরবরাহ করে।
ক্রিপ্টোভাইরাস

35

নাম ক্লু

পরিষেবা এবং কারখানাগুলি একে অপরের সাথে সমান। উভয়ই একটি একক বস্তু উত্পন্ন করবে যা অন্যান্য বস্তুগুলিতে ইনজেকশন করা যায়, এবং তাই প্রায়শই আন্তঃবিদেশীয়ভাবে ব্যবহৃত হয়।

এগুলি বিভিন্ন ডিজাইনের নিদর্শনগুলি প্রয়োগ করতে শব্দার্থভাবে ব্যবহার করার উদ্দেশ্যে।

পরিষেবাদি একটি পরিষেবা নিদর্শন বাস্তবায়নের জন্য

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

এটি কৌণিকর ক্ষেত্রে বিশেষত গুরুত্বপূর্ণ কারণ কৌণিক মডেলগুলি সাধারণত কোনও সার্ভার থেকে টানা জেএসএন বস্তু হয় এবং তাই আমাদের ব্যবসায়িক যুক্তি যুক্ত করার জন্য আমাদের কোথাও প্রয়োজন।

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

(function() {
  var base = "https://api.github.com";

  angular.module('github', [])
    .service('githubService', function( $http ) {
      this.getEvents: function() {
        var url = [
          base,
          '/events',
          '?callback=JSON_CALLBACK'
        ].join('');
        return $http.jsonp(url);
      }
    });
  )();

কারখানাগুলি একটি কারখানার প্যাটার্ন প্রয়োগ করে

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

angular.module('user', [])
  .factory('User', function($resource) {
    var url = 'http://simple-api.herokuapp.com/api/v1/authors/:id'
    return $resource(url);
  })

আমরা এটি এর মতো ব্যবহার করব:

angular.module('app', ['user'])
  .controller('authorController', function($scope, User) {
    $scope.user = new User();
  })

নোট করুন যে কারখানাগুলিও সিলেটলেটগুলি ফেরত দেয়।

কারখানাগুলি কোনও কনস্ট্রাক্টরকে ফিরিয়ে দিতে পারে

কারখানাটি কেবল কোনও বস্তুকে রিটার্ন দেয় তাই এটি উপরে যেমন আমরা দেখি তেমনি কোনও কনস্ট্রাক্টর ফাংশন সহ আপনার পছন্দ মতো যে কোনও বস্তুও ফিরে আসতে পারে।

কারখানাগুলি একটি বস্তু ফেরত দেয়; পরিষেবাদি নতুনযোগ্য

আর একটি প্রযুক্তিগত পার্থক্য হল পরিষেবা এবং কারখানাগুলি যেভাবে রচিত হয় in অবজেক্টটি তৈরি করতে একটি পরিষেবা ফাংশন নতুন করা হবে। একটি কারখানার ফাংশন ডাকা হবে এবং বস্তুটি ফিরিয়ে দেবে।

  • পরিষেবাগুলি নতুনযোগ্য নির্মাণকারী।
  • কারখানাগুলি সহজভাবে বলা হয় এবং কোনও বস্তু ফেরত দেয়।

এর অর্থ এই যে কোনও পরিষেবাতে আমরা "এটি" সংযোজন করি যা কোনও নির্মাণকারীর প্রসঙ্গে নির্মাণাধীন অবজেক্টটির দিকে নির্দেশ করে।

এটি চিত্রিত করার জন্য, এখানে পরিষেবা এবং কারখানা ব্যবহার করে তৈরি করা একই সাধারণ অবজেক্টটি রয়েছে:

angular.module('app', [])
  .service('helloService', function() {
    this.sayHello = function() {
      return "Hello!";
    }
  })
  .factory('helloFactory', function() {
    return {
      sayHello: function() {
        return "Hello!";
      }
    }
  });

2
দুর্দান্ত ব্যাখ্যা, আপনাকে ধন্যবাদ! কারখানার নমুনা কোডে একটি ধরণ রয়েছে যেখানে Authorইনজেক্টর প্যারামিটার হওয়া উচিত Person
মিখাইল-টি

ধন্যবাদ @ মিক-টি, আমি টাইপগুলি ঠিক করেছি।
সুপারলুমিনারি

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

27

এখানে সমস্ত উত্তরগুলি পরিষেবা এবং কারখানার চারপাশে বলে মনে হচ্ছে এবং এটি বৈধ যেহেতু এটি সম্পর্কে জিজ্ঞাসা করা হচ্ছিল। কিন্তু এটা সেখানে সহ বিভিন্ন অন্যদের আছে মনে রাখা গুরুত্বপূর্ণ provider(), value()এবং constant()

মনে রাখার মূল কথাটি হ'ল প্রত্যেকে একে অপরের একটি বিশেষ কেস। চেইনে প্রতিটি বিশেষ কেস আপনাকে কম কোড দিয়ে একই জিনিস করতে দেয়। প্রত্যেকের কিছু অতিরিক্ত সীমাবদ্ধতাও রয়েছে।

কোনটি কখন ব্যবহার করবেন তা সিদ্ধান্ত নেওয়ার জন্য আপনি কেবল দেখতে পাচ্ছেন কোনটি আপনাকে কম কোডে যা করতে চায় তা করতে দেয়। এগুলি দেখতে কতটা সাদৃশ্যপূর্ণ তা চিত্রিত করে এখানে একটি চিত্র রয়েছে:

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

ধাপে ভাঙ্গার সম্পূর্ণ পদক্ষেপ এবং কখন ব্যবহার করতে হবে তার দ্রুত রেফারেন্সের জন্য আপনি যে ব্লগ পোস্টটি থেকে এই চিত্রটি পেয়েছেন তা দেখতে যেতে পারেন:

http://www.simplygoodcode.com/2015/11/the-difference-between-service-provider-and-factory-in-angularjs/


3
@ জ্যাকব সম্ভবত তাই, তবে আমি মনে করি যে কেবলমাত্র প্রতিটি ব্যবহার করার সময় নয়, তবে সেগুলি একই জিনিসগুলির মূলত ভিন্নতা একটি গুরুত্বপূর্ণ বিষয়।
লুইস পেরেজ

1
@ লুইসপ্রেজ আপনার ব্লগের লিঙ্ক এবং ভিডিওটির পার্থক্য বোঝানো ভিডিওটি এটি দুর্দান্ত। ভিডিও থেকে এই উদাহরণগুলির সাথে বোঝা সহজ :) :)
অ্যালিন সিওকান

24

অ্যাপ.ফ্যাক্টরি ('fn', fn) বনাম app.service ('fn', fn)

নির্মাণ

কারখানাগুলির সাথে, কৌনিকটি ফলাফল পেতে অনুরোধ করবে। এটি ফলাফল যা ক্যাশেড এবং ইনজেকশনের হয়।

 //factory
 var obj = fn();
 return obj;

পরিষেবাদিগুলির সাথে, কৌনিক নতুন কল করে কনস্ট্রাক্টর ফাংশনটি শুরু করবে । নির্মিত ফাংশনটি ক্যাশেড এবং ইনজেকশন দেওয়া হয়।

  //service
  var obj = new fn();
  return obj;

বাস্তবায়ন

কারখানাগুলি সাধারণত কোনও অবজেক্টকে আক্ষরিক ফিরিয়ে দেয় কারণ রিটার্নের মানটি যা নিয়ামকগুলিতে চালিত হয়, ব্লকগুলি পরিচালনা করে, নির্দেশিকা ইত্যাদি etc

  app.factory('fn', function(){
         var foo = 0;
         var bar = 0;
         function setFoo(val) {
               foo = val;
         }
         function setBar (val){
               bar = val;
         }
         return {
                setFoo: setFoo,
                serBar: setBar
         }
  });

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

app.service('fn', function () {
         var foo = 0;
         var bar = 0;
         this.setFoo = function (val) {
               foo = val;
         }
         this.setBar = function (val){
               bar = val;
         }
});

উপসংহার

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

সুতরাং আপনি কোন পছন্দ করা উচিত? উভয়ই একটি - এগুলি এতটাই মিল যে পার্থক্যগুলি তুচ্ছ। আপনি যদি একে অপরকে বেছে নেন, কেবল সেগুলি কীভাবে তৈরি করা যায় তা সম্পর্কে সচেতন হন, যাতে আপনি এগুলি সঠিকভাবে প্রয়োগ করতে পারেন।


পরিষেবা ফাংশনগুলি "কোনও কিছু ফেরত দেয় না", তারা স্পষ্টভাবে নির্মিত বস্তুটি ফিরিয়ে দেয় যদি আপনি নিজের রিটার্নের বিবৃতি নির্দিষ্ট না করেন (পরবর্তী ক্ষেত্রে আপনি যে জিনিসটি ফিরে এসেছিলেন তা হ'ল যা তৈরি এবং ক্যাশে হবে, কোনও কারখানার মতো)।
ক্রিপ্টোভাইরাস

আমি মনে করি আপনি এটির ভুল ব্যাখ্যা করছেন ... আমি যখন ফিরে বলি, আমার অর্থ পরিষেবা ফাংশন বাস্তবায়ন থেকে দৃষ্টিকোণ থেকে
পিক্সেলবিট

আপনি কি নিশ্চিত যে কারখানাটিও একক শহর?
মার্টিয়ান2049

5

আমি কিছুটা সময় পার্থক্যটি সনাক্ত করার জন্য ব্যয় করেছি।

এবং আমি মনে করি কারখানা ফাংশনটি মডিউল প্যাটার্ন ব্যবহার করে এবং পরিষেবা ফাংশনটি স্ট্যান্ডার্ড জাভা স্ক্রিপ্ট কনস্ট্রাক্টর প্যাটার্ন ব্যবহার করে।


2

কারখানার প্যাটার্নটি আরও নমনীয় কারণ এটি ফাংশন এবং মান পাশাপাশি অবজেক্টগুলিকে ফিরিয়ে দিতে পারে।

সার্ভিস প্যাটার্ন আইএমএইচও-তে খুব একটা পয়েন্ট নেই, কারণ যা কিছু আপনি সহজেই কারখানার সাথে করতে পারেন। ব্যতিক্রমগুলি হতে পারে:

  • যদি আপনি কোনও কারণে আপনার তাত্ক্ষণিক পরিষেবাদির ঘোষিত প্রকারের বিষয়ে যত্নশীল হন - আপনি যদি পরিষেবা নিদর্শনটি ব্যবহার করেন তবে আপনার নির্মাতাটি নতুন পরিষেবার ধরণ হবে।
  • আপনার যদি ইতিমধ্যে কোনও কনস্ট্রাক্টর ফাংশন থাকে যা আপনি অন্য কোথাও ব্যবহার করছেন যা আপনিও পরিষেবা হিসাবে ব্যবহার করতে চান (যদিও এটিতে কোনও কিছু ইনজেক্ট করতে চাইলে সম্ভবত খুব বেশি ব্যবহার করা যায় না!)।

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


কারখানাগুলি তুলনামূলকভাবে ব্যয়বহুল ক্লোজার ব্যবহার করে এবং পরিষেবাগুলি (ক্লাস) প্রোটোটাইপের সুবিধা নিতে পারে বলে কারখানাগুলি কারখানার চেয়ে বেশি নির্মাণের জন্য দক্ষ।
জ্যাকব

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

function MyFactory(dep1) { var $$foo = 'bar', factory = {}; Object.defineProperties(factory.prototype, { foo: { value: $$foo } }); return factory; } function MyService(dep1) { var $$foo = 'bar'; Object.defineProperties(MyService.prototype, { foo: { value: $$foo } }); } মাইফ্যাক্টরি এবং মাই সার্ভিস উভয়ই প্রোটোটাইপ ব্যবহার করে, মাইফ্যাক্টরি এখনও প্রত্যাশিত বস্তুটি তৈরি করতে পারফরম্যান্স হিট নেয়। উভয় উদাহরণে, তাদের ব্যক্তিগত রয়েছে, কিন্তু মাই সার্ভিসে তুলনামূলকভাবে পারফরম্যান্সের কোনও পার্থক্য নেই।
জ্যাকব

1
আমার জন্য পার্থক্যটি হ'ল আমি কোনও পদ্ধতি ছাড়াই সরাসরি কারখানাটি ব্যবহার করতে চাই: MyFactory(someArgument)(প্রাক্তন $http())। এটা একটা সেবা আপনি কন্সট্রাকটর উল্লেখ করা চাই হিসাবে সম্ভব নয়: MyService(someArgument)
জ্যাকব

অবজেক্ট নির্মাণের সময়, আমি সত্যিই দেখতে পাই না যে ফ্যাক্টরি = {a কীভাবে পারফরম্যান্স হিট হয়, যখন জাভা স্ক্রিপ্ট আপনার কনস্ট্রাক্টরকে ফোন করে আপনার জন্য "এটি" শুরু করে? এবং আমি মনে করি যে বৃহত্তর পারফরম্যান্স হিটটি কৌণিক দিকের দিকে রয়েছে যখন এটি আপনার নির্মাতাকে কোনও কারখানায় আবৃত করে এবং "নতুন" অনুকরণ করতে হুপের মধ্য দিয়ে ঝাঁপিয়ে পড়ে যাতে এটি আপনার নির্ভরতা ইনজেক্ট করতে পারে।
ড্যান কিং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.