(Sto scrivendo una grande GUI MATLAB che fa un uso significativo di MVC, quindi il mio esempio è scritto in MATLAB, tuttavia, credo che questa domanda sia indipendente dalla lingua. Per favore correggimi se sbaglio.)
Ho una classe Model
che è ovviamente il modello per la mia applicazione MVC. Supponiamo di avere il seguente:
classdef Model < handle
properties
objectA
objectB
objectC
end
end
objectA
, objectB
e objectC
sono tutti oggetti che possono essere osservati:
classdef objectA < handle
events
ObjectAEvent
end
methods
function raise(this)
this.notify('ObjectAEvent', someEventData);
end
end
end
ecc.
Ora dì che voglio che il mio View
risponda alle modifiche al mio Model
. In particolare, voglio che View
risponda all'evento ObjectAEvent
. Ci sono due modi per farlo:
-
Consenti a
View
di iscriversi direttamente all'eventoObjectAEvent
. Abbiamo ora accoppiato ilView
all'interno delModel
, che a mio avviso viola la legge di Demeter. Sono abbastanza sicuro che questo viola anche il concetto di MVC per definizione. -
Lascia che
Model
"inoltra" l'evento aView
, come segue.classdef Model < handle properties objectA objectB objectC listeners end events eventFromObjectA ... end methods function this = Model this.listeners(1) = addlistener(this.objectA, 'ObjectAEvent', @(src, eventdata) this.notify('eventFromObjectA', eventdata); ... end end end
Ora
View
osserva direttamenteModel
, maModel
deve passare gli eventi e i dati associati aView
. Suppongo che questo sia un po 'il punto di MVC, ma ora c'è un accoppiamento tra ogniobject_
eModel
direttamente. Suppongo cheModel
debba sapere della suaobject_
s, ma questo sembra ancora ... goffo.
Quale approccio è più corretto? Ci sono altre alternative più pulite di queste?
(Le risposte possono avere degli esempi in qualsiasi linguaggio OOP, sono più familiare a MATLAB.)