একটি পদ্ধতি সহ শ্রেণীর জন্য উপযুক্ত নকশা যা গ্রাহকদের মধ্যে পৃথক হতে পারে


12

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

আমি কুরুচিপূর্ণ কোড লিখতে পারি যা গ্রাহক আইডি এর উপর ভিত্তি করে স্যুইচ করে:

switch(customerID) {
 case 101:
  .. do calculations for customer 101
 case 102:
  .. do calculations for customer 102
 case 103:
  .. do calculations for customer 103
 etc
}

তবে এর জন্য প্রতিবার নতুন গ্রাহক পেলে ক্লাসটি পুনর্নির্মাণ করা দরকার। এর চেয়ে ভাল উপায় কী?

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


[সম্পাদনা] আমি নিম্নলিখিত কারণে শীর্ষ স্থানের উত্তর নিয়ে যাওয়ার সিদ্ধান্ত নিয়েছি (প্রতিটি গ্রাহকের জন্য একটি পৃথক "গ্রাহক" শ্রেণি তৈরি করা যা একটি স্ট্যান্ডার্ড ইন্টারফেস প্রয়োগ করে):

  1. ধারাবাহিকতা: আমি এমন একটি ইন্টারফেস তৈরি করতে পারি যা নিশ্চিত করে যে সমস্ত গ্রাহক শ্রেণি একই আউটপুট গ্রহণ করে এবং ফেরত দেয়, এমনকি অন্য বিকাশকারী দ্বারা তৈরি করা হলেও

  2. রক্ষণাবেক্ষণযোগ্যতা: সমস্ত কোড একই ভাষায় (জাভা) লিখিত হয় তাই মৃত-সরল বৈশিষ্ট্যটি কী হওয়া উচিত তা বজায় রাখতে অন্য কারও জন্য আলাদা কোডিং ভাষা শেখার দরকার নেই।

  3. পুনঃব্যবহার: কোডে যদি একইরকম সমস্যা দেখা দেয় তবে আমি কাস্টম শ্রেণিকে পুনরায় ব্যবহার করতে পারি "কাস্টম" যুক্তি বাস্তবায়নের জন্য অনেকগুলি পদ্ধতি অবলম্বন করতে।

  4. পরিচিতি: আমি কীভাবে এটি করতে হবে তা ইতিমধ্যে আমি জানি, তাই আমি এটি দ্রুত সম্পন্ন করতে এবং অন্যান্য টিপতে আরও চাপ দিতে পারি।

অপূর্ণতা:

  1. প্রতিটি নতুন গ্রাহকের জন্য নতুন গ্রাহক শ্রেণীর একটি সংকলন প্রয়োজন, যা আমরা কীভাবে পরিবর্তনগুলি সংকলন ও স্থাপন করি তাতে কিছুটা জটিলতা যুক্ত করতে পারে।

  2. প্রতিটি নতুন গ্রাহক একটি বিকাশকারী দ্বারা যুক্ত করতে হবে - একটি সমর্থন ব্যক্তি কেবল একটি সম্পত্তি ফাইল হিসাবে কিছু যুক্তি যুক্ত করতে পারবেন না। এটি আদর্শ নয় ... তবে আমি তখনও নিশ্চিত ছিলাম না যে কোনও সমর্থনকারী ব্যক্তি প্রয়োজনীয় ব্যবসায়িক যুক্তিটি কীভাবে লিখতে সক্ষম হবেন, বিশেষত যদি এটি অনেকগুলি ব্যতিক্রম (যেমন সম্ভবত সম্ভাব্য) জটিল হয়।

  3. আমরা অনেক, অনেক নতুন গ্রাহক যুক্ত করলে এটি ভাল স্কেল হবে না। এটি প্রত্যাশিত নয়, তবে যদি এটি ঘটে তবে আমাদের কোডের অন্যান্য অনেকগুলি অংশ এবং সেই সাথে আবারও চিন্তা করতে হবে।

আপনার আগ্রহীদের জন্য, আপনি নাম দ্বারা কোনও শ্রেণিতে কল করতে জাভা প্রতিবিম্ব ব্যবহার করতে পারেন:

Payment payment = getPaymentFromSomewhere();

try {
    String nameOfCustomClass = propertiesFile.get("customClassName");
    Class<?> cpp = Class.forName(nameOfCustomClass);
    CustomPaymentProcess pp = (CustomPaymentProcess) cpp.newInstance();

    payment = pp.processPayment(payment);
} catch (Exception e) {
    //handle the various exceptions
} 

