পলিমারফিক ক্লাসের জন্য আপনি কীভাবে জিইউআই করবেন?


17

ধরা যাক আমি একটি পরীক্ষা নির্মাতা পেয়েছি, যাতে শিক্ষকরা পরীক্ষার জন্য একগুচ্ছ প্রশ্ন তৈরি করতে পারেন।

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

আমি দুটি জিনিস এড়াতে চাই:

  1. চেক টাইপ করুন বা কাস্টিং টাইপ করুন
  2. আমার ডেটা কোডে জিইউআই সম্পর্কিত যে কোনও কিছু।

আমার প্রথম প্রয়াসে, আমি নিম্নলিখিত ক্লাসগুলি দিয়ে শেষ করেছি:

class Test{
    List<Question> questions;
}
interface Question { }
class MultipleChoice implements Question {}
class TextBox implements Question {}

যাইহোক, আমি যখন পরীক্ষাটি প্রদর্শন করতে যাই, আমি অবশ্যম্ভাবী কোডের মতো শেষ করতাম:

for (Question question: questions){
    if (question instanceof MultipleChoice){
        display.add(new MultipleChoiceViewer());
    } 
    //etc
}

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


6
আপনার যে সমস্যাগুলির সাথে সমস্যা রয়েছে সেগুলি সম্পর্কে জিজ্ঞাসা করা কোনও খারাপ ধারণা নয় তবে আমার কাছে এই প্রশ্নটি খুব বিস্তৃত / অস্পষ্ট বলে মনে হচ্ছে এবং শেষ পর্যন্ত আপনি প্রশ্নটি করছেন ...
কেয়েস

1
সাধারণভাবে, আমি টাইপ চেক / টাইপ কাস্টিং এড়ানোর চেষ্টা করি কারণ এটি সাধারণত কমপাইল-টাইম পরীক্ষার দিকে পরিচালিত করে এবং মূলত পলিমারফিজমটি ব্যবহার করার পরিবর্তে "কাজ করে" থাকে। আমি মৌলিকভাবে তাদের বিরোধী নই, তবে সেগুলি ছাড়া সমাধান সন্ধান করার চেষ্টা করব।
নাথান মেরিল

1
আপনি যা সন্ধান করছেন তা হ'ল শ্রেণিবদ্ধ বস্তু মডেল নয়, সাধারণ টেম্পলেটগুলি বর্ণনা করার জন্য একটি ডিএসএল
ব্যবহারকারী 1643723

2
@ নাথানমিরিল "আমি অবশ্যই পলিমোফিজম চাই", - অন্যদিকেও কি এমন হওয়া উচিত নয়? আপনি কি বরং আপনার আসল লক্ষ্য অর্জন করতে পারবেন বা "পলিমোফিজম ব্যবহার করুন"? আইএমও, পলিমিফিজম জটিল এপিআইগুলি তৈরির এবং মডেলিং আচরণের জন্য বেশ উপযুক্ত। এটি মডেলিং ডেটার জন্য কম উপযুক্ত (যেটি বর্তমানে আপনি করছেন)।
ব্যবহারকারী1643723

1
@ নাথানমিরিল "প্রতিটি টাইমব্লক একটি ক্রিয়া সম্পাদন করে, বা অন্যান্য টাইমব্লকগুলি ধারণ করে এবং তাদের সম্পাদন করে, বা ব্যবহারকারী প্রম্প্টের অনুরোধ করে" - আমি পরামর্শ দিচ্ছি যে এই তথ্যটি আপনাকে প্রশ্নটিতে যুক্ত করুন।
ব্যবহারকারী1643723

উত্তর:


15

আপনি একটি দর্শনার্থীর প্যাটার্ন ব্যবহার করতে পারেন:

interface QuestionVisitor {
    void multipleChoice(MultipleChoice);
    void textBox(TextBox);
    ...
}

interface Question {
    void visit(QuestionVisitor);
}

class MultipleChoice implements Question {

    void visit(QuestionVisitor visitor) {
        visitor.multipleChoice(this);
    }
}

