এমভিভিএম এবং পরিষেবা ধরণ


14

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

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

আমি কয়েকটি সমাধান নিয়ে ভাবছি:

  1. ইন্টারফেস হিসাবে সমস্ত উপলব্ধ পরিষেবাদি সমন্বিত একটি পরিষেবা সিঙ্গলটন (IServices) তৈরি করা হচ্ছে। উদাহরণ: পরিষেবাদি.কন্টেন.এক্সএক্সএক্সএক্স সার্ভিস.প্রসূতি (), পরিষেবাদি.সকালীন.ওয়াইওয়াই সার্ভিস। রিটারিভ ()। এইভাবে, আমার সেগুলিতে একটি টন পরিসেবা পরামিতি সহ একটি বিশাল নির্মাতা নেই।

  2. ভিউমোডেল দ্বারা ব্যবহৃত পরিষেবাগুলির জন্য একটি উপদ্বীপ তৈরি করা এবং এই দৃশ্যটি আমার ভিউমডেলের কর্টারে পাস করা। তবে তারপরে, আমার প্রতিটি জটিল ভিউমোডেলগুলির জন্য একটি মুখোমুখি তৈরি করতে হবে এবং এটি কিছুটা হতে পারে ...

এই ধরণের আর্কিটেকচার বাস্তবায়নের "সঠিক" উপায় কী বলে আপনি মনে করেন?


আমি মনে করি এটি করার "সঠিক" উপায়টি একটি পৃথক স্তর তৈরি করা যা পরিষেবাগুলিকে কল করে এবং ভিউমোডেলটি তৈরি করার জন্য যা প্রয়োজন কাস্টিংয়ের প্রয়োজন হয় does আপনার ভিউমোডেলগুলি তাদের তৈরি করার জন্য দায়বদ্ধ হওয়া উচিত নয়।
অ্যামি ব্লাকনশিপ

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

"উইল কখনও কখনও" এবং "উচিত" দুটি পৃথক প্রাণী;)
অ্যামি ব্লাকনশিপ

@ অ্যামিব্ল্যাঙ্কনিশিপ: আপনি কি পরামর্শ দিচ্ছেন যে ভিউ মডেলগুলি অন্য দর্শন মডেলগুলি তৈরি করবেন না? এটি গ্রাস করার জন্য একটি শক্ত বড়ি। আমি বুঝতে পেরেছি যে ভিউ মডেলগুলি newঅন্য ভিউ মডেলগুলি তৈরি করতে ব্যবহার করা উচিত নয় , তবে এমডিআই অ্যাপ্লিকেশনটির মতো সহজ কিছু মনে করুন যেখানে "নতুন ডকুমেন্ট" বোতাম বা মেনুতে ক্লিক করা একটি নতুন ট্যাব যুক্ত করবে বা একটি নতুন উইন্ডো খুলবে। শেল / কন্ডাক্টর অবশ্যই কোনও কিছুর নতুন দৃষ্টান্ত তৈরি করতে সক্ষম হতে পারে , যদিও তা এক বা কয়েকটি স্তরের পিছনে লুকিয়ে রয়েছে।
অ্যারোনআউট

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

উত্তর:


22

আসলে, এই দুটি সমাধানই খারাপ।

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

এটি মূলত সার্ভিস লোকেটার প্যাটার্ন , যা একটি অ্যান্টি-প্যাটার্ন। আপনি যদি এটি করেন, তবে আপনি আর এটি বুঝতে পারবেন না যে ভিউ মডেলটি এর ব্যক্তিগত প্রয়োগের দিকে না তাকিয়ে আসলে কী নির্ভর করে, যা পরীক্ষা বা রিফ্যাক্টরটিকে খুব কঠিন করে তুলবে।

ভিউমোডেল দ্বারা ব্যবহৃত পরিষেবাগুলির জন্য একটি উপদ্বীপ তৈরি করা এবং এই দৃশ্যটি আমার ভিউমডেলের কর্টারে পাস করা। তবে তারপরে, আমার প্রতিটি জটিল ভিউমোডেলগুলির জন্য একটি মুখোমুখি তৈরি করতে হবে এবং এটি কিছুটা হতে পারে ...

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

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