doSomethingElseWithThePayment(payment);

1
হতে পারে আপনার গণনার ধরণটি বিশদভাবে বলা উচিত। এটি কি কেবল ছাড় হিসাবে গণনা করা হচ্ছে বা এটি কোনও ভিন্ন কাজের প্রবাহ?
কিওয়ার্টি_সো

@ থমাসকিলিয়ান এটি কেবল একটি উদাহরণ। কোনও পেমেন্ট অবজেক্টের কল্পনা করুন এবং গণনাগুলি "পেমেন্ট.টোটাল দ্বারা পেমেন্ট.পেনসেন্টেজকে গুণ করে - এমন কি না যদি পেমেন্ট.ইড 'আর' দিয়ে শুরু হয়"। Kind ধরণের গ্রানুলারিটি। প্রত্যেক গ্রাহকের নিজস্ব নিয়ম রয়েছে।
অ্যান্ড্রু


আপনি কি এরকম কিছু চেষ্টা করেছেন ? প্রতিটি গ্রাহকের জন্য বিভিন্ন সূত্র সেট করা।
লাইভ

1
বিভিন্ন উত্তর থেকে প্রস্তাবিত প্লাগইনগুলি কেবল তখনই কাজ করবে যদি আপনার প্রতি গ্রাহকের জন্য ডেডিকেটেড থাকে। আপনার যদি কোনও সার্ভার সমাধান থাকে যেখানে আপনি গ্রাহক আইডিটিকে গতিশীলভাবে পরীক্ষা করেন, এটি কার্যকর হবে না। তাহলে আপনার পরিবেশটি কী?
qwerty_so

উত্তর:


14

গ্রাহকের অর্থপ্রদান প্রক্রিয়া করার জন্য আমার একটি ক্লাস ব্যবহৃত হয়েছে। এই ক্লাসের একটি পদ্ধতি ছাড়াও প্রতিটি গ্রাহকের জন্য একই, গণনা করা এমন এক ব্যতীত (উদাহরণস্বরূপ) গ্রাহকের ব্যবহারকারীর কত .ণী

দুটি বিকল্প আমার মনে আসে।

বিকল্প 1: আপনার ক্লাসটিকে একটি বিমূর্ত শ্রেণি করুন, যেখানে গ্রাহকদের মধ্যে পরিবর্তিত পদ্ধতিটি একটি বিমূর্ত পদ্ধতি। তারপরে প্রতিটি গ্রাহকের জন্য একটি সাবক্লাস তৈরি করুন।

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


গ্রাহক শ্রেণি একটি খারাপ ধারণা নয়। প্রতিটি গ্রাহকের জন্য একধরনের কাস্টম অবজেক্ট হতে হবে, তবে আমি এটি পরিষ্কার করতে পারি নি যে এটি কোনও ডিবি রেকর্ড, কোনও সম্পত্তি ফাইল (কোনও ধরণের), বা অন্য কোনও শ্রেণির হওয়া উচিত।
অ্যান্ড্রু

10

আপনার অ্যাপ্লিকেশনের জন্য কাস্টম গণনাগুলি "প্লাগ-ইনস" হিসাবে লেখার দিকে নজর দিতে পারেন। তারপরে, আপনি কোন প্রোগ্রামটির জন্য একটি কনফিগারেশন ফাইল ব্যবহার করবেন তা কোন গ্রাহকের জন্য কোন গণনা প্লাগইন ব্যবহার করা উচিত তা আপনাকে জানান। এইভাবে, আপনার নতুন অ্যাপ্লিকেশনটি প্রতিটি নতুন গ্রাহকের জন্য পুনরায় সংযুক্ত করার প্রয়োজন হবে না - এটির জন্য কেবল একটি কনফিগারেশন ফাইলটি পড়তে হবে (বা পুনরায় পড়তে হবে) এবং নতুন প্লাগইনগুলি লোড করতে হবে।


ধন্যবাদ। একটি জাভা পরিবেশ বলতে কীভাবে কোনও প্লাগ-ইন কাজ করবে? উদাহরণস্বরূপ, আমি সূত্রটি "ফলাফল = যদি (Payment.id.startsWith (" আর ")) লিখতে চাই? Payment.percentage * পেমেন্ট.টোটাল: Payment.otherValue" গ্রাহকের সম্পত্তি হিসাবে এটি সংরক্ষণ করুন এবং এটি সন্নিবেশ করান উপযুক্ত পদ্ধতিতে?
অ্যান্ড্রু

