অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং - কোনও চলকের উপর নির্ভর করে কিছুটা পৃথক হওয়া প্রক্রিয়াগুলিতে সদৃশতা এড়াতে কীভাবে


64

আমার বর্তমান কাজটিতে বেশ কিছু যা আসে তা হ'ল একটি সাধারণীকরণ প্রক্রিয়া রয়েছে যা হওয়া দরকার, তবে তারপরে সেই প্রক্রিয়ার অদ্ভুত অংশটি একটি নির্দিষ্ট ভেরিয়েবলের মানের উপর নির্ভর করে কিছুটা ভিন্নভাবে ঘটে যাওয়া দরকার, এবং আমি না এটি হ্যান্ডেল করার জন্য সবচেয়ে মার্জিত উপায় কী তা নিশ্চিত।

আমি সাধারণত আমাদের যে উদাহরণটি ব্যবহার করব, যা আমরা আচরণ করছি সেই দেশের উপর নির্ভর করে কিছুটা ভিন্নভাবে ঘটছে।

সুতরাং আমার একটি ক্লাস আছে, আসুন এটি কল করুন 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 টি ক্লাসকেও আড়ষ্ট মনে হয়।

মূলত আমার মনে হয় আমি নিজেকে কিছুটা ওওপি গিঁটে পেয়েছি এবং এটিকে আঁকানোর কোনও ভাল উপায় খুব বেশি জানি না। আমি ভাবছিলাম যদি সেখানে কোনও প্যাটার্ন রয়েছে যা এই ধরণের প্রক্রিয়াটিতে সহায়তা করবে?


দেখে মনে হচ্ছে আপনার কোনও PreProcessকার্যকারিতা রয়েছে, যা কয়েকটি দেশের উপর ভিত্তি করে ভিন্নভাবে প্রয়োগ করা যেতে পারে, সেগুলির DetermineSeparatorজন্য সেখানে থাকতে পারে, এবং ক PostProcessprotected virtual voidProcessors
এগুলির সবগুলিই

আপনার কাজ হ'ল নির্দিষ্ট সময়সীমার এমন কিছু তৈরি করা যা কাজ করে এবং আপনি বা অন্য কারও দ্বারা প্রত্যাশিত ভবিষ্যতে বজায় রাখা যায়। যদি বেশ কয়েকটি বিকল্প উভয় শর্ত পূরণ করতে পারে তবে আপনার পছন্দ অনুযায়ী আপনি সেগুলির মধ্যে যে কোনও একটি চয়ন করতে পারেন free
ডায়ালেক্টিকাস

2
আপনার জন্য একটি কার্যকর বিকল্প হ'ল একটি কনফিগারেশন। সুতরাং আপনার কোডে আপনি নির্দিষ্ট দেশের জন্য যাচাই করেন না, তবে নির্দিষ্ট কনফিগারেশন বিকল্পের জন্য। তবে প্রতিটি দেশে এই কনফিগারেশন বিকল্পগুলির একটি নির্দিষ্ট সেট থাকবে। উদাহরণস্বরূপ if (country == "DEU")আপনি পরীক্ষা করুন if (config.ShouldRemovePunctuation)
ডায়ালেক্টিকাস

11
দেশ বিভিন্ন অপশন থাকে, তাহলে কেন countryএকটি স্ট্রিং বদলে একটি বর্গ যে মডেল ঐ অপশনের একটি দৃষ্টান্ত?
দামিয়েন_ও_বিশ্বাসীরা

@ ডামিয়েন_সে_ অবিশ্বাসী - আপনি কি এই বিষয়ে কিছুটা ব্যাখ্যা করতে পারেন? রবার্ট ব্র্যাটিগামের উত্তর কি আপনার প্রস্তাবের লাইনের সাথে রয়েছে? - আহ এখন আপনার উত্তর দেখতে পারে, ধন্যবাদ!
জন ডারভিল

উত্তর:


53

আমি এক ক্লাসে সমস্ত অপশনকে আবদ্ধ করার পরামর্শ দেব:

