जैसा कि मैं एमवीसी के मानक कार्यान्वयन में जानता हूं हमएमवीसी - क्या मुझे दृश्य में नियंत्रक का उपयोग करने की आवश्यकता है?
पर नियंत्रक और मॉडल पास करते हैं लेकिन मैं इस विचार से थोड़ा असहमत हूं। मैं नहीं चाहता कि मेरा विचार दोनों नियंत्रक और मॉडल (ओह संख्या। शायद कभी-कभी मॉडल की ज़रूरतों को देख सके, लेकिन मुझे यकीन है कि वह नियंत्रक के ज्ञान के बिना जी सकता है)
मेरी राय में नियंत्रक को दृश्य और मॉडल का प्रबंधन करना चाहिए, और मॉडल को नियंत्रक और देखने के बारे में जानने की आवश्यकता नहीं है; देखें नियंत्रक को जानने की आवश्यकता नहीं है (मैं मॉडल को बाहर नहीं रखता क्योंकि विचारों के कुछ कार्यान्वयन मॉडल में परिवर्तन सुनने के लिए मॉडल के बारे में जानना आवश्यक है)। तो मेरा विचार यह है कि देखें नियंत्रक के बारे में जानने की आवश्यकता नहीं है।
public class MyView implements ButtonClickListener {
private Controller myController;
private Button myButton;
// I commented out the model because we dont need it now
// we are talking about using controller in the view
public MyView(Controller c/*, Model m*/) {
myController = c;
myButton = new Button(); // lets say that it is "register" button
myButton.setOnButtonClickListener(this);
}
public void setRegisterButtonText(String text) {
myButton.setText(text);
}
@Override
public void onClick() {
myController.tellToModelToDoSomething();
}
}
और नियंत्रक::
1. यहाँ एक उदाहरण है
public MyController implements Controller {
private Model model;
private View view;
public MyController(Model model) {
this.model = model;
this.view = new MyView(this);
}
public void tellToModelToDoSomething() {
model.doSomeActions();
}
}
2. और अब मैं कैसे नियंत्रक गुजर बिना इस कार्यान्वयन देख पा रहे हैं:
मेरा दृश्य:
public class MyView {
private Button myButton;
public MyView() {
myButton = new Button();
}
public void setRegisterButtonText(String text) {
myButton.setText(text);
}
public void setOnRegisterButtonClick(final Command command) {
myButton.setOnButtonClickListener(new ButtonClickListener() {
@Override
public void onClick() {
command.execute();
}
});
}
}
"कमांड" इंटरफेस:
public interface Command {
void execute(/*also can handle extra params*/);
}
और नियंत्रक:
public MyController implements Controller {
private Model model;
private View view;
public MyController(Model model) {
this.model = model;
this.view = new MyView();
view.setOnRegisterButtonClick(command);
}
public void tellToModelToDoSomething() {
model.doSomeActions();
}
private Command command = new Command() {
public void execute() {
tellToModelToDoSomething();
}
};
}
तो क्यों मुझे लगता है कि दृश्य में नियंत्रक का उपयोग अच्छा नहीं है है:
हम नियंत्रक मिश्रण कर रहे हैं और नई निर्भरताओं को बनाने, कार्यान्वयन देखें।
मुझे लगता है कि दृश्य में केवल उनके साथ दृश्य और संचालन होना चाहिए (और नियंत्रक का उपयोग करना और उसकी कुछ विधियां पहले ही तर्क की तरह दिखती हैं)।
पहले उदाहरण में नियंत्रक को बताता है कि क्या करना है। क्या आप सहमत हैं? ऐसा लगता है कि नियंत्रण नियंत्रक नियंत्रण करता है!
दूसरे उदाहरण नियंत्रक में नियंत्रित करता है कि क्या करना है और सिर्फ देखने के कुछ बटन (केवल दृश्य जानता है क्या बटन यह हो जाएगा) तो क्या करना चाहिए क्लिक किया
मैं हमेशा दूसरी योजना का इस्तेमाल किया करने के लिए कहते हैं, लेकिन पढ़ने के बाद एमवीसी के बारे में एक नई किताब, जो कहती है कि हमें नियंत्रक को देखने के लिए पास करने की जरूरत है, मैं थोड़ा उलझन में हूं।
क्या आप कृपया मुझे समझने में मदद कर सकते हैं कि मैं गलत क्यों हूं और मुझे कुछ उदाहरण दिखाता हूं?
मुझे विश्वास है कि नियंत्रक और देखें सीधे बातचीत नहीं करते हैं। वे मॉडल हालांकि बातचीत करते हैं। इसलिए मॉडल दोनों नियंत्रक और देखें, लेकिन देखें और नियंत्रक एक दूसरे को नहीं जानते हैं। – gigadot
ने कहा है कि। एमवीसी कई रूपों में आता है और वास्तविक प्रत्यारोपण अभ्यास में भिन्न होते हैं। – gigadot
आप सही हैं .., और आप इस उदाहरण में कैसे सोचते हैं, कौन सा कार्यान्वयन बेहतर है? – pleerock