@ অ্যান্ড্রু, একটি প্লাগইন কাজ করতে পারে এমন এক উপায় নাম দ্বারা শ্রেণিতে লোড করার জন্য প্রতিবিম্ব ব্যবহার করা। কনফিগার ফাইলটি গ্রাহকদের ক্লাসের নাম তালিকাভুক্ত করে। অবশ্যই, কোন গ্রাহকের জন্য কোন প্লাগইন রয়েছে তা সনাক্ত করার জন্য আপনার কিছু উপায় থাকতে হবে (উদাঃ, এর নাম বা কোনও মেটাডেটা কোথাও সঞ্চিত)।
কেট

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

@ অ্যান্ড্রু: আপনি কোনও প্রোপার্টি ফাইলে আপনার সূত্রগুলি লিখতে সক্ষম হতে পারেন তবে তার পরে আপনার কোনও প্রকারের এক্সপ্রেশন পার্সার প্রয়োজন। এবং আপনি একদিন কোনও সূত্রের মধ্যে চলে যেতে পারেন যা কোনও সম্পত্তি ফাইলে এক-লাইন প্রকাশ হিসাবে (সহজেই) লিখতে খুব জটিল। আপনি যদি সত্যিই নন-প্রোগ্রামারদের এগুলিতে কাজ করতে সক্ষম করতে চান তবে তাদের ব্যবহারের জন্য আপনার জন্য একরকম ব্যবহারকারী-বান্ধব এক্সপ্রেশন সম্পাদক প্রয়োজন যা আপনার অ্যাপ্লিকেশনের কোড তৈরি করবে। এটি করা যেতে পারে (আমি এটি দেখেছি) তবে এটি তুচ্ছ নয়।
হতাশ

4

আমি গণনার বর্ণনা দেওয়ার জন্য একটি নিয়ম নিয়ে যাব। এটি যে কোনও দৃ pers়তার স্টোর এবং গতিশীলভাবে সংশোধন করা যেতে পারে।

বিকল্প হিসাবে এটি বিবেচনা করুন:

customerOps = [oper1, oper2, ..., operN]; // array with customer specific operations
index = customerOpsIndex(customer);
customerOps[index](parms);

যেখানে customerOpsIndexসঠিক অপারেশন সূচক গণনা করা হয়েছে (কোন গ্রাহকের কোন চিকিত্সার প্রয়োজন তা আপনি জানেন)।


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

আপনি কোনও অ্যারেতে গ্রাহকের জন্য ডাকা অপারেশনগুলি সঞ্চয় করতে পারেন এবং এটি সূচকের জন্য গ্রাহক আইডি ব্যবহার করতে পারেন।
কিওয়ার্টি_সো

এটি আরও প্রতিশ্রুতিবদ্ধ দেখাচ্ছে। :)
অ্যান্ড্রু

3

নীচের মত কিছু:

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

public interface ICustomer
{
    int Calculate();
}
public class CustomerLogic101 : ICustomer
{
    public int Calculate() { return 101; }
}
public class CustomerLogic102 : ICustomer
{
    public int Calculate() { return 102; }
}

public class CustomerRepo
{
    public ICustomer GetCustomerById(
        string id)
    {
        var data;//get data from db
        if (data.logicType == "101")
        {
            return new CustomerLogic101();
        }
        if (data.logicType == "102")
        {
            return new CustomerLogic102();
        }
    }
}
public class Calculator
{
    public int CalculateCustomer(string custId)
    {
        CustomerRepo repo = new CustomerRepo();
        var cust = repo.GetCustomerById(custId);
        return cust.Calculate();
    }
}

2

গ্রাহকদের কাছ থেকে কাস্টম কোডে আপনার 1 থেকে 1 ম্যাপিং রয়েছে এমন শোনার মতো এবং আপনি যখন একটি নতুন গ্রাহক পেয়েছেন তখন প্রতিবার আপনার সিস্টেমটি পুনর্নির্মাণ করতে আপনি একটি সংকলিত ভাষা ব্যবহার করছেন because

এম্বেড থাকা স্ক্রিপ্টিং ভাষা ব্যবহার করে দেখুন।

