मुझे यकीन नहीं है कि कौन सा डिज़ाइन पैटर्न मुझे इस मुद्दे को हल करने में मदद कर सकता है।
मेरे पास एक वर्ग है, 'कोऑर्डिनेटर', जो यह निर्धारित करता है कि किस वर्कर क्लास का उपयोग किया जाना चाहिए - बिना सभी विभिन्न प्रकार के वर्कर्स के बारे में जाने बिना - यह सिर्फ एक वर्करफैक्ट को बुलाता है और आम IWorker इंटरफ़ेस पर कार्य करता है।
तब यह काम करने के लिए उपयुक्त वर्कर को सेट करता है और अपनी 'DoWork' पद्धति का परिणाम देता है।
यह ठीक रहा ... अब तक; हमारे पास एक नए वर्कर वर्ग के लिए एक नई आवश्यकता है, "वर्करबी" जिसके लिए अपने काम को करने के लिए अतिरिक्त मात्रा में जानकारी यानी अतिरिक्त इनपुट पैरामीटर की आवश्यकता होती है।
इसकी तरह हमें अतिरिक्त इनपुट पैरामीटर के साथ एक अधिभार DoWork विधि की आवश्यकता है ... लेकिन फिर सभी मौजूदा श्रमिकों को उस पद्धति को लागू करना होगा - जो गलत लगता है क्योंकि उन श्रमिकों को वास्तव में उस पद्धति की आवश्यकता नहीं है।
मैं इसे कैसे समन्वयक कर सकता हूं कि कोऑर्डिनेटर को इस बात से अनभिज्ञ रखा जाए कि किस वर्कर का उपयोग किया जा रहा है और फिर भी प्रत्येक वर्कर को यह जानकारी प्राप्त करने की अनुमति है कि उसे अपना काम करने की आवश्यकता है लेकिन किसी भी वर्कर को ऐसी चीजें करने की आवश्यकता नहीं है जो उसे करने की आवश्यकता नहीं है?
बहुत सारे मौजूदा वर्कर पहले से हैं।
मैं नए वर्करबी वर्ग की आवश्यकताओं को समायोजित करने के लिए किसी भी मौजूदा कंक्रीट वर्कर को बदलना नहीं चाहता।
मैंने सोचा कि शायद एक डेकोरेटर पैटर्न यहाँ अच्छा होगा, लेकिन मैंने किसी भी डेकोरेटर्स को एक वस्तु को एक ही विधि से सजाने के लिए नहीं देखा है, लेकिन इससे पहले विभिन्न मापदंडों ...
कोड में स्थिति:
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 से अनुरोध करना है? इससे बेहतर समाधान निकल सकता है।
IWorker
इंटरफ़ेस पुराने संस्करण को सूचीबद्ध करता है, या यह है कि एक जोड़ा पैरामीटर के साथ एक नया संस्करण?