উইনফর্মগুলিতে মডেল-ভিউ-উপস্থাপক


90

আমি প্রথমবারের মতো উইনফর্মগুলি ব্যবহার করে এমভিপি পদ্ধতিটি প্রয়োগ করার চেষ্টা করছি।

আমি প্রতিটি স্তরটির কার্যকারিতা বোঝার চেষ্টা করছি।

আমার প্রোগ্রামে আমার কাছে একটি জিইউআই বোতাম রয়েছে যা ক্লিক করার পরে একটি ওপেন ফাইলডিলোগ উইন্ডো খোলে।

সুতরাং এমভিপি ব্যবহার করে, জিইউআই বোতাম ক্লিক ইভেন্টটি পরিচালনা করে এবং তারপরে প্রেজেন্টার.ওপেনফাইলে () কল করে;

Presenter.openfile () এর মধ্যে, সেই ফাইলটি কি তখন মডেল স্তরে খোলার প্রতিনিধিত্ব করা উচিত, বা প্রক্রিয়া করার জন্য কোনও ডেটা বা যুক্তি না থাকায় কেবল অনুরোধের ভিত্তিতে কাজ করা এবং ওপেনফিল্ডিয়লগ উইন্ডোটি খোলা উচিত?

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

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

  1. উইনফর্মটি লোড হয়ে গেলে, এটির একটি ট্রিউব দেখুন obtain আমি কি এই ভেবে সঠিক হয়েছি যে ভিউটি কোনও পদ্ধতিতে যেমন কল করা উচিত যেমন: প্রেজেন্টার.জেট্রি (), এটি পরিবর্তিতভাবে মডেলকে উপস্থাপন করবে, যা ট্রিভিউয়ের ডেটা প্রাপ্ত করবে, এটি তৈরি করবে এবং এটি কনফিগার করবে, এটিকে ফিরিয়ে দেবে উপস্থাপক, যা ঘুরে দেখা যাবে যা যা কেবল তখন এটি নির্ধারণ করবে, বলুন, একটি প্যানেল?

  2. উইনফর্মের কোনও ডেটা নিয়ন্ত্রণের জন্য কি এটি একই হবে, যেমন আমারও একটি ডেটাগ্রিডভিউ রয়েছে?

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

  4. আমি কি এই ভেবে সঠিক হয়েছি যে ট্রিউউভিউ নোড রঙ থেকে শুরু করে ডেটাগ্রিড আকার ইত্যাদির উপস্থাপনা সম্পর্কিত প্রতিটি জিনিসই ভিউতে পরিচালনা করা উচিত?

আমি মনে করি যে এগুলি আমার মূল উদ্বেগ এবং আমি যদি বুঝতে পারি যে এর জন্য প্রবাহটি কেমন হওয়া উচিত আমি মনে করি আমি ঠিক আছি।


এই লিঙ্কটি লস্টেচিজস / ড্রেইকগ্রিয়ার/2008/11/23/… এমভিপির কিছু স্টাইল ব্যাখ্যা করে। এটি জোহানের দুর্দান্ত উত্তর ছাড়াও সহায়ক প্রমাণ করতে পারে।
ak3nat0n

উত্তর:


123

এটি এমভিপি এবং আপনার নির্দিষ্ট সমস্যাগুলিতে আমার নম্র গ্রহণ।

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

দ্বিতীয়ত , একটি দৃশ্য সর্বদা উপস্থাপক দ্বারা নিয়ন্ত্রিত হয় । এই জাতীয় উপস্থাপকের আইন, আচরণ এবং বৈশিষ্ট্যগুলি একটি ইন্টারফেস দ্বারাও বর্ণিত হয় । যতক্ষণ না এটি তার দৃষ্টিভঙ্গি ইন্টারফেসের আইন মানায় ততক্ষণ এই ইন্টারফেসটির কংক্রিট ভিউ বাস্তবায়নে আগ্রহ নেই।

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

