সম্প্রতি আমি সার্ভিস লোকেটার বিরোধী- নিদর্শন সম্পর্কে মার্ক সিম্যানের নিবন্ধটি পড়েছি ।
সার্ভিস লোকেটারকে একটি বিরোধী-নিদর্শন বলে দুটি মূল কারণ লেখক নির্দেশ করেছেন:
এপিআই ব্যবহারের সমস্যা (যার সাথে আমি পুরোপুরি ঠিক আছি)
ক্লাস যখন কোনও সার্ভিস লোকেটার নিযুক্ত করে তখন এর নির্ভরতাগুলি দেখা খুব কঠিন কারণ বেশিরভাগ ক্ষেত্রে ক্লাসে কেবলমাত্র একটি প্যারামিটারলেস নির্মাতা থাকে। সার্ভিস লোকেটারের বিপরীতে, ডিআই পদ্ধতির মাধ্যমে নির্মাতার প্যারামিটারগুলির মাধ্যমে স্পষ্টভাবে নির্ভরতা প্রকাশ করা হয় যাতে ইনটেলিসেন্সে নির্ভরতা সহজভাবে দেখা যায়।রক্ষণাবেক্ষণের সমস্যা (যা আমাকে ধাঁধা দেয়)
নীচের উদাহরণটি বিবেচনা করুন
আমাদের কাছে একটি ক্লাস 'মাইটাইপ' রয়েছে যা পরিষেবা লোকেটার পদ্ধতির নিয়োগ করে:
public class MyType
{
public void MyMethod()
{
var dep1 = Locator.Resolve<IDep1>();
dep1.DoSomething();
}
}
এখন আমরা ক্লাস 'মাইটাইপ' এর সাথে আরেকটি নির্ভরতা যুক্ত করতে চাই
public class MyType
{
public void MyMethod()
{
var dep1 = Locator.Resolve<IDep1>();
dep1.DoSomething();
// new dependency
var dep2 = Locator.Resolve<IDep2>();
dep2.DoSomething();
}
}
এবং এখানেই আমার ভুল বোঝাবুঝি শুরু হয়। লেখক বলেছেন:
আপনি একটি ব্রেকিং প্রবর্তন করছেন কিনা তা বলা অনেক শক্ত হয়ে যায়। সার্ভিস লোকেটারটি ব্যবহার করা হচ্ছে এমন সম্পূর্ণ অ্যাপ্লিকেশনটি আপনাকে বুঝতে হবে এবং সংকলক আপনাকে সাহায্য করবে না।
তবে এক সেকেন্ড অপেক্ষা করুন, আমরা যদি ডিআই পন্থাটি ব্যবহার করতাম তবে আমরা কনস্ট্রাক্টর (কনস্ট্রাক্টর ইনজেকশনের ক্ষেত্রে) অন্য একটি প্যারামিটারের সাথে নির্ভরতা প্রবর্তন করব। এবং সমস্যা এখনও থাকবে। আমরা যদি সার্ভিস লোকেশন সেটআপ করতে ভুলে যেতে পারি, তবে আমরা আমাদের আইওসি ধারকটিতে একটি নতুন ম্যাপিং যুক্ত করতে ভুলে যেতে পারি এবং ডিআই পদ্ধতির একই রানটাইম সমস্যা হতে পারে।
এছাড়াও, ইউনিট পরীক্ষার অসুবিধা সম্পর্কে লেখক উল্লেখ করেছেন। কিন্তু, আমাদের ডিআই পদ্ধতির সাথে সমস্যা হবে না? যে শ্রেণিটি তাত্ক্ষণিকভাবে চালিত হয়েছিল সে সমস্ত পরীক্ষা আমাদের আপডেট করার দরকার নেই? কেবলমাত্র আমাদের পরীক্ষার সংকলনযোগ্য করার জন্য আমরা তাদেরকে একটি নতুন বিদ্রূপযুক্ত নির্ভরতা পাস করার জন্য আপডেট করব। এবং আমি আপডেট এবং সময় ব্যয় থেকে কোনও সুবিধা দেখতে পাচ্ছি না।
আমি সার্ভিস লোকেটার পদ্ধতির প্রতিরক্ষা করার চেষ্টা করছি না। তবে এই ভুল বোঝাবুঝি আমাকে ভাবায় যে আমি খুব গুরুত্বপূর্ণ কিছু হারাচ্ছি। কেউ কি আমার সন্দেহ দূর করতে পারে?
আপডেট (সংক্ষিপ্ত):
আমার প্রশ্নের উত্তর "ইস সার্ভিস লোকেটার একটি অ্যান্টি-প্যাটার্ন" আসলে পরিস্থিতিগুলির উপর নির্ভর করে। এবং আমি অবশ্যই আপনার সরঞ্জাম তালিকা থেকে এটি অতিক্রম করার পরামর্শ দেব না। আপনি যখন লিগ্যাসি কোড নিয়ে কাজ শুরু করেন তখন এটি খুব সহজ হয়ে যায়। আপনি যদি আপনার প্রকল্পের একেবারে প্রথম দিকে পর্যাপ্ত ভাগ্যবান হন তবে ডিআই পদ্ধতির আরও ভাল পছন্দ হতে পারে কারণ এর সাথে সার্ভিস লোকেটারের কিছু সুবিধা রয়েছে।
এবং এখানে মূল পার্থক্য রয়েছে যা আমার নতুন প্রকল্পগুলির জন্য পরিষেবা লোকেটারটি ব্যবহার না করার জন্য আমাকে নিশ্চিত করেছিল:
- সর্বাধিক সুস্পষ্ট এবং গুরুত্বপূর্ণ: পরিষেবা লোকেটার শ্রেণি নির্ভরতা লুকায়
- আপনি যদি কিছু আইওসি পাত্রে ব্যবহার করছেন তবে এটি সম্ভবত সমস্ত নির্ভরতা যাচাই করার জন্য প্রারম্ভকালে সমস্ত কন্সট্রাক্টর স্ক্যান করবে এবং অনুপস্থিত ম্যাপিংগুলি (বা ভুল কনফিগারেশন) সম্পর্কে তাত্ক্ষণিক প্রতিক্রিয়া জানাবে; আপনি যদি নিজের আইওসি পাত্রে পরিষেবা লোকেটার হিসাবে ব্যবহার করেন তবে এটি সম্ভব নয়
বিস্তারিত জানার জন্য নীচে দেওয়া দুর্দান্ত উত্তরগুলি পড়ুন।