public class ProcessOptions
{
  public bool Capitalise { get; set; }
  public bool RemovePunctuation { get; set; }
  public bool Replace { get; set; }
  public char ReplaceChar { get; set; }
  public char ReplacementChar { get; set; }
  public char JoinChar { get; set; }
  public char SplitChar { get; set; }
}

এবং Processপদ্ধতিতে এটি পাস :

public string Process(ProcessOptions options, string text)
{
  if(options.Capitalise)
    text.Capitalise();

  if(options.RemovePunctuation)
    text.RemovePunctuation();

  if(options.Replace)
    text.Replace(options.ReplaceChar, options.ReplacementChar);

  var split = text.Split(options.SplitChar);

  string.Join(options.JoinChar, split);
}

4
নিশ্চিত না কেন এ দিকে ঝাঁপ দেওয়ার আগে কেন এমন কিছু করার চেষ্টা করা CountrySpecificHandlerFactoryহয়নি
মাতেন উলহাক

যতক্ষণ না খুব বেশি বিশেষায়িত বিকল্প রয়েছে, আমি অবশ্যই এই পথে যাব। যদি বিকল্পগুলি পাঠ্য-ফাইলে সিরিয়ালাইজ করা হয় তবে এটি অ-প্রোগ্রামারগুলিকে অ্যাপ্লিকেশন পরিবর্তন করার প্রয়োজন ছাড়াই নতুন রূপগুলি সংজ্ঞায়িত করতে / বিদ্যমানগুলি আপডেট করার অনুমতি দেয়।
টম

4
এটি public class ProcessOptionsসত্যই হওয়া উচিত [Flags] enum class ProcessOptions : int { ... }...
মাতাল কোড বানর

এবং আমি অনুমান করি তাদের যদি প্রয়োজন হয় তবে তাদের কাছে দেশগুলির মানচিত্র থাকতে পারে ProcessOptions। খুব সুবিধাজনক.
theonlygusti

24

.NET ফ্রেমওয়ার্ক যখন এই ধরণের সমস্যাগুলি পরিচালনা করতে প্রস্তুত হয় তখন এটি সবকিছুকে মডেল করে নি string। সুতরাং আপনি উদাহরণস্বরূপ, CultureInfoক্লাস আছে :

নির্দিষ্ট সংস্কৃতি সম্পর্কিত তথ্য সরবরাহ করে (নিয়ন্ত্রণহীন কোড বিকাশের জন্য স্থানীয় বলা হয়)। তথ্যটিতে সংস্কৃতি, লেখার ব্যবস্থা, ব্যবহৃত ক্যালেন্ডার, স্ট্রিংগুলির ক্রম ক্রম এবং তারিখ এবং সংখ্যার জন্য বিন্যাস অন্তর্ভুক্ত রয়েছে।

এখন, এই শ্রেণিতে আপনার প্রয়োজনীয় সুনির্দিষ্ট বৈশিষ্ট্য নাও থাকতে পারে তবে আপনি স্পষ্টতই সাদৃশ্যপূর্ণ কিছু তৈরি করতে পারেন। এবং তারপরে আপনি আপনার Processপদ্ধতিটি পরিবর্তন করুন :

public string Process(CountryInfo country, string text)

আপনার CountryInfoক্লাসে এরপরে কোনও bool RequiresCapitalizationসম্পত্তি ইত্যাদি থাকতে পারে যা আপনার Processপদ্ধতিটিকে যথাযথভাবে প্রক্রিয়াজাত করতে সাহায্য করে ।


13

আপনি Processorপ্রতি দেশ এক হতে পারে ?

public class FrProcessor : Processor {
    protected override string Separator => ".";

    protected override string ProcessSpecific(string text) {
        return text.Replace("é", "e");
    }
}

public class UsaProcessor : Processor {
    protected override string Separator => ",";

    protected override string ProcessSpecific(string text) {
        return text.Capitalise().RemovePunctuation();
    }
}