আর একটি বিকল্প বৈষম্যমূলক ইউনিয়ন। এটি আপনার ভাষার উপর নির্ভর করবে। আপনার ভাষা যদি এটি সমর্থন করে তবে এটি অনেক ভাল is


2
হুম .... এটি কোনও ভয়াবহ বিকল্প নয়, তবে প্রশ্নভিটার ইন্টারফেসে প্রতিবারই একটি পদ্ধতি যুক্ত করা দরকার যখনই বিভিন্ন ধরণের প্রশ্ন থাকে, যা অতি পরিমাপযোগ্য নয়।
নাথান মেরিল

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

4
সত্য। তবে, আমি যদি কখনও কাউকে তাদের নিজস্ব প্রশ্ন প্রকার + রেন্ডারার (যা আমি করি না) তৈরি করার অনুমতি দিতে চাইতাম তবে আমি মনে করি না এটি সম্ভব হবে।
নাথান মেরিল

2
@ নাথানমারিল, এটি সত্য। এই পদ্ধতির ধারণা করা হয় যে কেবলমাত্র একটি কোড বেস প্রশ্নের ধরণ নির্ধারণ করছে।
উইনস্টন ইওয়ার্ট

4
@ উইনস্টোনএওয়ার্ট এটি দর্শনার্থীদের ধরণটির একটি ভাল ব্যবহার। তবে আপনার বাস্তবায়ন প্যাটার্ন অনুযায়ী বেশ নয়। সাধারণত দর্শনার্থীর পদ্ধতিগুলির নাম অনুসারে নামকরণ করা হয় না, তাদের সাধারণত একই নাম থাকে এবং কেবলমাত্র পরামিতিগুলির (প্যারামিটারের ওভারলোডিং) প্রকারভেদে পৃথক; সাধারণ নামটি visit(দর্শনার্থী দর্শন)। এছাড়াও পরিদর্শন করা অবজেক্টগুলির পদ্ধতিটিকে সাধারণত বলা হয় accept(Visitor)(বস্তুটি একজন দর্শককে গ্রহণ করে)। Oodesign.com/visitor-pattern.html
ভিক্টর সিফার্ট

2

সি # / ডাব্লুপিএফ (এবং, আমি ধারণা করি, অন্যান্য ইউআই- ফোকাসড ডিজাইন ভাষাগুলিতে), আমাদের ডেটা টেম্পলেটগুলি রয়েছে । ডেটা টেমপ্লেটগুলি সংজ্ঞায়িত করে আপনি এক ধরণের "ডেটা অবজেক্ট" এবং একটি বিশেষায়িত "ইউআই টেমপ্লেট" এর মধ্যে বিশেষভাবে সেই অবজেক্টটি প্রদর্শনের জন্য তৈরি করেছেন।

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


এটি মনে হয় সমস্যাটিকে XML এ নিয়ে চলেছে যেখানে আপনি প্রথম স্থানে সমস্ত কঠোর টাইপিং হারাবেন।
নাথান মেরিল

আমি নিশ্চিত না আপনি যদি বলছেন যে এটি একটি ভাল জিনিস বা খারাপ জিনিস। একদিকে, আমরা সমস্যাটি সরিয়ে নিচ্ছি। অন্যদিকে, এটি স্বর্গে তৈরি ম্যাচের মতো শোনাচ্ছে।
বিটাউনটিকেডি

2

যদি প্রতিটি উত্তরকে স্ট্রিং হিসাবে এনকোড করা যায় তবে আপনি এটি করতে পারেন:

interface Question {
    int score(String answer);
    void display(String answer);
    void displayGraded(String answer);
}

যেখানে খালি স্ট্রিংটির কোনও প্রশ্নের উত্তর এখনও নেই। এটি প্রশ্নগুলি, উত্তরগুলি এবং জিইউআইকে পৃথক করার অনুমতি দেয় তবে বহুবিজ্ঞানের অনুমতি দেয়।

class MultipleChoice implements Question {
    MultipleChoiceView mcv;
    String question;
    String answerKey;
    String[] choices;

