আমি কীভাবে একটি সি # উইনফোর্ডস অ্যাপ্লিকেশনটিতে এমভিসি প্যাটার্ন প্রয়োগ করতে পারি?


11

আমি একজন সি ++ বিকাশকারী যিনি তখন থেকেই জিইউআই ডিজাইনের জন্য এমভিসি প্যাটার্নটি ব্যবহার করে আসছেন।

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

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

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

আমার জন্য আপনার কোন পরামর্শ আছে? সি # তে উইন্ডোজ ফর্মগুলি সম্পর্কে আমার বোঝা কি এখনও এমভিসি বাস্তবায়ন চেষ্টা করার পক্ষে যথেষ্ট ভাল নয়? আমি কি ফর্ম শ্রেণিকে ভুল ভূমিকা দিচ্ছি? এমভিসি কি কেবল এই ব্যবহারের ক্ষেত্রে একটি অনুপযুক্ত আর্কিটেকচার?


1
ওটি প্রশ্ন। তবে ডাব্লুআইএনফর্মস কেন? ডাব্লুপিএফ উইনফর্মগুলি প্রতিস্থাপন করে এবং এমভিসি সমর্থন করে (ভাল প্রযুক্তিগতভাবে এমভিভিএম)। যদিও আমি বলব যে ডাব্লুপিএফ শেখার বক্ররেখা খাড়া হতে পারে। (তবে আপনি যদি এটি খারাপভাবে করেন তবে ডাব্লুপিএফ কোডটি উইনফর্মগুলির মতো দেখতে পারেন)
পিটার এম

1
@ পিটারএম: কারণ 10 বছর পরেও ডাব্লুপিএফ সফল হয় এবং এখনও ধীর হয়।
whatsisname

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

3
@ ওয়াটসিসনাম ডাব্লুপিএফ স্তন্যপান করতে পারে তবে খেলনা প্রোগ্রামের ওপরে ও উইন্ডোফর্মের চেয়ে কিছুটা কম খায়
পিটার এম

2
ইন-হাউস ডেস্কটপ প্রোগ্রামগুলির জন্য, আমি তাই বলব। তবে অনেক সংস্থা তাদের ব্যবসায়িক ক্রিয়াকলাপগুলির জন্য ব্রাউজার-ভিত্তিক অ্যাপ্লিকেশন পছন্দ করে, কেবল কোনও ইনস্টলেশন প্রয়োজন হয় না বলে।
রবার্ট হার্ভে

উত্তর:


3

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

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

এমভিসি কি কেবল এই ব্যবহারের ক্ষেত্রে একটি অনুপযুক্ত আর্কিটেকচার?

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

এমভিসি ব্যবহারের জন্য আমার কারণ: এটি আমার মতে বোঝার জন্য এটি মোটামুটি সহজ ডিজাইনের প্যাটার্ন এবং আমার ডিজাইনটি ব্যবহারকারী ইন্টারঅ্যাকশনের উপর নির্ভরশীল। এমভিসি যেভাবে বিকাশকারীকে উদ্বেগগুলি আলাদা করতে দেয় তা আমার আবেদনের জন্যও যথেষ্ট। এটি আমার কোডকে অনেক বেশি রক্ষণাবেক্ষণযোগ্য এবং পরীক্ষামূলক করে তোলে ।

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

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

উপস্থাপনা স্তর ব্যতীত প্রতিটি একক স্তর মেসেজিং সিস্টেমের উপর নির্ভর করে লক্ষ্য করুন। এটি একটি সাধারণ "ভাষা" যা সেই স্তরগুলির নিম্ন স্তর এবং উপ-সিস্টেমগুলি একে অপরের সাথে যোগাযোগের জন্য ব্যবহার করে। আমার ক্ষেত্রে এটি সম্পাদন করা যায় এমন ক্রিয়াকলাপগুলির ভিত্তিতে একটি সাধারণ গণনা ছিল was যা আমাকে পরবর্তী পয়েন্টে নিয়ে আসে ...

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

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

একবার বৈধতা এবং সংশ্লিষ্ট অবজেক্ট ম্যানিপুলেশন সম্পূর্ণ হয়ে গেলে, পরিষেবা পদ্ধতিটি নিয়ামককে একটি বার্তা কোড ফেরত দেবে। উদাহরণস্বরূপ MessageCodes.SaveSuccess,। নিয়ামক এবং পরিষেবা উভয় শ্রেণিই ডোমেন অবজেক্ট এবং / অথবা ক্রিয়াকলাপের সাধারণ সেটগুলির উপর ভিত্তি করে ছিল যাদের একসাথে গ্রুপ করা যায়।

উদাহরণস্বরূপ: FileMenuController(অপারেশনস: নিউপ্রজেক্ট, সেভপ্রজেক্ট, লোডপ্রজেক্ট) -> ProjectServices(ক্রিয়েটপ্রজেক্ট, পার্সিস্টপ্রজেক্টটফাইলে, লোডপ্রজেক্টফ্রোমফাইল)। Projectআপনার ডেটা মডেলটিতে একটি ডোমেন শ্রেণি কোথায় থাকবে। আমার ক্ষেত্রে কন্ট্রোলার এবং পরিষেবা ক্লাসগুলি অচল পদ্ধতিগুলির সাথে অস্থায়ী ক্লাস ছিল classes

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

ViewModelবর্গ ডোমেইন স্তর থেকে প্রাসঙ্গিক তথ্য যা গুই ভিউ আপডেট ব্যবহার করবে ধারণ করে। এই ভিউ মডেলগুলি ডোমেন ক্লাসগুলির মতো দেখায় তবে আমার ক্ষেত্রে আমি খুব চর্মসার বস্তু ব্যবহার করি । মূলত তাদের বেশ কিছু আচরণ নেই, কেবল অ্যাপ্লিকেশনটির নিম্ন স্তরের অবস্থা সম্পর্কে তথ্য রিলে করুন। অন্য কথায়, আমি উপস্থাপনা স্তরটিতে আমার ডোমেন ক্লাসগুলি দিতে যাচ্ছি না । এজন্যই Controllersএবং Servicesপ্যাকেজগুলি পরিষেবা স্তরটিকে দুটি ভাগে বিভক্ত করে। কন্ট্রোলাররা কখনই ডোমেন ক্লাস পরিচালনা করতে বা তাদের রাষ্ট্রকে বৈধতা দেবে না। তারা কেবল পরিষেবাগুলি ব্যবহার করতে পারে এমন উপাত্ত প্রাসঙ্গিক ডেটাতে জিইউআই সম্পর্কিত সম্পর্কিত ডেটা রূপান্তরকারী হিসাবে একটি সীমানা হিসাবে কাজ করে vice নিয়ামকটিতে পরিষেবা যুক্তি অন্তর্ভুক্ত করা খুব চর্বি হতে পারে নিয়ন্ত্রণকারী, যা রক্ষণাবেক্ষণ করা শক্ত are

আমি আশা করি এটি আপনাকে একটি সূচনা পয়েন্ট দেয়।

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