তৃতীয়টির প্রভাবগুলি হ'ল :

  • উপস্থাপকের এমন কোনও পদ্ধতি নেই যা দর্শন কল করতে পারে তবে ভিউটিতে এমন ইভেন্ট রয়েছে যা উপস্থাপক সাবস্ক্রাইব করতে পারেন।
  • উপস্থাপক এর দৃষ্টিভঙ্গি জানেন। আমি কংক্রিট উপস্থাপকের উপর কনস্ট্রাক্টর ইনজেকশন দিয়ে এটি সম্পাদন করতে পছন্দ করি।
  • কোন উপস্থাপক এটি নিয়ন্ত্রণ করছে তা দর্শনটির কোনও ধারণা নেই; এটি কেবল কোনও উপস্থাপক সরবরাহ করা হবে না।

আপনার ইস্যুটির জন্য, উপরেরগুলি কিছুটা সরলীকৃত কোডে এটির মতো দেখতে পারে:

interface IConfigurationView
{
    event EventHandler SelectConfigurationFile;

    void SetConfigurationFile(string fullPath);
    void Show();
}

class ConfigurationView : IConfigurationView
{
    Form form;
    Button selectConfigurationFileButton;
    Label fullPathLabel;

    public event EventHandler SelectConfigurationFile;

    public ConfigurationView()
    {
        // UI initialization.

        this.selectConfigurationFileButton.Click += delegate
        {
            var Handler = this.SelectConfigurationFile;

            if (Handler != null)
            {
                Handler(this, EventArgs.Empty);
            }
        };
    }

    public void SetConfigurationFile(string fullPath)
    {
        this.fullPathLabel.Text = fullPath;
    }

    public void Show()
    {
        this.form.ShowDialog();        
    }
}

interface IConfigurationPresenter
{
    void ShowView();
}

class ConfigurationPresenter : IConfigurationPresenter
{
    Configuration configuration = new Configuration();
    IConfigurationView view;

    public ConfigurationPresenter(IConfigurationView view)
    {
        this.view = view;            
        this.view.SelectConfigurationFile += delegate
        {
            // The ISelectFilePresenter and ISelectFileView behaviors
            // are implicit here, but in a WinForms case, a call to
            // OpenFileDialog wouldn't be too far fetched...
            var selectFilePresenter = Gimme.The<ISelectFilePresenter>();
            selectFilePresenter.ShowView();
            this.configuration.FullPath = selectFilePresenter.FullPath;
            this.view.SetConfigurationFile(this.configuration.FullPath);
        };
    }

    public void ShowView()
    {
        this.view.SetConfigurationFile(this.configuration.FullPath);
        this.view.Show();
    }
}

উপরের পাশাপাশি, আমার সাধারণত একটি বেস IViewইন্টারফেস থাকে যেখানে আমি স্ট্যাশ করি Show()এবং যে কোনও মালিক দেখেন বা শিরোনাম দেখেন যা আমার দর্শনগুলি সাধারণত উপভোগ করে।

আপনার প্রশ্নের উত্তর:

1. উইনফর্মটি লোড হয়ে গেলে, এটির একটি ট্রিউব দেখুন obtain আমি কি এই ভেবে সঠিক হয়েছি যে ভিউটি কোনও পদ্ধতিতে যেমন কল করা উচিত যেমন: প্রেজেন্টার.জেট্রি (), এটি পরিবর্তিতভাবে মডেলকে উপস্থাপন করবে, যা ট্রিভিউয়ের জন্য ডেটা প্রাপ্ত করবে, এটি তৈরি করবে এবং এটি কনফিগার করবে, এটিকে ফিরিয়ে দেবে উপস্থাপক, যা ঘুরে দেখা যাবে যা পরে কেবল এটি অর্পণ করবে, বলতে, একটি প্যানেল?