    MultipleChoice(
            MultipleChoiceView mcv, 
            String question, 
            String answerKey, 
            String... choices
    ) {
        this.mcv = mcv;
        this.question = question;
        this.answerKey = answerKey;
        this.choices = choices;
    }

    int score(String answer) {
        return answer.equals(answerKey); //Or whatever scoring logic
    }

    void display(String answer) {
        mcv.display(question, choices, answer);            
    }

    void displayGraded(String answer) {
        mcv.displayGraded(
            question, 
            answerKey, 
            choices, 
            answer, 
            score(answer)
        );            
    }
}

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

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

তবে, আপনি যদি প্রশ্নটি প্রদর্শিত হয় তার আরও গতিশীল নিয়ন্ত্রণ রাখতে চান তবে আপনি এটি করতে পারেন:

interface Question {
    int score(String answer);
    void display(MultipleChoiceView mcv, String answer);
}

এবং এই

class MultipleChoice implements Question {
    String question;
    String answerKey;
    String[] choices;

    MultipleChoice(
            String question, 
            String answerKey, 
            String... choices
    ) {
        this.question = question;
        this.answerKey = answerKey;
        this.choices = choices;
    }

    int score(String answer) {
        return answer.equals(answerKey); //Or whatever scoring logic
    }

    void display(MultipleChoiceView mcv, String answer) {
        mcv.display(
            question, 
            answerKey, 
            choices, 
            answer, 
            score(answer)
        );            
    }
}

এটির মধ্যে এমন একটি অপূর্ণতা রয়েছে যা এর জন্য এমন দৃষ্টিভঙ্গি প্রয়োজন যা সেগুলি প্রদর্শন করার প্রয়োজন হয় না score()বা answerKeyতাদের যখন প্রয়োজন হয় না তখন তাদের উপর নির্ভর করে। তবে এর অর্থ হ'ল আপনি যে ধরণের ব্যবহার করতে চান তার জন্য পরীক্ষার প্রশ্নগুলি পুনরায় তৈরি করতে হবে না।


সুতরাং এটি জিওআই কোড প্রশ্নের মধ্যে রাখে। আপনার "ডিসপ্লে" এবং "ডিসপ্লে গ্রেড" প্রকাশ করছে: প্রতিটি ধরণের "ডিসপ্লে" এর জন্য আমার আরও একটি ফাংশন থাকতে হবে।
নাথান মেরিল

একেবারে নয়, এটি এমন একটি দৃশ্যের একটি রেফারেন্স রাখে যা বহুকীর্ণ। এটি একটি জিইউআই হতে পারে, একটি ওয়েব পৃষ্ঠা, একটি পিডিএফ, যাই হোক না কেন। এটি একটি আউটপুট পোর্ট যা পাঠানো হচ্ছে বিন্যাস মুক্ত সামগ্রী।
candied_orange

@ নাথানমরিল দয়া করে সম্পাদনাটি নোট করুন
candied_orange

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

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

1

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

///Questions package

class Test {
  IList<Question> questions;
}

class Question {
  String Type;   //example; could be another type
  IList<QuestionInfo> Info;  //Simple array of key/value information
}

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

///GUI package

interface QuestionView {
  Boolean SupportsQuestion(Question question);
  View CreateView(Question question);
}

class MultipleChoiceQuestionView : QuestionView {
  Boolean SupportsQuestion(Question question){
    return question.Type == "multiple_coice";
  }

  //...more implementation
}
class TextBoxQuestionView : QuestionView { ... }
//...more views

//Assuming you have an array of QuestionView pre-configured
//with all currently available types of questions
for (Question question : questions) {
  for (QuestionView view : questionViews) {
    if (view.SupportsQuestion(question)) {
        display.add(view.CreateView(question));
    }
  }
}

মাল্টিপল চয়েসকুইশনভিউ মাল্টিপল চয়েস.চয়েজস ক্ষেত্রটি অ্যাক্সেস করার চেষ্টা করলে কী ঘটে? এটি একটি castালাই প্রয়োজন। অবশ্যই, যদি আমরা এই প্রশ্নটি ধরে নিই T টাইপটি অনন্য এবং কোডটি বুদ্ধিমান, এটি একটি দুর্দান্ত সুরক্ষিত কাস্ট, তবে এটি এখনও একটি অভিনেতা: পি
নাথান মেরিল

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

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

