Ho un'app con la seguente struttura (semplificata un po 'qui) ...
var RecorderApp = function(canvas) {
this.state = undefined;
this.states = { record: recordState, save: saveState };
this.init = function() {
this.audEng = new AudioEngine();
this.waveDisp = new WaveformDisplay(canvas);
this.mouse = new MouseStatus(canvas);
this.states.record.init(this);
this.states.save.init(this);
this.state = this.states.record;
this.state.enter();
this.state.execute();
};
Ho bisogno che le istanze audEng, waveDisp e mouse parlino tra loro - waveDisp deve estrarre i dati delle forme d'onda da audEng, fare clic sugli eventi ricevuti da waveDisp per attivare le modifiche di stato nella classe genitore e così via.
Il mio primo pensiero è stato passare "questo" come parametro nel costruttore di ogni istanza e memorizzare il riferimento come this.parent, quindi "raggiungere il backup" come necessario e chiamare direttamente i metodi di query ei metodi di modifica dello stato che volevo . In questo caso, penso di poter giustificare il raggiungimento diretto nella classe genitore per chiamare un metodo di modifica dello stato, ad esempio this.parent.save (), ma ... risalendo fino al parent e poi nuovamente in un'altra classe, ad es. this.parent.audEng.getWaveform () mi fa sentire a disagio, ho ragione nel pensare che questo viola la legge di Demeter? Se questa è una via imprudente / puzzolente da percorrere, la soluzione giusta è assicurarsi che tutte le comunicazioni inter-class di cui ho bisogno vengano eseguite tramite metodi definiti nella classe master RecorderApp? O è l'architettura che sto suggerendo fondamentalmente stupida.
Modifica perché contrassegnato come duplicato: l'altra risposta che ho visto qui è abbastanza centrata sul C ++, l'opinione sembra divisa, non fornisce esempi espliciti e la migliore risposta non ha risposto alla mia domanda in un modo che mi era completamente chiaro, in in particolare "altre lingue usano un oggetto" è una soluzione un po 'più vaga di quanto speravo.