মার্টিন ফাউলারের এমভিপির বর্ণনা অনুসারে ( 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
কোনও উইজেটের সম্পত্তি সম্পর্কিত অবস্থা - একটি খালি পাঠ্যবক্স বা চেকবক্সের জন্য একটি বুলিয়ান পরীক্ষা করে থাকে), তবে এটি উপস্থাপকের অন্তর্ভুক্ত।
onSomethingClicked()
, তাই যখন ব্যবহারকারী "কিছু" ক্লিক করেন, ভিউ কল করেনpresenter.onSomethingClicked()
? বা আমার উপস্থাপক পদ্ধতিগুলি আমার ক্ষেত্রে অভিযুক্ত ক্রিয়া হিসাবে নামকরণ করা উচিতaddUser()
?