প্রক্রিয়াজাতকরণের সাধারণ অংশগুলি পরিচালনা করতে একটি বেস ক্লাস:

public abstract class Processor {
    protected abstract string Separator { get; }

    protected virtual string ProcessSpecific(string text) { }

    private string ProcessCommon(string text) {
        var split = text.Split(Separator);
        return string.Join("|", split);
    }

    public string Process(string text) {
        var s = ProcessSpecific(text);
        return ProcessCommon(s);
    }
}

এছাড়াও, আপনার আপনার রিটার্নের ধরণগুলি পুনর্নির্মাণ করা উচিত কারণ এটি লেখার সাথে সাথে এটি সংকলন stringকরে না - কখনও কখনও কোনও পদ্ধতি কোনও কিছুই ফেরায় না।


আমার ধারণা আমি উত্তরাধিকারের মন্ত্রে রচনাটি অনুসরণ করার চেষ্টা করছিলাম। তবে হ্যাঁ এটি অবশ্যই একটি বিকল্প, উত্তরের জন্য ধন্যবাদ।
জন ডারভিল

যথেষ্ট ফর্সা। আমি মনে করি উত্তরাধিকার কিছু ক্ষেত্রে ন্যায়সঙ্গত হয়েছে তবে শেষ পর্যন্ত আপনি কীভাবে আপনার পদ্ধতিগুলি এবং প্রক্রিয়াকরণটি লোড / স্টোর / চালনা / পরিবর্তন করার পরিকল্পনা করছেন তার উপর এটি নির্ভর করে।
কোরেন্টিন পেন

3
কখনও কখনও, উত্তরাধিকার কাজের জন্য সঠিক সরঞ্জাম tool আপনি যদি এমন একটি প্রক্রিয়া পেয়ে থাকেন যা বেশিরভাগ ক্ষেত্রে বিভিন্ন পরিস্থিতিতে বেশিরভাগ একইরকম আচরণ করে চলেছে তবে এর বেশ কয়েকটি অংশ রয়েছে যা বিভিন্ন পরিস্থিতিতে বিভিন্নভাবে আচরণ করবে, এটি উত্তরাধিকার ব্যবহারের জন্য বিবেচনা করা উচিত sign
ট্যানার সোয়েট

5

আপনি একটি Processপদ্ধতি সহ একটি সাধারণ ইন্টারফেস তৈরি করতে পারেন ...

public interface IProcessor
{
    string Process(string text);
}

তারপরে আপনি এটি প্রতিটি দেশের জন্য বাস্তবায়ন করুন ...

public class Processors
{
    public class GBR : IProcessor
    {
        public string Process(string text)
        {
            return $"{text} (processed with GBR rules)";
        }
    }

    public class FRA : IProcessor
    {
        public string Process(string text)
        {
            return $"{text} (processed with FRA rules)";
        }
    }
}

তারপরে আপনি প্রতিটি দেশ সম্পর্কিত শ্রেণিকে তাত্ক্ষণিকভাবে এবং কার্যকর করার জন্য একটি সাধারণ পদ্ধতি তৈরি করতে পারেন ...

// also place these in the Processors class above
public static IProcessor CreateProcessor(string country)
{
    var typeName = $"{typeof(Processors).FullName}+{country}";
    var processor = (IProcessor)Assembly.GetAssembly(typeof(Processors)).CreateInstance(typeName);
    return processor;
}

public static string Process(string country, string text)
{
    var processor = CreateProcessor(country);
    return processor?.Process(text);
}

তারপরে আপনার কেবল প্রসেসর তৈরি এবং ব্যবহার করা দরকার ...

// create a processor object for multiple use, if needed...
var processorGbr = Processors.CreateProcessor("GBR");
Console.WriteLine(processorGbr.Process("This is some text."));

// create and use a processor for one-time use
Console.WriteLine(Processors.Process("FRA", "This is some more text."));

এখানে একটি কার্যকারী ডটনেট ফিডাল উদাহরণ ...