উদাহরণস্বরূপ, যদি আপনার সিস্টেমটি জাভাতে থাকে আপনি JRuby এম্বেড করতে পারবেন এবং তারপরে প্রতিটি গ্রাহকের জন্য রুবি কোডের সাথে সম্পর্কিত স্নিপেট store সংস্করণ নিয়ন্ত্রণের অধীনে আদর্শভাবে কোথাও, একই বা পৃথক গিট রেপো। এবং তারপরে আপনার জাভা অ্যাপ্লিকেশনের প্রসঙ্গে সেই স্নিপেটটি মূল্যায়ন করুন। জেআরবি যে কোনও জাভা ফাংশন কল করতে এবং যেকোন জাভা বস্তু অ্যাক্সেস করতে পারে।

package com.example;

import org.jruby.embed.LocalVariableBehavior;
import org.jruby.embed.ScriptingContainer;

public class Main {

    private ScriptingContainer ruby;

    public static void main(String[] args) {
        new Main().run();
    }

    public void run() {
        ruby = new ScriptingContainer(LocalVariableBehavior.PERSISTENT);
        // Assign the Java objects that you want to share
        ruby.put("main", this);
        // Execute a script (can be of any length, and taken from a file)
        Object result = ruby.runScriptlet("main.hello_world");
        // Use the result as if it were a Java object
        System.out.println(result);
    }

    public String getHelloWorld() {
        return "Hello, worlds!";
    }

}

এটি একটি খুব সাধারণ প্যাটার্ন। উদাহরণস্বরূপ, অনেক কম্পিউটার গেমস সি ++ তে লিখিত হয় তবে গেমের প্রতিটি প্রতিপক্ষের গ্রাহকের আচরণ সংজ্ঞায়িত করতে এম্বেড করা লুয়া স্ক্রিপ্টগুলি ব্যবহার করে।

অন্যদিকে, আপনার যদি গ্রাহকদের কাছ থেকে কাস্টম কোডে অনেকগুলি 1 ম্যাপিং থাকে তবে ইতিমধ্যে প্রস্তাবিত হিসাবে কেবল "কৌশল" প্যাটার্নটি ব্যবহার করুন।

যদি ম্যাপিংটি ব্যবহারকারী আইডি তৈরির ভিত্তিতে না হয় তবে matchপ্রতিটি কৌশল অবজেক্টে একটি ফাংশন যুক্ত করুন এবং কোন কৌশলটি ব্যবহার করবেন তার একটি আদেশযুক্ত পছন্দ করুন।

এখানে কিছু সিডো কোড রয়েছে

strategy = strategies.find { |strategy| strategy.match(customer) }
strategy.apply(customer, ...)

2
আমি এই পদ্ধতির এড়ানো হবে। প্রবণতা হ'ল এই সমস্ত স্ক্রিপ্ট স্নিপেটগুলি একটি ডিবিতে রাখার পরে আপনি উত্স নিয়ন্ত্রণ, সংস্করণ এবং পরীক্ষা হারাবেন।
ইভান

যথেষ্ট ফর্সা। তারা এগুলিকে পৃথক গিট রেপো বা যে কোনও জায়গায় সঞ্চিত রাখে। আমার উত্তরটি আপডেট করে বলেছিল যে স্নিপেটগুলি আদর্শভাবে সংস্করণ নিয়ন্ত্রণে থাকা উচিত।
akuhn

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

2

আমি স্রোতের বিপরীতে সাঁতার কাটছি।

আমি এএনটিএলআর দিয়ে আমার নিজস্ব প্রকাশের ভাষা প্রয়োগের চেষ্টা করব ।

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

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

উদাহরণ হিসাবে আপনার মন্তব্য গ্রহণ:

আমি সূত্রটি "ফলাফল = যদি (Payment.id.startsWith (" আর ")) লিখতে চাই??

আপনার EL এর মাধ্যমে আপনার পক্ষে এই জাতীয় বাক্যটি দেওয়া সম্ভব হবে:

If paymentID startWith 'R' then (paymentPercentage / paymentTotal) else paymentOther

তারপর ...

এটি গ্রাহকের সম্পত্তি হিসাবে সংরক্ষণ করুন এবং উপযুক্ত পদ্ধতিতে এটি sertোকান?

আপনি পারে। এটি একটি স্ট্রিং, আপনি সম্পত্তি বা গুণ হিসাবে এটি সংরক্ষণ করতে পারেন।

আমি মিথ্যা বলব না। এটি বেশ জটিল এবং শক্ত। ব্যবসায়ের নিয়মগুলি জটিল হলে এটি আরও শক্ত।

