मेरे वर्तमान कार्य में कुछ बहुत कुछ सामने आता है, एक सामान्यीकृत प्रक्रिया है जिसे होने की आवश्यकता है, लेकिन फिर उस प्रक्रिया के विषम हिस्से को एक निश्चित चर के मूल्य के आधार पर थोड़ा अलग होना चाहिए, और मैं नहीं यकीन है कि यह संभालने का सबसे सुंदर तरीका क्या है।
हम उस उदाहरण का उपयोग करेंगे जो हमारे पास आमतौर पर है, जो हम जिस देश के साथ काम कर रहे हैं, उसके आधार पर कुछ अलग तरह से कर रहे हैं।
तो मेरे पास एक वर्ग है, चलो इसे कॉल करें Processor:
public class Processor
{
public string Process(string country, string text)
{
text.Capitalise();
text.RemovePunctuation();
text.Replace("é", "e");
var split = text.Split(",");
string.Join("|", split);
}
}
सिवाय इसके कि उन कुछ कार्यों के लिए कुछ देशों को ही होना चाहिए। उदाहरण के लिए, केवल 6 देशों को पूंजीकरण कदम की आवश्यकता है। देश के आधार पर विभाजन का चरित्र बदल सकता है। उच्चारण की जगह 'e'केवल देश के आधार पर आवश्यक हो सकती है।
जाहिर है आप इसे कुछ इस तरह से हल कर सकते हैं:
public string Process(string country, string text)
{
if (country == "USA" || country == "GBR")
{
text.Capitalise();
}
if (country == "DEU")
{
text.RemovePunctuation();
}
if (country != "FRA")
{
text.Replace("é", "e");
}
var separator = DetermineSeparator(country);
var split = text.Split(separator);
string.Join("|", split);
}
लेकिन जब आप दुनिया के सभी संभावित देशों के साथ काम कर रहे होते हैं, तो यह बहुत बोझिल हो जाता है। और इसकी परवाह किए बिना, ifवक्तव्य तर्क को पढ़ने में कठिन बनाते हैं (कम से कम, यदि आप उदाहरण से अधिक जटिल विधि की कल्पना करते हैं), और चक्रीय जटिलता बहुत तेजी से रेंगना शुरू कर देती है।
इसलिए फिलहाल मैं कुछ ऐसा करने की कोशिश कर रहा हूं:
public class Processor
{
CountrySpecificHandlerFactory handlerFactory;
public Processor(CountrySpecificHandlerFactory handlerFactory)
{
this.handlerFactory = handlerFactory;
}
public string Process(string country, string text)
{
var handlers = this.handlerFactory.CreateHandlers(country);
handlers.Capitalier.Capitalise(text);
handlers.PunctuationHandler.RemovePunctuation(text);
handlers.SpecialCharacterHandler.ReplaceSpecialCharacters(text);
var separator = handlers.SeparatorHandler.DetermineSeparator();
var split = text.Split(separator);
string.Join("|", split);
}
}
हैंडलर:
public class CountrySpecificHandlerFactory
{
private static IDictionary<string, ICapitaliser> capitaliserDictionary
= new Dictionary<string, ICapitaliser>
{
{ "USA", new Capitaliser() },
{ "GBR", new Capitaliser() },
{ "FRA", new ThingThatDoesNotCapitaliseButImplementsICapitaliser() },
{ "DEU", new ThingThatDoesNotCapitaliseButImplementsICapitaliser() },
};
// Imagine the other dictionaries like this...
public CreateHandlers(string country)
{
return new CountrySpecificHandlers
{
Capitaliser = capitaliserDictionary[country],
PunctuationHanlder = punctuationDictionary[country],
// etc...
};
}
}
public class CountrySpecificHandlers
{
public ICapitaliser Capitaliser { get; private set; }
public IPunctuationHanlder PunctuationHanlder { get; private set; }
public ISpecialCharacterHandler SpecialCharacterHandler { get; private set; }
public ISeparatorHandler SeparatorHandler { get; private set; }
}
जो समान रूप से मुझे यकीन नहीं है कि मुझे पसंद है। तर्क अभी भी कुछ हद तक कारखाने के निर्माण से अस्पष्ट है और आप मूल विधि को नहीं देख सकते हैं और उदाहरण के लिए "GBR" प्रक्रिया निष्पादित होने पर क्या होता है। आप शैली GbrPunctuationHandler, UsaPunctuationHandlerआदि में बहुत सारी कक्षाएं (इससे अधिक जटिल उदाहरणों में) बनाते हैं , आदि ... जिसका अर्थ है कि आपको विराम चिह्न के दौरान होने वाले सभी संभावित कार्यों का पता लगाने के लिए कई अलग-अलग वर्गों को देखना होगा। हैंडलिंग। स्पष्ट रूप से मैं एक विशाल वर्ग को एक बिलियन ifस्टेटमेंट के साथ नहीं चाहता , लेकिन समान रूप से 20 अलग-अलग तर्क वाले वर्ग भी क्लंकी महसूस करते हैं।
मूल रूप से मुझे लगता है कि मैं अपने आप को OOP गाँठ के कुछ प्रकार में ले आया हूँ और इसे अछूता करने का एक अच्छा तरीका नहीं जानता। मैं सोच रहा था कि क्या इस तरह की प्रक्रिया से मदद मिलेगी?
if (country == "DEU")आप के बजाय जाँच करें if (config.ShouldRemovePunctuation)।
countryएक स्ट्रिंग क्यों है ?
PreProcessकार्यक्षमता है, जिसे कुछ देशों के आधार पर अलग-अलग लागू किया जा सकता है,DetermineSeparatorउन सभी के लिए हो सकता है, और एPostProcess। उनमें से सभीprotected virtual voidएक डिफ़ॉल्ट कार्यान्वयन के साथ हो सकते हैं , और फिर आपProcessorsप्रति देश के लिए विशिष्ट हो सकते हैं