আপনি প্রতিটি দেশ শ্রেণিতে সমস্ত দেশ-নির্দিষ্ট প্রক্রিয়াকরণ স্থাপন করেন। সমস্ত প্রকৃত স্বতন্ত্র পদ্ধতির জন্য একটি সাধারণ শ্রেণি (প্রসেসিং ক্লাসে) তৈরি করুন, সুতরাং প্রতিটি দেশ প্রসেসর প্রতিটি দেশের শ্রেণিতে কোড অনুলিপি না করে অন্যান্য সাধারণ কলগুলির একটি তালিকায় পরিণত হয়।

দ্রষ্টব্য: আপনার যুক্ত করতে হবে ...

using System.Assembly;

স্থিতিশীল পদ্ধতিতে দেশ শ্রেণির উদাহরণ তৈরি করতে হবে।


কোনও প্রতিবিম্বিত কোডের তুলনায় প্রতিফলন উল্লেখযোগ্যভাবে ধীর হয় না? এই ক্ষেত্রে এটি মূল্য?
jlvaquero

@jlvaquero না, প্রতিফলন উল্লেখযোগ্যভাবে ধীরে ধীরে হয় না। অবশ্যই ডিজাইনের সময় কোনও ধরণের নির্দিষ্টকরণের ক্ষেত্রে একটি পারফরম্যান্স হিট হয়েছে তবে এটি সত্যিই একটি তুচ্ছ পারফরম্যান্স পার্থক্য এবং যখন আপনি এটি অতিরিক্ত ব্যবহার করবেন তখনই তা লক্ষণীয়। আমি জেনেরিক অবজেক্ট হ্যান্ডলিংয়ের চারপাশে নির্মিত বৃহত মেসেজিং সিস্টেমগুলি বাস্তবায়ন করেছি এবং আমাদের কার্য সম্পাদনকে প্রশ্ন করার কোনও কারণ নেই এবং এটি বিপুল পরিমাণ থ্রুপুট with পারফরম্যান্সে কোনও লক্ষণীয় পার্থক্য না থাকায় আমি সর্বদা এই জাতীয় কোড বজায় রাখার জন্য সরল সাথে যাব।
মনিকা সেলিও

আপনি যদি প্রতিবিম্বিত হন, আপনি কি প্রতিটি কল থেকে দেশের স্ট্রিং সরিয়ে ফেলতে চান না Process, এবং পরিবর্তে একবারে সঠিক আইপ্রোসেসর পেতে এটি ব্যবহার করতে চান? আপনি একই দেশের নিয়ম অনুসারে প্রচুর পাঠ্য প্রক্রিয়াকরণ করতে চাইবেন।
ডেভিস্লোর

@ ডেভিস্লোর ঠিক এই কোডটি করে। আপনি যখন Process("GBR", "text");এটি কল করেন তখন স্থিতিশীল পদ্ধতি কার্যকর করে যা GBR প্রসেসরের একটি উদাহরণ তৈরি করে এবং এতে প্রক্রিয়া পদ্ধতি চালায়। এটি কেবলমাত্র একটি নির্দিষ্ট ক্ষেত্রে এটি কার্যকর করে country
মনিকা সেলিও

@ আর্চার রাইট, সুতরাং যে সাধারণ ক্ষেত্রে আপনি একই দেশের নিয়ম অনুসারে একাধিক স্ট্রিং প্রসেস করছেন, একবার উদাহরণটি তৈরি করা আরও দক্ষ — বা একটি হ্যাশ টেবিল / অভিধানে একটি স্থির উদাহরণ সন্ধান এবং ফিরে আসা যে একটি রেফারেন্স। তারপরে আপনি একই উদাহরণে পাঠ্য-রূপান্তর কল করতে পারেন। প্রতিটি কলের জন্য একটি নতুন উদাহরণ তৈরি করা এবং তারপরে একে একে প্রতিটি কলের জন্য পুনরায় ব্যবহার না করে এড়িয়ে দেওয়া ব্যর্থ।
ডেভিস্লোর