আমি কল করবে IConfigurationView.SetTreeData(...)থেকে IConfigurationPresenter.ShowView()ডানদিকে কল করার আগে,IConfigurationView.Show()

২. উইনফর্মের কোনও ডেটা নিয়ন্ত্রণের জন্যও কি এটি একই হবে, যেমন আমারও একটি ডেটাগ্রিডভিউ রয়েছে?

হ্যাঁ, আমি এটির IConfigurationView.SetTableData(...)জন্য ফোন করব । এটি প্রদত্ত ডেটা ফর্ম্যাট করার দৃষ্টিভঙ্গি অবধি। উপস্থাপক কেবল দৃশ্যের চুক্তিটি মানেন যে এটি টবুলার ডেটা চায়।

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

প্লাগইনগুলি যদি ভিউ-রিলেটেড হয়, তবে ভিউগুলি তাদের সম্পর্কে জানা উচিত, তবে উপস্থাপক নয়। যদি সেগুলি সমস্ত ডেটা এবং মডেল সম্পর্কে থাকে তবে তাদের সাথে ভিউয়ের কিছু করার দরকার নেই।

৪. আমি কি ভেবে ভেবে ঠিক করেছি যে ট্রিউজভিউ নোডের রঙ থেকে শুরু করে ডাটাগ্রিডের আকার ইত্যাদির উপস্থাপনা সম্পর্কিত প্রতিটি জিনিসই ভিউতে পরিচালনা করা উচিত?

হ্যাঁ. এটিকে XML সরবরাহকারী উপস্থাপক হিসাবে ভাবুন যা ডেটা এবং সেই ভিউ যা ডেটা গ্রহণ করে এবং এতে একটি সিএসএস স্টাইলশিট প্রয়োগ করে describes কংক্রিটের ভাষায়, উপস্থাপক কল করতে পারেন IRoadMapView.SetRoadCondition(RoadCondition.Slippery)এবং তারপরে দৃশ্যটি লাল রঙে রাস্তাটি প্রেরণ করে।

ক্লিক করা নোডগুলির জন্য ডেটা সম্পর্কে কী?

৫. আমি যখন ট্রেইনোডগুলিতে ক্লিক করি, তখন আমি কি নির্দিষ্ট নোডটি দিয়ে উপস্থাপকের কাছে যাব এবং তারপরে উপস্থাপকটি কী ডেটা প্রয়োজন তা নিয়ে কাজ করবে এবং তারপরে মডেলটিকে সেই ভিউটিতে ফিরে উপস্থাপনের আগে সেই তথ্যটির জন্য জিজ্ঞাসা করবে?

যদি সম্ভব হয় তবে আমি গাছকে একটি শটে ভিউতে উপস্থাপন করার জন্য প্রয়োজনীয় সমস্ত ডেটা পাস করতাম। তবে যদি কিছু ডেটা শুরু থেকে পাস করার জন্য খুব বড় হয় বা যদি এটি প্রকৃতির গতিশীল হয় এবং মডেলটির (উপস্থাপকের মাধ্যমে) "সর্বশেষ স্ন্যাপশট" প্রয়োজন হয়, তবে আমি event LoadNodeDetailsEventHandler LoadNodeDetailsভিউ ইন্টারফেসের মতো কিছু যুক্ত করব , যাতে উপস্থাপিকা এতে সাবস্ক্রাইব করতে পারবেন, LoadNodeDetailsEventArgs.Nodeমডেল থেকে নোড ইন (সম্ভবত কোনও ধরণের আইডির মাধ্যমে) বিশদটি আনতে পারেন , যাতে ইভেন্ট হ্যান্ডলার প্রতিনিধি ফিরে আসার সাথে ভিউটি তার প্রদর্শিত নোডের বিশদ আপডেট করতে পারে। নোট করুন যে কোনও ভাল ব্যবহারকারীর অভিজ্ঞতার জন্য ডেটা আনতে খুব ধীর হতে পারে তবে এগুলির async নিদর্শনগুলির প্রয়োজন হতে পারে।


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

