আমার বর্তমান কাজটিতে বেশ কিছু যা আসে তা হ'ল একটি সাধারণীকরণ প্রক্রিয়া রয়েছে যা হওয়া দরকার, তবে তারপরে সেই প্রক্রিয়ার অদ্ভুত অংশটি একটি নির্দিষ্ট ভেরিয়েবলের মানের উপর নির্ভর করে কিছুটা ভিন্নভাবে ঘটে যাওয়া দরকার, এবং আমি না এটি হ্যান্ডেল করার জন্য সবচেয়ে মার্জিত উপায় কী তা নিশ্চিত।
আমি সাধারণত আমাদের যে উদাহরণটি ব্যবহার করব, যা আমরা আচরণ করছি সেই দেশের উপর নির্ভর করে কিছুটা ভিন্নভাবে ঘটছে।
সুতরাং আমার একটি ক্লাস আছে, আসুন এটি কল করুন 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; }
}
যা সমানভাবে আমি সত্যই পছন্দ করি না। কারখানা তৈরির সমস্ত দ্বারা যুক্তিটি এখনও কিছুটা অস্পষ্ট হয়ে গেছে এবং আপনি কেবল মূল পদ্ধতিটি দেখতে পারবেন না এবং উদাহরণস্বরূপ, "জিবিআর" প্রক্রিয়া কার্যকর হলে কী ঘটে তা দেখতে পারবেন না। এছাড়াও আপনি শৈলী (এই তুলনায় আরো জটিল উদাহরণ মধ্যে) শ্রেণীর অনেকটা তৈরি শেষ GbrPunctuationHandler
, UsaPunctuationHandler
, ইত্যাদি ... যা উপায়ে আপনি সম্ভব যে সমস্ত কর্ম যতিচিহ্ন সময় ঘটতে পারে সব জিনিসটা বিভিন্ন শ্রেণীর তাকান আছে হ্যান্ডলিং। স্পষ্টতই আমি এক বিলিয়ন if
বিবৃতি সহ একটি দানবীয় শ্রেণি চাই না , তবে সামান্য বিবিধ যুক্তিযুক্ত সমানভাবে 20 টি ক্লাসকেও আড়ষ্ট মনে হয়।
মূলত আমার মনে হয় আমি নিজেকে কিছুটা ওওপি গিঁটে পেয়েছি এবং এটিকে আঁকানোর কোনও ভাল উপায় খুব বেশি জানি না। আমি ভাবছিলাম যদি সেখানে কোনও প্যাটার্ন রয়েছে যা এই ধরণের প্রক্রিয়াটিতে সহায়তা করবে?
if (country == "DEU")
আপনি পরীক্ষা করুন if (config.ShouldRemovePunctuation)
।
country
একটি স্ট্রিং বদলে একটি বর্গ যে মডেল ঐ অপশনের একটি দৃষ্টান্ত?
PreProcess
কার্যকারিতা রয়েছে, যা কয়েকটি দেশের উপর ভিত্তি করে ভিন্নভাবে প্রয়োগ করা যেতে পারে, সেগুলিরDetermineSeparator
জন্য সেখানে থাকতে পারে, এবং কPostProcess
।protected virtual void
Processors