1

একটি কারখানার এটি করতে সক্ষম হওয়া উচিত। মানচিত্রটি স্যুইচ স্টেটমেন্টটি প্রতিস্থাপন করে, যা কেবল প্রশ্নবউয়ের সাথে প্রশ্নের (যা দর্শন সম্পর্কে কিছুই জানে না) জোড়া দেওয়ার জন্য প্রয়োজন।

interface QuestionView<T : Question>
{
    view();
}

class MultipleChoiceView implements QuestionView<MultipleChoiceQuestion>
{
    MultipleChoiceQuestion question;
    view();
}
...

class QuestionViewFactory
{
    Map<K : Question, V : QuestionView<K>> map;

    register<K : Question, V : QuestionView<K>>();
    getView(Question)
}

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

কারখানাটি প্রয়োগের শুরুতে প্রতিবিম্বের মাধ্যমে বা ম্যানুয়ালি পপুলেট হতে পারে।


আপনি যদি এমন কোনও সিস্টেমে থাকেন যেখানে ভিউ ক্যাচ করা গুরুত্বপূর্ণ ছিল (গেমের মতো), কারখানায় প্রশ্নোত্তরগুলির একটি পুল অন্তর্ভুক্ত থাকতে পারে।
এক্সট্রস

ক্যালাথের উত্তরের সাথে এটি বেশ মিল বলে মনে হচ্ছে: আপনি যখন তৈরি করবেন তখনও আপনাকে এমন Questionএকটি কাস্ট MultipleChoiceQuestionকরতে হবেMultipleChoiceView
নাথান মেরিল ২

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

0

আপনি প্রতিফলন সম্পর্কে কীভাবে অনুভব করছেন তার উপর নির্ভর করে এই বিষয়টি "টাইপ চেক এড়ানো" হিসাবে গণ্য তা আমি নিশ্চিত নই ।

// Either statically associate or have a register(Class, Supplier) method
Dictionary<Class<? extends Question>, Supplier<? extends QuestionViewer>> 
viewerFactory = // MultipleChoice => MultipleChoiceViewer::new etc ...

// ... elsewhere

for (Question question: questions){
    display.add(viewerFactory[question.getClass()]());
}

এটি মূলত একটি টাইপ চেক, তবে ifপ্রকারের চেক থেকে কোনও প্রকারের চেকের দিকে চলে যাওয়া dictionary। পাইথন কীভাবে সুইচ স্টেটমেন্টের পরিবর্তে অভিধান ব্যবহার করে। এটি বলেছিল, আমি বিবৃতিগুলির বিবরণীর চেয়ে এইভাবে পছন্দ করি ।
নাথান মেরিল

1
@ নাথানমারিল হ্যাঁ দুটি শ্রেণির শ্রেণিবিন্যাসকে সমান্তরালে রাখার জাভাতে কোনও দুর্দান্ত উপায় নেই। সি ++ এ আমি template <typename Q> struct question_traits;উপযুক্ত বিশেষায়নের সাথে একটি সুপারিশ করতাম
কালেথ

@ ক্যালথ, আপনি কি সেই তথ্যটি গতিশীলভাবে অ্যাক্সেস করতে পারবেন? আমি মনে করি আপনি একটি উদাহরণ দেওয়া হয়েছে সঠিক টাইপ নির্মাণ করতে হবে।
উইনস্টন ইওয়ার্ট

এছাড়াও, ফ্যাক্টরিটির সম্ভবত এটির কাছে প্রশ্ন উদাহরণটি প্রেরণ করা প্রয়োজন। দুর্ভাগ্যক্রমে এই প্যাটার্নটি অগোছালো করে তোলে, কারণ এটির জন্য সাধারণত একটি কুরুচিযুক্ত .ালাই প্রয়োজন।
উইনস্টন ইওয়ার্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.