11
@lejon: আপনি বলে যে দৃশ্য একটি উপস্থাপক রয়ে দেখতে ও উপস্থাপক মধ্যে যোগাযোগ হওয়া সত্ত্বেও , কিন্তু আমি দৃঢ়ভাবে একমত নন। আমার অবস্থানটি হ'ল: যখন উপস্থাপক সম্পর্কে ভিউটি জানে, তারপরে প্রতিটি দৃশ্যের ইভেন্টের জন্য ভিউটি অবশ্যই সিদ্ধান্ত নিতে পারে যে কোন উপস্থাপক পদ্ধতিটি কল করার জন্য উপযুক্ত। এটি "জটিলতার 2 পয়েন্ট", যেহেতু দৃশ্যটি সত্যই জানে না যে কোন ভিউ ইভেন্টটি কোন উপস্থাপক পদ্ধতির সাথে সামঞ্জস্য করে । চুক্তি এটি নির্দিষ্ট করে না।
জোহান জেরেল

4
@ লেজোন: অন্যদিকে, যদি দৃষ্টিভঙ্গি কেবল আসল ঘটনাটিই প্রকাশ করে, তবে উপস্থাপক নিজেই (যে কোনও দৃশ্যের ইভেন্টটি ঘটে যখন এটি কী করতে চায় তা জানে) সঠিক কাজটি করার জন্য কেবল তার সাবস্ক্রাইব করে। এটি কেবল "জটিলতার 1 পয়েন্ট", যা আমার বইয়ের "জটিলতার 2 পয়েন্ট" হিসাবে দ্বিগুণ। সাধারণভাবে বলতে গেলে, কম সংযোজন মানে কোনও প্রকল্প পরিচালনার চেয়ে কম রক্ষণাবেক্ষণ ব্যয়।
জোহান জেরেল

9
আমিও এই লিঙ্কটিতে ব্যাখ্যা অনুযায়ী এনক্যাপসুলেটেড উপস্থাপক ব্যবহার করার ঝোঁক লস্টেচিজ . com/derekgreer/2008/11/23/ … যেখানে ভিউ উপস্থাপকের একমাত্র ধারক।
ak3nat0n

4
@ ak3nat0n: আপনার সরবরাহিত লিঙ্কে এমভিপি তিনটি শৈলীর বিষয়ে সম্মতি জানিয়ে আমি বিশ্বাস করি যে জোহানের এই উত্তরটি তৃতীয় শৈলীর সাথে সান্নিধ্যের সাথে মিলিত হতে পারে যা পর্যবেক্ষক উপস্থাপক শৈলীর নাম দেওয়া হয়েছে : "পর্যবেক্ষক উপস্থাপক শৈলীর সুবিধা এটি হ'ল এটি ভিউ থেকে উপস্থাপকের জ্ঞানকে পুরোপুরি ডিউপল করে দেয় উপস্থাপকের মধ্যে পরিবর্তনের জন্য ভিউকে কম সংবেদনশীল করে তোলে। "
ডেভিডআরআর

11

উপস্থাপক, যা দর্শনে সমস্ত যুক্তিযুক্ত রয়েছে , @ জোখেমকিম্পে বলেছেন যেভাবে বোতামটি ক্লিক করা হচ্ছে তেমন প্রতিক্রিয়া জানানো উচিত । ব্যবহারিক শর্তাবলী, বাটন ক্লিক ইভেন্ট হ্যান্ডলার কল presenter.OpenFile()। উপস্থাপক তখন কী করা উচিত তা নির্ধারণ করতে সক্ষম হন।

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

তারপরে নির্বাচিত ফাইলটি উপস্থাপকের কাছে ফিরে আসবে যা এর যুক্তি অবিরত করে। এতে মডেল বা পরিষেবা ফাইলের প্রক্রিয়াজাতকরণের জন্য জড়িত থাকতে পারে।