এখানে কিছু এসও প্রশ্ন যা আপনার আগ্রহী হতে পারে:


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

আপনি যদি অ্যান্টলারকে খুব শক্ত মনে করেন তবে আপনি এক্সপ্রে 4 জে, জেভাল, পার্সির মতো লিবসের সাহায্যে চেষ্টা করতে পারেন। এগুলি উচ্চ স্তরের বিমূর্ততার সাথে কাজ করে।


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

1
আপনার কাছে অনেকগুলি বিকল্প রয়েছে। আমি কেবল আরও একটি দিতে চেয়েছিলাম
লাইভ

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

@ ইভান দুঃখিত, আমি আপনার যুক্তি বুঝতে না পেরে ভয় পাচ্ছি। ভাষা বর্ণনাকারী এবং স্বয়ংক্রিয়ভাবে তৈরি ক্লাসগুলি প্রকল্পের অংশ হতে পারে বা নাও হতে পারে। তবে কোনও ক্ষেত্রেই আমি কেন সংস্করণ / উত্স কোড পরিচালনা হারাতে পারি তা দেখতে পাচ্ছি না। অন্যদিকে, 2 টি ভিন্ন ভাষা রয়েছে বলে মনে হতে পারে তবে এটি অস্থায়ী। ভাষাটি শেষ হয়ে গেলে আপনি কেবল স্ট্রিং সেট করেন। ক্রোন এক্সপ্রেশন মত। দীর্ঘমেয়াদে চিন্তিত হওয়ার মতো উপায় নেই।
লাইভ

"যদি পেমেন্টআইডি 'আর' দিয়ে শুরু হয় তবে (পেমেন্টপেনসেটেজ / পেমেন্টটোটাল) অন্য পেমেন্টআউট" অন্য কোথা থেকে আপনি এটি সঞ্চয় করবেন? এটি কোন সংস্করণ? এটি কোন ভাষায় লেখা আছে? আপনি এর জন্য কোন ইউনিট পরীক্ষা পেয়েছেন?
ইয়ান

1

আপনি কমপক্ষে অ্যালগরিদমকে বহিরাগত করতে পারেন যাতে কৌশল প্যাটার্ন (এটি গ্যাং অফ ফোর) নামে পরিচিত একটি নকশার প্যাটার্ন ব্যবহার করে যখন কোনও নতুন গ্রাহক যুক্ত করা হয় তখন গ্রাহক শ্রেণীর পরিবর্তনের প্রয়োজন হয় না।

আপনি যে স্নিপেটটি দিয়েছিলেন তা থেকে, কৌশলটি প্যাটার্নটি কম রক্ষণাবেক্ষণযোগ্য বা আরও রক্ষণাবেক্ষণযোগ্য হবে কিনা তা তর্কযোগ্য, তবে এটি কী করা দরকার তা সম্পর্কে গ্রাহক শ্রেণীর জ্ঞানটি কমপক্ষে (এবং আপনার স্যুইচ কেসটিকে দূর করবে) would

স্ট্র্যাটেজিফ্যাক্টরি অবজেক্টটি গ্রাহকআইডি-র উপর ভিত্তি করে কৌশল কৌশল পয়েন্টার (বা রেফারেন্স) তৈরি করবে। কারখানাটি বিশেষ নয় এমন গ্রাহকদের জন্য একটি ডিফল্ট বাস্তবায়ন ফিরিয়ে দিতে পারে।

গ্রাহক শ্রেণীর কেবল কারখানার সঠিক কৌশলটির জন্য জিজ্ঞাসা করা উচিত এবং তারপরে এটি কল করা উচিত।

আমি কী বলতে চাইছি তা দেখানোর জন্য এটি খুব সংক্ষেপে সিউডো সি +

class Customer
{
public:

    void doCalculations()
    {
        CalculationsStrategyIntf& strategy = CalculationsStrategyFactory::instance().getStrategy(*this);
        strategy.doCalculations();
    }
};


class CalculationsStrategyIntf
{
public:
    virtual void doCalculations() = 0;
};

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


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

-1

একক পদ্ধতিতে একটি ইন্টারফেস তৈরি করুন এবং প্রতিটি বাস্তবায়ন ক্লাসে লামডাস ব্যবহার করুন। অথবা আপনি বিভিন্ন ক্লায়েন্টের জন্য পদ্ধতিগুলি বাস্তবায়নের জন্য বেনাম শ্রেণি করতে পারেন

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