È mai veramente accettabile riassegnare il modello per una vista in MVC? (O MV * dove applicabile.) In altre parole, per una singola istanza di visualizzazione, è mai ok per riassegnare il modello della vista? Cioè, al contrario di usare setter (mutatori) sul modello in modo che non debba essere riassegnato. In quali condizioni (se ce ne sono) è questo design MVC accettabile?
Ecco un esempio in JavaScript, ma la domanda è indipendente dalla lingua.
var Model = function (m) {
var message = m;
return {
getMessage: function () {
return message;
},
setMessage: function (m) {
message = m;
}
};
};
var View = function (m) {
var model = m;
return {
render: function () {
alert(model.getMessage());
},
setModel: function (m) {
model = m; // hmm, is this okay?
}
};
};
var model1 = new Model('hello world');
var view = new View(model1);
var model2 = new Model('hi there');
view.render();
view.setModel(model2); // reassign model
view.render();
model2.setMessage('hi again'); // mutate model via setter
view.render();
Nella riga view.setModel(model2);
, il modello viene riassegnato (l'approccio in questione). Nella riga model2.setMessage('hi again');
, il modello è invece mutato tramite il proprio setter, che a mio avviso sembra generalmente preferito.
Uno dei principali svantaggi che posso vedere per modellare la riassegnazione è che potrebbe complicare i tentativi di riutilizzare il modello altrove nell'applicazione. In alcune applicazioni MVC può essere utilizzato un singolo modello condiviso per pilotare più viste (ad esempio lista, editor e visualizzazioni di visualizzazione degli stessi dati), nel qual caso la riassegnazione del modello sarebbe problematica - richiederebbe almeno la complessità aggiuntiva della comunicazione la riassegnazione del modello alle viste dipendenti. Qui penso che il principio ASCIUGGIA superi il principio dei non mutatori. (Apri argomento qui.) Si può fare un caso ancora più strong?
Per ricapitolare, in quali circostanze l'assegnazione del modello potrebbe essere accettabile, se del caso? Forse in alcune lingue, sotto vincoli di prestazioni estreme ...? "non riassegnare i modelli" è una buona regola generale? Un puntatore a una fonte autorevole o situazione reale sarebbe utile.