এমভিভিএম হ'ল দুর্বল নকশাকৃত ডেটা বাইন্ডিং স্তরগুলির জন্য একটি ব্যান্ড-সহায়তা। বিশেষত, ডব্লিউপিএফ / এক্সএএমএল-তে ডেটা বন্ডিংয়ের সীমাবদ্ধতার কারণে এটি ডাব্লুপিএফ / সিলভারলাইট / ডাব্লুপি 7 জগতে প্রচুর ব্যবহার দেখতে পেয়েছে।
এখন থেকে, আমি ধরে নেব যে আমরা ডাব্লুপিএফ / এক্সএএমএল এর সাথে কথা বলছি কারণ এটি বিষয়গুলি আরও পরিষ্কার করে দেবে। এমভিভিএম ডাব্লুপিএফ / এক্সএএমএল সমাধানের জন্য নির্ধারিত কিছু ত্রুটিগুলি দেখুন।
ডেটা শেপ বনাম ইউআই শেপ
এমভিভিএম-এর 'ভিএম' সিএম-এ সংজ্ঞায়িত অবজেক্টের একটি সেট তৈরি করে যা মানচিত্রটি এক্সএএমএল-এ সংজ্ঞায়িত উপস্থাপনের সামগ্রীর উপর সেট করে। এই সি # অবজেক্টগুলি সাধারণত উপস্থাপনা অবজেক্টগুলিতে ডেটা কনটেক্সট বৈশিষ্ট্যের মাধ্যমে এক্সএএমএল-এর সাথে সংযুক্ত থাকে।
ফলস্বরূপ, ভিউ মডেল অবজেক্ট গ্রাফটি আপনার অ্যাপ্লিকেশনটির উপস্থাপনা অবজেক্ট গ্রাফের উপরে মানচিত্রের প্রয়োজন। এটি বলার অপেক্ষা রাখে না যে ম্যাপিংটি একে একে একে হওয়া দরকার, তবে যদি উইন্ডো নিয়ন্ত্রণের মাধ্যমে একটি তালিকা নিয়ন্ত্রণ থাকে তবে উইন্ডোটির ডেটা কনটেক্সট অবজেক্ট থেকে কোনও বস্তুর কাছে যাওয়ার উপায় থাকতে হবে যা সেই তালিকার ডেটা বর্ণনা করে।
ভিউ মডেল অবজেক্ট গ্রাফটি ui অবজেক্ট গ্রাফ থেকে মডেল অবজেক্ট গ্রাফটিকে সাফল্যের সাথে ডিউপল করে তবে অতিরিক্ত ভিউ মডেল স্তর ব্যয় করে এটি অবশ্যই নির্মিত এবং রক্ষণাবেক্ষণ করতে হবে।
আমি যদি স্ক্রিন এ থেকে স্ক্রিন বি তে কিছু ডেটা স্থানান্তর করতে চাই তবে আমাকে ভিউমোডেলগুলি নিয়ে গোলমাল করতে হবে। কোনও ব্যবসায়ের লোকের মনে এটি একটি ইউআই পরিবর্তন। এটি XAML বিশ্বে বিশুদ্ধভাবে স্থান নেওয়া উচিত । দুঃখের বিষয়, এটি খুব কমই পারে। সবচেয়ে খারাপ, কীভাবে ভিউমোডেলগুলি কাঠামোগত করা হয় এবং কীভাবে সক্রিয়ভাবে ডেটা পরিবর্তিত হয় তার উপর নির্ভর করে এই পরিবর্তনটি সম্পাদন করতে বেশ কিছুটা ডেটা রি-রুটিং প্রয়োজন হতে পারে।
আনস্প্রেসিভ ডেটা বাইন্ডিংয়ের আশেপাশে কাজ করা
ডাব্লুপিএফ / এক্সএএমএল বাইন্ডিংগুলি অপর্যাপ্তভাবে প্রকাশযুক্ত ive আপনি মূলত কোনও অবজেক্টে পৌঁছানোর উপায় প্রদান করতে পারেন, একটি সম্পত্তি পথ পাড়ি দেওয়ার জন্য এবং উপস্থাপনের বস্তুর যা প্রয়োজন তার সাথে ডেটা প্রপার্টিটির মানটিকে অভিযোজিত রূপান্তরকারীকে বাধ্য করে।
আপনার যদি এর চেয়ে আরও জটিল কিছুতে সি # তে কোনও সম্পত্তি বাঁধতে হয় তবে আপনি মূলত ভাগ্যের বাইরে। আমি বাঁধাই রূপান্তরকারী ছাড়া এমন কোনও ডাব্লুপিএফ অ্যাপটি কখনই দেখিনি যা সত্য / মিথ্যাটিকে দৃশ্যমান / সঙ্কুচিত হয়ে যায়। অনেক ডাব্লুপিএফ অ্যাপ্লিকেশনগুলিতে নেগাটিংভিজিবিলিটি কনভার্টর বা অনুরূপ কিছু রয়েছে যা পোলারিটি ফ্লিপ করে। এটি অ্যালার্ম ঘন্টা বন্ধ করা উচিত।
এমভিভিএম আপনাকে আপনার সি # কোড গঠনের জন্য গাইডলাইন দেয় যা এই সীমাবদ্ধতাটি মসৃণ করতে ব্যবহার করা যেতে পারে। আপনি নিজের ভিউ মডেলটিতে সামারবাটনভিজিবিলিটি নামে একটি সম্পত্তি প্রকাশ করতে পারেন এবং এটিকে কেবল বোতামটির দৃশ্যমানতার সাথে আবদ্ধ করতে পারেন। আপনার এক্সএএমএল এখন খুব সুন্দর এবং সুন্দর ... তবে আপনি নিজেকে কেরানী হিসাবে পরিণত করেছেন - আপনার ইউআইটি যখন বিকশিত হয় তখন আপনাকে এখন দুটি স্থানে + আপডেট বাইন্ডিংগুলি প্রকাশ করতে হবে। অন্য স্ক্রিনে থাকতে যদি আপনার একই বোতামের দরকার হয় তবে আপনাকে সেই ভিউ মডেলটিতে একই জাতীয় সম্পত্তিটি প্রকাশ করতে হবে যা সেই স্ক্রিনটি অ্যাক্সেস করতে পারে। সবচেয়ে খারাপ, আমি কেবল এক্সএএমএল-এর দিকে তাকাতে পারি না এবং দেখতে পাচ্ছি বোতামটি আর কখন প্রদর্শিত হবে। বাইন্ডিংগুলি সামান্য অযৌক্তিক হয়ে উঠার সাথে সাথে আমাকে সি # কোডে গোয়েন্দা কাজ করতে হবে।
ডেটা অ্যাক্সেস আক্রমণাত্মকভাবে বাদ দেওয়া হয়
যেহেতু ডেটা কনটেক্সট বৈশিষ্ট্যগুলির মাধ্যমে ডেটা সাধারণত ইউআইতে প্রবেশ করে তাই আপনার অ্যাপ্লিকেশন জুড়ে নিয়মিতভাবে বৈশ্বিক বা সেশন ডেটার প্রতিনিধিত্ব করা শক্ত।
"বর্তমানে ব্যবহারকারী হিসাবে লগ ইন করা" এর ধারণাটি একটি দুর্দান্ত উদাহরণ - এটি আপনার অ্যাপ্লিকেশনটির একটি উদাহরণের মধ্যে প্রায়শই সত্যিকার অর্থে একটি বিশ্বব্যাপী জিনিস। ডাব্লুপিএফ / এক্সএএমএল-তে সামঞ্জস্যপূর্ণ পদ্ধতিতে বর্তমান ব্যবহারকারীর কাছে বিশ্বব্যাপী অ্যাক্সেস নিশ্চিত করা খুব কঠিন।
আমি যা করতে চাই তা হ'ল ডেটা বাইন্ডিংয়ে "কারেন্ট ইউজার" শব্দটি বর্তমানে লগ ইন করা ব্যবহারকারীকে উল্লেখ করার জন্য নির্বিঘ্নে ব্যবহার করুন। পরিবর্তে, আমাকে নিশ্চিত করতে হবে যে প্রতিটি ডেটা কনটেক্সট আমাকে বর্তমান ব্যবহারকারীর অবজেক্টে যাওয়ার উপায় দেয়। এমভিভিএম এটি সামঞ্জস্য করতে পারে তবে ভিউমোডালরা একটি বিশৃঙ্খলা হতে চলেছে যেহেতু তাদের সকলকেই এই বিশ্বব্যাপী ডেটাতে অ্যাক্সেস সরবরাহ করতে হবে।
একটি উদাহরণ যেখানে এমভিভিএম পড়ে যায়
বলুন আমাদের কাছে ব্যবহারকারীদের একটি তালিকা রয়েছে। প্রতিটি ব্যবহারকারীর পাশে, আমরা একটি "ব্যবহারকারী মুছুন" বোতামটি প্রদর্শন করতে চাই তবে কেবলমাত্র বর্তমানে লগ ইন করা ব্যবহারকারী যদি প্রশাসক হন। এছাড়াও, ব্যবহারকারীদের নিজেকে মুছে ফেলার অনুমতি নেই।
আপনার মডেল অবজেক্টগুলিকে বর্তমানে লগ ইন করা ব্যবহারকারী সম্পর্কে জানা উচিত নয় - তারা কেবল আপনার ডাটাবেসে ব্যবহারকারীর রেকর্ড উপস্থাপন করবে তবে কোনওভাবে বর্তমানে লগ ইন করা ব্যবহারকারীকে আপনার তালিকার সারিগুলির মধ্যে ডেটা বাইন্ডিংয়ের সাথে প্রকাশ করা দরকার। এমভিভিএম হুকুম দেয় যে আমাদের প্রতিটি তালিকার সারিটির জন্য একটি ভিডমোডেল অবজেক্ট তৈরি করা উচিত যা বর্তমানে সেই তালিকার সারি দ্বারা উপস্থাপিত ব্যবহারকারীর সাথে লগইন করা ব্যবহারকারীকে তৈরি করা উচিত, তারপরে সেই ভিউমোডেল অবজেক্টে "মুছুন বাটনভিসিবিবিলিটি" বা "ক্যানডিলেট" নামে একটি সম্পত্তি প্রকাশ করুন (আপনার অনুভূতির উপর নির্ভর করে) বাঁধাই রূপান্তরকারী সম্পর্কে)।
এই অবজেক্টটি বেশিরভাগ অন্যান্য উপায়ে ব্যবহারকারীর মতো একটি ভয়াবহ চেহারা দেখতে চলেছে - এটি ব্যবহারকারীর মডেল অবজেক্টের সমস্ত বৈশিষ্ট্য প্রতিবিম্বিত করতে পারে এবং পরিবর্তিত হওয়ার সাথে সাথে সেই ডেটাতে আপডেটগুলি ফরোয়ার্ড করতে পারে। এটি সত্যই অদ্ভুত অনুভূত হয় - আবারও, এমভিভিএম আপনাকে এই ব্যবহারকারী-কর্মালীকে অবজেক্টটি বজায় রাখতে বাধ্য করে আপনাকে একজন কেরানী করে তোলে।
বিবেচনা করুন - আপনাকে সম্ভবত একটি ডাটাবেস, মডেল এবং দৃশ্যে আপনার ব্যবহারকারীর বৈশিষ্ট্যগুলিও উপস্থাপন করতে হবে। আপনার এবং আপনার ডাটাবেসের মধ্যে যদি আপনার একটি API থাকে, তবে এটি আরও খারাপ they এগুলি ডেটাবেস, API সার্ভার, এপিআই ক্লায়েন্ট, মডেল এবং দৃশ্যে উপস্থাপিত হয়। আমি কোনও ডিজাইনের ধরণ অবলম্বন করতে সত্যই দ্বিধা বোধ করব যা অন্য একটি স্তর যুক্ত করেছিল যা প্রতিবার কোনও সম্পদ যুক্ত বা পরিবর্তিত হওয়ার পরে স্পর্শ করা দরকার।
আরও খারাপ, এই স্তরটি আপনার ইউআই এর জটিলতার সাথে স্কেল করে, আপনার ডেটা মডেলের জটিলতার সাথে নয়। প্রায়শই একই তথ্যটি অনেক জায়গায় এবং আপনার ইউআইতে প্রতিনিধিত্ব করা হয় - এটি কেবল একটি স্তর যুক্ত করে না, এটি প্রচুর অতিরিক্ত পৃষ্ঠের ক্ষেত্র সহ স্তর যুক্ত করে!
কীভাবে জিনিস হতে পারে
উপরে বর্ণিত ক্ষেত্রে, আমি বলতে চাই:
<Button Visibility="{CurrentUser.IsAdmin && CurrentUser.Id != Id}" ... />
কারেন্ট ইউজারটি আমার অ্যাপ্লিকেশনটিতে সমস্ত এক্সএএমএল-তে বিশ্বব্যাপী উন্মুক্ত হবে। আইডিটি আমার তালিকা সারিটির জন্য ডেটা কনটেক্সট-এর কোনও সম্পত্তিকে উল্লেখ করবে। দৃশ্যমানতা স্বয়ংক্রিয়ভাবে বুলেট থেকে রূপান্তরিত হবে। আইডি, কারেন্টইউজার.আইএসএডমিন, কারেন্ট ইউজার বা কারেন্ট ইউজার.আইডি-তে কোনও আপডেট এই বোতামটির দৃশ্যমানতার জন্য একটি আপডেট ট্রিগার করবে। সহজ কিছু.
পরিবর্তে, ডাব্লুপিএফ / এক্সএএমএল তার ব্যবহারকারীদের একটি সম্পূর্ণ গন্ডগোল তৈরি করতে বাধ্য করে। আমি যতদূর বলতে পারি, কিছু সৃজনশীল ব্লগার সেই জগাখিচুবিতে একটি নাম চাপড়েছিলেন এবং সেই নামটি ছিল এমভিভিএম। বোকা বানাবেন না - এটি জিওএফ ডিজাইনের ধরণগুলির মতো একই শ্রেণিতে নয়। কুৎসিত ডেটা বাঁধাই সিস্টেমের চারপাশে কাজ করার জন্য এটি একটি কুৎসিত হ্যাক।
(আপনি আরও পড়া সন্ধানের ক্ষেত্রে এই পদ্ধতির মাঝে মাঝে "ফাংশনাল রিঅ্যাকটিভ প্রোগ্রামিং" হিসাবে উল্লেখ করা হয়)।
উপসংহারে
আপনার যদি ডাব্লুপিএফ / এক্সএএমএলএলতে অবশ্যই কাজ করতে হয় তবে আমি এখনও এমভিভিএমের প্রস্তাব দিই না।
উপরের উদাহরণে "কীভাবে জিনিসগুলি হতে পারে" এর মতো আপনার কোডটি কাঠামোগত করাতে চান - মডেলটি সরাসরি দেখার জন্য উন্মুক্ত করা হয়, জটিল ডেটা বাঁধাইয়ের এক্সপ্রেশন + নমনীয় মান মানসিক চাপ সহ। এটি উপায় ভাল - আরও পাঠযোগ্য, আরও লেখার যোগ্য এবং আরও রক্ষণাবেক্ষণযোগ্য।
এমভিভিএম আপনাকে আপনার কোডটি আরও ভার্বোজ, কম রক্ষণাবেক্ষণযোগ্য পদ্ধতিতে কাঠামো করতে বলেছে।
এমভিভিএম এর পরিবর্তে, ভাল অভিজ্ঞতা আনুমানিকভাবে সহায়তা করতে কিছু স্টাফ তৈরি করুন: আপনার ইউআইতে ধারাবাহিকভাবে বৈশ্বিক রাষ্ট্র প্রকাশের জন্য একটি সম্মেলন বিকাশ করুন। বাঁধাই রূপান্তরকারী, মাল্টিবাইন্ডিং ইত্যাদির বাইরে নিজেকে কিছু সরঞ্জাম তৈরি করুন যা আপনাকে আরও জটিল বাঁধার অভিব্যক্তি প্রকাশ করতে দেয়। সাধারণ জবরদস্তি ঘটনাগুলি কম বেদনাদায়ক করে তুলতে নিজেকে বাঁধাই রূপান্তরকারীদের একটি গ্রন্থাগার তৈরি করুন।
আরও ভাল - এক্সএএমএলকে আরও উদ্বেগজনক কিছু দিয়ে প্রতিস্থাপন করুন। সিএমএল অবজেক্টগুলি ইনস্ট্যান্ট করার জন্য এক্সএএমএল একটি খুব সাধারণ এক্সএমএল ফর্ম্যাট - এটি আরও বেশি উদ্বেগজনক বৈকল্পিকের সাথে আসা শক্ত হবে না।
আমার অন্যান্য প্রস্তাবনা: এমন কৌশল সরঞ্জাম ব্যবহার করবেন না যা এই ধরণের আপসকে বাধ্য করে। তারা আপনার সমস্যার ডোমেনটির দিকে মনোনিবেশ করার পরিবর্তে আপনাকে এমভিভিএমের মতো ক্র্যাপের দিকে ঠেলা দিয়ে আপনার শেষ পণ্যের গুণমানকে আঘাত করবে।