এমভিপি প্যাটার্নে ভিউয়ের ইউআই সামগ্রীর উপর ভিত্তি করে কোনও মডেল অবজেক্ট ইনস্ট্যান্ট করা উচিত, বা কেবল এই বিষয়বস্তুকে উপস্থাপকের হিসাবে উপস্থাপকের কাছে পাস করা উচিত?


9

আমি বিকাশ করছি এমন একটি অ্যান্ড্রয়েড অ্যাপে এমভিপি প্যাটার্ন ব্যবহার করছি।

আমার মূলত 4 টি উপাদান রয়েছে:

  1. অ্যাডউজারভিউ যেখানে নতুন ব্যবহারকারী যুক্ত করা যায়:
  2. অ্যাড ইউজারপ্রিসেন্টার
  3. ইউজারআইএনফো (পোজো)
  4. ইউজারআইফোনম্যানেজার (ব্যাসনেস লজিক এবং স্টোরেজ ম্যানেজার)

আমার প্রশ্নটি হ'ল:

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

উত্তর:


8

মার্টিন ফাউলারের এমভিপির বর্ণনা অনুসারে ( http://martinfowler.com/eaaDev/uiArchs.html )

এমভিসির ভিউ অংশের মধ্যে ফওলার বলেছেন:

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

(সাহসী জোর খনি)

তারপরে উপস্থাপকের:

ব্যবহারকারীর সক্রিয় প্রতিক্রিয়া পৃথক উপস্থাপক বস্তুতে জীবনকে কাজ করে। ব্যবহারকারীর অঙ্গভঙ্গির জন্য মৌলিক হ্যান্ডলারগুলি উইজেটগুলিতে এখনও বিদ্যমান, তবে এই হ্যান্ডলারগুলি কেবল উপস্থাপকের কাছে নিয়ন্ত্রণ দেয়

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

(আবার, সাহসী জোর খনি)

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

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

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

// The view would implement IView
public interface IView {

    public UserInfo GetUserInfo();
}

// Presenter
public class AddUserPresenter {

    private IView addUserView;

    public void SetView(IView view) {
        addUserView = view
    }

    public void onSomethingClicked() {

        UserInfo userInfo = addUserView.GetUserInfo();
        // etc.
    }
}

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

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

    private boolean IsUsernameValid() {
        String username = addUserView.GetUsername();
        return (username != null && !username.isEmpty());
    }

    public void onSomethingClicked() {            

        if (IsUsernameValid()) {
            UserInfo userInfo = addUserView.GetUserInfo();
            // etc.
        }
    }

এই যুক্তি উপস্থাপকের ভিতরে রয়ে গেছে, এবং ভিউটিতে যুক্ত করার দরকার নেই। যদি দর্শনটি কল করার জন্য দায়ী ছিল GetUserInfo()তবে এটি এর ব্যবহারকে ঘিরে যে কোনও যুক্তি রয়েছে তার জন্য এটিও দায়ী; যা এমভিপি প্যাটার্নটি এড়াতে চাইছে।

সুতরাং যে পদ্ধতিটি তৈরি করে যা UserInfoশারীরিকভাবে ভিউ ক্লাসে বিদ্যমান থাকতে পারে, এটি কখনও ভিউ ক্লাস থেকে বলা হয় না, কেবল উপস্থাপক থেকে।

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

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


1
দুর্দান্ত উত্তর @ বেনকোটরেল! তবে আমার আর একটি আছে :) উপস্থাপক পদ্ধতিগুলির নামকরণ করা কি একটি ভাল অনুশীলন onSomethingClicked(), তাই যখন ব্যবহারকারী "কিছু" ক্লিক করেন, ভিউ কল করেন presenter.onSomethingClicked()? বা আমার উপস্থাপক পদ্ধতিগুলি আমার ক্ষেত্রে অভিযুক্ত ক্রিয়া হিসাবে নামকরণ করা উচিত addUser()?
রামুলো.এডু

1
@regmoraes ভাল প্রশ্ন; এবং আমি মনে করি আপনি আমার উদাহরণ কোডটিতে কিছুটা গন্ধ হাইলাইট করেছেন । Presenterডোমেইন যুক্তিবিজ্ঞান UI 'তে যুক্তিবিজ্ঞান বদলে বিভাগে দায়ী, এবং বিশেষভাবে উপযোগী View, অতএব ধারণা যার কোন অস্তিত্ব উচিত, UI' তে ধারণা তাই একটি পদ্ধতি নামে onSomethingClicked()প্রকৃতপক্ষে উপযুক্ত। পূর্ববর্তী দৃষ্টির সাথে, উপরে আমার উদাহরণে আমি যে নামকরণটি বেছে নিয়েছি তা পুরোপুরি সঠিক গন্ধ পায় না :-)।
বেন কটরেল

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

1
@ ব্ল্যাককারা দর্শনীয় মডেলUserInfo হিসাবে বিবেচনা করার বিষয়টি বিবেচনা করুন (ওরফে "ভিউ মডেল") - সেই পরিস্থিতিতে আমি চেক বাক্সের রাজ্য এবং পাঠ্য বাক্সের খালি / নালাগুলি যুক্ত করব । আপনি এমনকি এটির নামকরণের বিষয়টি বিবেচনা করতে পারেন, যদি তা পোজোর এমন এক শ্রেণীর হিসাবে বিবেচনা করতে সহায়তা করে যার একমাত্র আসল উদ্দেশ্য হ'ল রাজ্য সম্পর্কে তথ্য সন্ধান করা। booleanStringUserInfoUserInfoViewModelUserInfoPresenter
বেন কট্রেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.