এমভিপি প্যাটার্ন ব্যবহারের প্রাথমিক কারণ, ইমো হ'ল যুক্তি থেকে ইউআই প্রযুক্তি আলাদা করা। সুতরাং উপস্থাপনাটি সমস্ত যুক্তিকে অর্কেস্ট্রেট করে যখন ভিউটি এটি ইউআই যুক্তি থেকে পৃথক করে। এটি উপস্থাপককে পুরো ইউনিট পরীক্ষামূলক করে তোলার খুব সুন্দর পার্শ্ব প্রতিক্রিয়া রয়েছে।

আপডেট: যেহেতু উপস্থাপক একটি নির্দিষ্ট দৃশ্যে পাওয়া যুক্তির মূর্ত প্রতীক , তাই ভিউ-উপস্থাপক সম্পর্ক আইএমও হ'ল এক থেকে একের সম্পর্ক। এবং সমস্ত ব্যবহারিক উদ্দেশ্যে, একটি দর্শন উদাহরণ (একটি ফর্ম বলুন) একটি উপস্থাপক উদাহরণ সহ ইন্টারঅ্যাক্ট করে এবং একটি উপস্থাপক উদাহরণ কেবলমাত্র একটি দর্শন দৃষ্টান্ত সহ ইন্টারঅ্যাক্ট করে।

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


ধন্যবাদ সুতরাং উপস্থাপকটিতে। পরিবর্তে এটি সেই উইন্ডোটি দেখানোর জন্য দর্শনে ফিরে যেতে হবে?
ড্যারেন ইয়াং

4
ঠিক আছে, আমি কখনই উপস্থাপক সরাসরি ডায়ালগ বাক্স খুলতে দেব না, কারণ এটি আপনার পরীক্ষাগুলি ভঙ্গ করে। হয় দেখার জন্য অফলোড করুন বা, যেমনটি আমি কিছু পরিস্থিতিতে করেছি, একটি পৃথক "ফাইলআপনিপরিষদ" শ্রেণীর আসল সংলাপের ইন্টারঅ্যাকশন হ্যান্ডেল করা উচিত। এইভাবে আপনি পরীক্ষার সময় ফাইল খোলার পরিষেবা নকল করতে পারেন। আলাদা কোডে এ জাতীয় কোড স্থাপন করা আপনাকে পুনরায় ব্যবহারের পক্ষে খুব ভাল পার্শ্ব প্রতিক্রিয়া দিতে পারে :)
পিটার লিলভোল্ড

2

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

ধরে নেওয়া যাক আপনার মডেলটিতে কিছু সত্ত্বা তৈরি করতে আপনার ডেটা দরকার। আপনি স্ট্রিম ট্রটটি অ্যাক্সেস লেয়ারে যেতে পারেন যেখানে আপনার স্ট্রিম থেকে সত্তা তৈরির পদ্ধতি রয়েছে তবে আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি আপনার উপস্থাপকটিতে ফাইলটি পার্সিং পরিচালনা করবেন এবং আপনার মডেলটিতে কোনও কনস্ট্রাক্টর বা সত্তা প্রতি পদ্ধতি তৈরি করুন use


4
উত্তরের জন্য ধন্যবাদ. এছাড়াও, আপনি কি দেখার জন্য একটি একক উপস্থাপক থাকবেন? এবং সেই উপস্থাপক হয় হয় অনুরোধটি পরিচালনা করে, বা যদি ডেটা প্রয়োজন হয়, তবে এটি নির্দিষ্ট সংখ্যার উপর ভিত্তি করে যে কোনও মডেল ক্লাসের প্রতিনিধিত্ব করে? এটা কি সঠিক উপায়? আবার ধন্যবাদ.
ড্যারেন ইয়ং

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