কন্ট্রোলারকে ভিউ ও মডেল সম্পর্কে জানা উচিত? অথবা উলটা?


13

আমি ধারণামূলকভাবে বুঝতে চেষ্টা করছি যে আমার এটি করা উচিত কিনা:

item = Model()
screen = View()
brain = Controller(item, screen)

অথবা এটা..

brain = Controller()
item = Model(brain)
screen = View(brain)

অথবা এটা..

class Controller():
    def __init__(self):
        item = Model(self)
        screen = View(self)

না পুরোপুরি অন্য কিছু?

উত্তর:


18

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

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


9

Modelএবং Viewএকে অপরের স্বাধীন।

এমভিসি কাঠামোর মস্তিষ্কController হিসাবে ভাবেন না । এটিকে প্রেরণকারী হিসাবে ভাবুন যা ব্রাউজার থেকে অনুরোধগুলি পরিচালনা করে এবং এগুলি তাদের কাছে প্রেরণ করে । এরপরে এটি ডেটা গ্রহণ করে এবং এটি টেমপ্লেট বান্ধব উপায়ে প্যাকেজ করে এবং তারপরে এটি এ প্রেরণ করে ।ModelModelView

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

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


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

@ এলনাফি আপনি এমভিসি কাঠামোকে মাত্র ৩ টি ক্লাসে সরল করেছেন। বিদ্যমান এমভিসি ওপেন সোর্স ফ্রেমওয়ার্কগুলি ঘুরে দেখুন এবং এটি দেখতে আপনাকে আরও অনেক কিছু করার দরকার আছে। আরও কিছু উচ্চতর হতে হবে যা কাঠামোর জন্য সমস্ত টুকরো পরিচালনা করে। এমন কিছু যা কন্ট্রোলারকে কল করে এবং এমন কিছু যা দর্শনগুলিতে ক্রিয়াকলাপকে পরিচালনা করে।
তিনটি

3

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

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

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


+1 ভাল উত্তর। আমি ক্লাসিক অর্থে ডেস্কটপ অ্যাপ্লিকেশনগুলির জন্য মডেল কলব্যাকগুলি বুঝতে পারি। মাইক্রোসফ্ট থেকে আমাকে পুরানো এমএফসি স্মরণ করিয়ে দেয়।
বিক্রিয়াকারী

2

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

নিয়ামকের ব্যবহারকারীর দিকনির্দেশের ফলাফল হিসাবে মডেলটির পরিবর্তনের জন্য চাপ দেওয়া উচিত (উদাহরণস্বরূপ কীবোর্ডে রাখা, মাউস এবং মেনু কমান্ডগুলি)।

মডেলটি মডেল এবং সাবস্ক্রিপশনের একটি তালিকা বজায় রাখে এবং তাদের সাবস্ক্রিপশনের মাধ্যমে প্রযোজ্য পরিবর্তনের মতামত জানাতে হবে।

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


-1 Modelsঅবহিত করবেন না Views। পরিবর্তনের জন্য Controllersক্যোয়ারী করুন Modelএবং তারপরে Viewsএই পরিবর্তনগুলি উপস্থাপন করুন।
তিনটি

4
এমভিসিতে @ ম্যাথিউফস্ক্রিনি, ভিউ মডেল থেকে পরিবর্তনের জন্য সাবস্ক্রাইব করে। উদাহরণস্বরূপ, wiki.squeak.org/squeak/598 দেখুন

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

6
@ ম্যাথিউফস্ক্রিনি: এগুলি সমস্ত ওয়েব ফ্রেমওয়ার্ক, এবং তারা নিজেকে "এমভিসি" বললেও তারা ক্লাসিক এমভিসি আর্কিটেকচারটি অনুসরণ করে না।
কেভিন cline

2
আমি নিশ্চিত নই যে কোনও এমভিসিই স্মার্টটাক এমভিসির চেয়ে বেশি "traditionalতিহ্যবাহী", যেখানে প্যাটার্নটি বর্ণিত ছিল এটিই প্রথম।

1

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

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

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

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