আপনি এই ভিউ মডেলগুলির মধ্যে একটির কীভাবে ইউনিট-টেস্ট করবেন তা ভাবুন। আপনার সেটআপ কোডটি কত বড় হতে চলেছে? এটি কাজ করার জন্য কতটি জিনিস আরম্ভ করা দরকার?

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

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

আপনি যদি এটি সঠিকভাবে সম্পন্ন করেছেন তবে কোডটি সন্ধান করা থেকে এটি স্পষ্ট হওয়া উচিত, কারণ আপনার কাছে সংক্ষিপ্ত, সংক্ষিপ্ত, সুনির্দিষ্ট এবং পরীক্ষামূলক দেখার মডেল থাকবে have


হ্যাঁ, আমি সম্ভবত এটিই শেষ করব! অনেক অনেক ধন্যবাদ, স্যার।
আলফা-আলফা

ঠিক আছে, আমি ইতিমধ্যে ধরে নিয়েছি তিনি ইতিমধ্যে এটি চেষ্টা করেছেন, তবে সফল হন নি। @ আলফা-আলফা
ইউফোরিক

@ ইউফোরিক: আপনি কীভাবে এতে "সফল হন না"? যোদা যেমন বলবে: কর বা না কর, কোনও চেষ্টা নেই।
অ্যারোনআউট

@ অ্যারোনচট উদাহরণস্বরূপ তাঁর একক ভিডমোডলে সমস্ত ডেটা দরকার। হতে পারে তার গ্রিড রয়েছে এবং বিভিন্ন পরিষেবা থেকে বিভিন্ন কলাম এসেছে। আপনি এটি রচনা দিয়ে করতে পারবেন না cannot
ইউফোরিক

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

1

আমি এই সম্পর্কে একটি বই লিখতে পারি ... আসলে আমিই আছি;)

প্রথমত, জিনিসগুলি করার কোনও সর্বজনীন "সঠিক" উপায় নেই। আপনাকে অন্যান্য বিষয়গুলি বিবেচনায় নিতে হবে।

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

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

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


একটি বিশাল পরিষেবা পরিষেবা বার্তা ব্রোকারের থেকে খুব আলাদা। এটি নির্ভরতা বর্ণালীটির প্রায় বিপরীত প্রান্তে। এই আর্কিটেকচারের একটি বৈশিষ্ট্যটি হ'ল প্রেরক প্রাপক সম্পর্কে কিছুই জানেন না এবং অনেক রিসিভার (পাব / সাব বা মাল্টিকাস্ট) থাকতে পারে। সম্ভবত আপনি এটিকে আরপিসি-স্টাইলের "রিমোটিং" দিয়ে বিভ্রান্ত করছেন যা কেবলমাত্র একটি দূরবর্তী প্রোটোকলের মাধ্যমে একটি traditionalতিহ্যবাহী পরিষেবাটি উন্মোচিত করছে এবং প্রেরক এখনও শারীরিকভাবে (শেষ পয়েন্ট) এবং যৌক্তিকভাবে (ফেরতের মান) প্রাপ্তির সাথে মিলিত হয়।
অ্যারোনআউট

সাদৃশ্যটি হ'ল সম্মুখটি রাউটারের মতো কাজ করে, কলার জানেন না কোন পরিষেবা / পরিষেবাগুলি কলটি পরিচালনা করে ঠিক যেমন কোনও ক্লায়েন্ট কোনও বার্তা প্রেরণ করে তা জানে না কে এই বার্তাটি পরিচালনা করে।
মাইকেল ব্রাউন

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

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

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

0

দুজনকে একত্রিত করছ না কেন?

একটি মুখোমুখি তৈরি করুন এবং আপনার ভিউ মডেলগুলি যে সমস্ত পরিষেবা ব্যবহার করেন সেগুলি রাখুন। তারপরে আপনার খারাপ ভি শব্দটি ব্যতীত আপনার সমস্ত ভিউ মডেলের জন্য একক মুখী থাকতে পারে।

অথবা আপনি কনস্ট্রাক্টর ইঞ্জেকশনের পরিবর্তে সম্পত্তি ইনজেকশন ব্যবহার করতে পারেন। তবে তারপরে আপনার অবশ্যই এটি নিশ্চিত করা দরকার যে সেগুলি সঠিকভাবে ইনজেকশনের শিকার হচ্ছে।


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