3

কয়েকটি সংস্করণ আগে, সি # সুইচটিকে প্যাটার্ন মেলানোর জন্য সম্পূর্ণ সমর্থন দেওয়া হয়েছিল । যাতে "একাধিক দেশ মেলে" কেসটি সহজেই হয়। যদিও এটির সামর্থ্যের মধ্য দিয়ে এখনও কোনও পতন নেই, একটি ইনপুট প্যাটার্ন মেলানোর সাথে একাধিক ক্ষেত্রে মেলে। এটি সম্ভবত যদি স্প্যামকে কিছুটা পরিষ্কার করে দেয়।

এনপিডব্লিউ একটি স্যুইচ সাধারণত সংগ্রহের সাথে প্রতিস্থাপন করা যেতে পারে। আপনার প্রতিনিধি এবং একটি অভিধান ব্যবহার করা দরকার। প্রক্রিয়া সঙ্গে প্রতিস্থাপন করা যেতে পারে।

public delegate string ProcessDelegate(string text);

তাহলে আপনি একটি অভিধান তৈরি করতে পারেন:

var Processors = new Dictionary<string, ProcessDelegate>(){
  { "USA", EnglishProcessor },
  { "GBR", EnglishProcessor },
  { "DEU", GermanProcessor }
}

আমি ডেলিগেটটিতে ফাংশননাম ব্যবহার করি ames তবে আপনি পুরো কোডটি সরবরাহ করতে ল্যাম্বদা সিনট্যাক্সটি ব্যবহার করতে পারেন। আপনি অন্য কোনও বৃহৎ সংগ্রহের মতো আপনি কেবল পুরো সংগ্রহটি লুকিয়ে রাখতে পারেন। এবং কোডটি একটি সাধারণ দৃষ্টিতে পরিণত হয়:

ProcessDelegate currentProcessor = Processors[country];
string processedString = currentProcessor(country);

এগুলি দুটি বিকল্পের চেয়ে বেশ কার্যকর। আপনি ম্যাচের জন্য স্ট্রিংয়ের পরিবর্তে এনিউমিরেশনগুলি ব্যবহার করার বিষয়টি বিবেচনা করতে চাইতে পারেন তবে এটি একটি সামান্য বিবরণ।


2

আমি সম্ভবত (আপনার ব্যবহারের ক্ষেত্রে বিবরণের উপর নির্ভর করে) Countryস্ট্রিংয়ের পরিবর্তে "সত্যিকারের" বস্তু হিসাবে চলে যেতে চাই । মূল শব্দটি হ'ল "বহুবিজ্ঞান"।

সুতরাং মূলত এটি দেখতে এটি দেখতে হবে:

public interface Country {
   string Process(string text);
}

তারপরে আপনার প্রয়োজনীয়দের জন্য আপনি বিশেষায়িত দেশ তৈরি করতে পারেন। দ্রষ্টব্য: আপনাকে Countryসমস্ত দেশের জন্য অবজেক্ট তৈরি করতে হবে না , আপনি থাকতে পারেন LatinlikeCountryবা এমনকি করতে পারেন GenericCountry। সেখানে আপনি কী করতে হবে তা সংগ্রহ করতে পারেন, এমনকি অন্যকে পুনরায় ব্যবহার করতে যেমন:

public class France {
   public string Process(string text) {
      return new GenericCountry().process(text)
         .replace('a', 'b');
   }
}

অথবা সাদৃশ্যপূর্ণ. Countryপ্রকৃতপক্ষে হতে পারে Language, আমি ব্যবহারের ক্ষেত্রে সম্পর্কে নিশ্চিত নই, তবে আমি আপনার বক্তব্যটি পেয়েছি।

এছাড়াও, অবশ্যই পদ্ধতিটি এমন হওয়া উচিত নয় Process()যা আপনার আসলে কাজটি করা উচিত। যেমন Words()বা যাই হোক না কেন


