আমি নিশ্চিত না কোন ডিজাইনের প্যাটার্নটি আমাকে এই সমস্যাটি সমাধান করতে সহায়তা করতে পারে।
আমার একটি 'কোর্ডিনেটর' শ্রেণি রয়েছে যা নির্ধারণ করে যে কোন শ্রমিক শ্রেণিটি ব্যবহার করা উচিত - সেখানে কর্মরত বিভিন্ন ধরণের শ্রমিকদের সম্পর্কে না জেনে - এটি কেবল একটি ওয়ার্কারফ্যাক্টরি কল করে এবং সাধারণ আই ওয়ার্কার ইন্টারফেসে কাজ করে।
এরপরে এটি উপযুক্ত কর্মীকে কাজ করার জন্য সেট করে এবং তার 'ডুওর্ক' পদ্ধতির ফলাফল প্রদান করে।
এটা ঠিক আছে ... এখনও অবধি; আমাদের একটি নতুন ওয়ার্কার ক্লাস, "ওয়ার্কারবি" এর জন্য একটি নতুন প্রয়োজনীয়তা রয়েছে যার জন্য এটির কাজটি করার জন্য অতিরিক্ত পরিমাণে অর্থাত একটি অতিরিক্ত ইনপুট প্যারামিটার প্রয়োজন।
এটির মতো আমাদের অতিরিক্ত ইনপুট প্যারামিটার সহ একটি ওভারলোডেড ডওওয়ার্ক পদ্ধতি প্রয়োজন ... তবে তারপরে সমস্ত বিদ্যমান কর্মীদের সেই পদ্ধতিটি প্রয়োগ করতে হবে - যা সত্য বলে মনে হয় যে এই শ্রমিকরা সত্যই সেই পদ্ধতির দরকার নেই।
সমন্বয়কারীকে কোন কর্মী ব্যবহার করা হচ্ছে সে সম্পর্কে অবহিত রাখার জন্য এবং এখনও প্রতিটি কর্মীকে তার কাজ করার জন্য প্রয়োজনীয় তথ্যের জন্য অনুমতি দেওয়া হলেও কোনও কর্মী যাতে তার প্রয়োজন হয় না এমন কাজ করতে না পারে সেজন্য আমি কীভাবে এটি রিফ্যাক্টর করতে পারি?
ইতিমধ্যে প্রচুর বিদ্যমান শ্রমিক রয়েছে।
নতুন ওয়ার্কারবি বর্গের প্রয়োজনীয়তা মিটানোর জন্য আমি বিদ্যমান কংক্রিট শ্রমিকদের কোনও পরিবর্তন করতে চাই না।
আমি ভেবেছিলাম সম্ভবত এখানে একটি ডেকোরেটর প্যাটার্ন ভাল হবে তবে আমি কোনও সাজসজ্জনকারী একই পদ্ধতি নয় তবে এর আগে বিভিন্ন পরামিতিগুলির সাথে কোনও জিনিস সাজাইতে দেখিনি ...
কোডের অবস্থা:
public class Coordinator
{
public string GetWorkerResult(string workerName, int a, List<int> b, string c)
{
var workerFactor = new WorkerFactory();
var worker = workerFactor.GetWorker(workerName);
if(worker!=null)
return worker.DoWork(a, b);
else
return string.Empty;
}
}
public class WorkerFactory
{
public IWorker GetWorker(string workerName)
{
switch (workerName)
{
case "WorkerA":
return new ConcreteWorkerA();
case "WorkerB":
return new ConcreteWorkerB();
default:
return null;
}
}
}
public interface IWorker
{
string DoWork(int a, List<int> b);
}
public class ConcreteWorkerA : IWorker
{
public string DoWork(int a, List<int> b)
{
// does the required work
return "some A worker result";
}
}
public class ConcreteWorkerB : IWorker
{
public string DoWork(int a, List<int> b, string c)
{
// does some different work based on the value of 'c'
return "some B worker result";
}
public string DoWork(int a, List<int> b)
{
// this method isn't really relevant to WorkerB as it is missing variable 'c'
return "some B worker result";
}
}
Coordinatorইতিমধ্যে তার অতিরিক্ত GetWorkerResultক্রিয়াকলাপটির অতিরিক্ত পরামিতিগুলিকে সমন্বিত করতে পরিবর্তন করতে হয়েছিল - এর অর্থ হল যে সলাইডের ওপেন-ক্লোজড-নীতি লঙ্ঘন করা হয়েছে। ফলস্বরূপ, সমস্ত কোড কলিংও Coordinator.GetWorkerResultপরিবর্তন করতে হয়েছিল। সুতরাং যে জায়গাতে আপনি সেই ফাংশনটি বলছেন সেই জায়গার দিকে তাকান: কোন আইওয়ার্কারকে অনুরোধ করবেন তা আপনি কীভাবে সিদ্ধান্ত নেবেন? এটি আরও ভাল সমাধানের দিকে নিয়ে যেতে পারে।
IWorkerইন্টারফেসটি কি পুরানো সংস্করণটি তালিকাভুক্ত করেছে, বা এটি যুক্ত পরামিতি সহ নতুন সংস্করণ?