1
আমি কিছু শব্দযুক্ত লিখেছি, তবে আমি মনে করি এটি মূলত আমার পক্ষে সবচেয়ে ভাল লাগে। যদি ব্যবহারের ক্ষেত্রে কোনও দেশের স্ট্রিংয়ের উপর ভিত্তি করে এই বিষয়গুলি সন্ধান করার প্রয়োজন হয় তবে এটি এটি সহ ক্রিস্টোফারের সমাধানটি ব্যবহার করতে পারে। ইন্টারফেসগুলি বাস্তবায়ন এমনকি এমন একটি শ্রেণি হতে পারে যার উদাহরণগুলি সময়ের পরিবর্তে স্থানের জন্য অনুকূলিতকরণের জন্য মিশালের উত্তরের মতো বৈশিষ্ট্য নির্ধারণ করে।
ডেভিস্লোর

1

আপনি তার নিজের সংস্কৃতি সম্পর্কে জানে এমন কিছু (দায়বদ্ধতার পক্ষে সম্মতি প্রদান) করতে চান। সুতরাং উপরে বা উত্তর হিসাবে উল্লিখিত হিসাবে একটি দেশ বা সংস্কৃতিআইফোন টাইপ কনস্ট্রাক্ট ব্যবহার বা তৈরি করুন।

তবে সাধারণভাবে এবং মৌলিকভাবে আপনার সমস্যা হ'ল আপনি 'প্রসেসর'-এর মতো পদ্ধতিগত গঠনগুলি গ্রহণ করছেন এবং সেগুলিকে ওওতে প্রয়োগ করছেন। ওও একটি ব্যবসা বা সফ্টওয়্যার সমস্যার ডোমেন থেকে বাস্তব বিশ্বের ধারণা উপস্থাপন সম্পর্কে। প্রসেসর নিজেই সফ্টওয়্যার বাদে বাস্তব বিশ্বের কোনও কিছুতে অনুবাদ করে না। আপনার যখনই প্রসেসর বা ম্যানেজার বা গভর্নরের মতো ক্লাস থাকে, অ্যালার্ম বেল বাজে।


0

আমি ভাবছিলাম যদি সেখানে কোনও প্যাটার্ন থাকে যা এই ধরণের প্রক্রিয়াটিতে সহায়তা করবে

পুনঃব্যবহারের চেইন হ'ল সেই ধরণের জিনিস যা আপনি সন্ধান করতে পারেন তবে ওওপিতে কিছুটা কষ্টকর ...

সি # এর সাথে আরও কার্যকরী পদ্ধতির কী হবে?

using System;


namespace Kata {

  class Kata {


    static void Main() {

      var text = "     testing this thing for DEU          ";
      Console.WriteLine(Process.For("DEU")(text));

      text = "     testing this thing for USA          ";
      Console.WriteLine(Process.For("USA")(text));

      Console.ReadKey();
    }

    public static class Process {

      public static Func<string, string> For(string country) {

        Func<string, string> baseFnc = (string text) => text;

        var aggregatedFnc = ApplyToUpper(baseFnc, country);
        aggregatedFnc = ApplyTrim(aggregatedFnc, country);

        return aggregatedFnc;

      }

      private static Func<string, string> ApplyToUpper(Func<string, string> currentFnc, string country) {

        string toUpper(string text) => currentFnc(text).ToUpper();

        Func<string, string> fnc = null;

        switch (country) {
          case "USA":
          case "GBR":
          case "DEU":
            fnc = toUpper;
            break;
          default:
            fnc = currentFnc;
            break;
        }
        return fnc;
      }

      private static Func<string, string> ApplyTrim(Func<string, string> currentFnc, string country) {

        string trim(string text) => currentFnc(text).Trim();

        Func<string, string> fnc = null;

        switch (country) {
          case "DEU":
            fnc = trim;
            break;
          default:
            fnc = currentFnc;
            break;
        }
        return fnc;
      }
    }
  }
}

দ্রষ্টব্য: এটি অবশ্যই সমস্ত স্থির থাকতে হবে না। প্রক্রিয়া শ্রেণীর যদি রাষ্ট্রের প্রয়োজন হয় তবে আপনি উদাহরণস্বরূপ শ্রেণি বা আংশিক প্রয়োগিত ফাংশন ব্যবহার করতে পারেন;)।

আপনি প্রারম্ভকালে প্রতিটি দেশের জন্য প্রক্রিয়া তৈরি করতে পারেন, প্রতিটিকে একটি সূচকযুক্ত সংগ্রহে সংরক্ষণ করতে পারেন এবং ও (1) ব্যয়ের সাথে প্রয়োজন হলে এগুলি পুনরুদ্ধার করতে পারেন।


0

আমি দুঃখিত যে আমি অনেক আগে এই বিষয়টির জন্য "অবজেক্টস" শব্দটি তৈরি করেছি কারণ এটি অনেক লোককেই কম ধারণাটিতে ফোকাস দেয় gets বড় ধারণাটি মেসেজিং

~ অ্যালান কে, মেসেজিংয়ে

আমি কেবল রুটিন বাস্তবায়ন করবে Capitalise, RemovePunctuationsubprocesses করে একটি সঙ্গে messaged করা যেতে পারে ইত্যাদি textএবংcountry পরামিতি, এবং একটি প্রক্রিয়া টেক্সট ফিরে আসবে।

গোষ্ঠী দেশগুলিতে অভিধান ব্যবহার করুন যা একটি নির্দিষ্ট বৈশিষ্ট্যের সাথে খাপ খায় (যদি আপনি তালিকাগুলি পছন্দ করেন তবে এটি কেবলমাত্র সামান্য পারফরম্যান্স ব্যয়ের সাথে কাজ করবে)। উদাহরণস্বরূপ: CapitalisationApplicableCountriesএবং PunctuationRemovalApplicableCountries

/// Runs like a pipe: passing the text through several stages of subprocesses
public string Process(string country, string text)
{
    text = Capitalise(country, text);
    text = RemovePunctuation(country, text);
    // And so on and so forth...

    return text;
}

private string Capitalise(string country, string text)
{
    if ( ! CapitalisationApplicableCountries.ContainsKey(country) )
    {
        /* skip */
        return text;
    }

    /* do the capitalisation */
    return capitalisedText;
}

private string RemovePunctuation(string country, string text)
{
    if ( ! PunctuationRemovalApplicableCountries.ContainsKey(country) )
    {
        /* skip */
        return text;
    }

    /* do the punctuation removal */
    return punctuationFreeText;
}

private string Replace(string country, string text)
{
    // Implement it following the pattern demonstrated earlier.
}

0

আমি অনুভব করি যে দেশগুলির তথ্য তথ্যগুলিতে কোডে রাখা উচিত, কোডে নয়। সুতরাং কোনও দেশীয় তথ্য ক্লাস বা ক্যাপিটালাইজেশন অ্যাপ্লিকেশনযোগ্য দেশগুলির অভিধানের পরিবর্তে আপনার কাছে প্রতিটি দেশের জন্য একটি রেকর্ড এবং প্রতিটি প্রক্রিয়াকরণের পদক্ষেপের জন্য একটি ক্ষেত্র থাকতে পারে এবং প্রসেসিং একটি নির্দিষ্ট দেশের জন্য ক্ষেত্রগুলির মধ্যে দিয়ে যেতে পারে এবং সেই অনুযায়ী প্রক্রিয়া করতে পারে। রক্ষণাবেক্ষণটি মূলত ডাটাবেসে থাকে, নতুন কোডের সাথে কেবল তখনই নতুন পদক্ষেপের প্রয়োজন হয় এবং ডেটাবেজে ডেটা মানব পাঠযোগ্য হতে পারে। এটি ধরে নেয় পদক্ষেপগুলি স্বাধীন এবং একে অপরের সাথে হস্তক্ষেপ করবে না; যদি তা না হয় তবে বিষয়গুলি জটিল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.