Oggetto figlio che chiama la funzione di un genitore attraverso una variabile globale

3

Ho un oggetto Session , di cui una singola istanza globale session contiene la sessione corrente, che può persistere sul server, gestire il resto della pagina ecc.

La sessione contiene un'istanza di Objects che in questo esempio è fondamentalmente un insieme di oggetti Cars . Quando l'utente cambia ad es. un indicatore su una mappa che rappresenta la posizione di una macchina, voglio aggiornare il corrispondente oggetto Car E salvare la sessione per poterla ripetere e persistere sul server.

Diagramma incompleto:

Codice:

functionSession(sessionId,objectsSave){this.objects=newObjects();if(objectsSave!==undefined)this.objects.restore(objectsSave);Session.prototype.saveSession=function(){varsave=this.objects.save();//persisttoserverandaddtoredoStack}functionObjects(){this.objects=[];}Objects.prototype.restore=function(save){varobjects=[];save.forEach(function(obj){objects.push(Car.prototype.restore(obj));});this.objects=objects;};functionCar(){this.markerOnMap=newMarker();this.markerOnMap.onDrag=this.setLocation;this.markerOnMap.onDragEnd=session.saveSession;//hereusingtheglobalvariable,doesnotworkwheninstantiatingSessionwithasaveobjectCar.prototype.setLocation=function(e){this.location=e.location;}varsession=newSession();

Ilproblemaemerge(oltreal"cattivo design") quando voglio istanziare un Session ad es. con dati dal server. In Session costruttore creo una nuova istanza Objects e la ripristino con il salvataggio, che creerà oggetti Car , che proveranno a fare riferimento a una funzione della variabile globale session . Ma session non è ancora stato assegnato, perché questo codice è stato chiamato dal costruttore di Session . Potrei avere ad es. cambiato in:

        this.markerOnMap.onDragEnd = function(){session.saveSession()};

o passa this da Session costruttore fino in fondo al costruttore di Car . Non so cosa sia peggio, per avere una variabile globale, tutti i riferimenti circolari, o c'è una soluzione migliore?

    
posta Adam 29.04.2017 - 16:20
fonte

2 risposte

1

Esiste davvero un difetto di progettazione nel processo di costruzione: il Car richiede Session alla sua creazione. Questa dipendenza diventa quindi un problema quando Car viene deserializzata durante il ricorso a Session .

Il problema è dovuto al non rispetto del principio di responsabilità singola: quando costruisci un Car , devi solo creare l'oggetto e non inserirlo in un contenitore. Questo secondo passaggio dovrebbe essere responsabilità della funzione / oggetto che crea un'istanza di Car per uno scopo specifico.

Nel tuo caso, ti consiglio di prendere in considerazione il schema di progettazione del costruttore . Questo disegno separa la costruzione di oggetti complessi (qui la Sessione) nella costruzione e nell'assemblaggio delle sue parti. Ciò richiede che le parti possano essere costruite indipendentemente.

    
risposta data 29.04.2017 - 17:43
fonte
0

Il tuo "cattivo design" è giustificato. Comunicare da un oggetto a un altro attraverso una variabile globale è sicuramente un odore di codice.

Fornire un riferimento all'istanza Session nel costruttore Car non mi sembra poi così male. In alternativa, Car potrebbe generare un evento save piuttosto che chiamare saveSession() direttamente. Sarebbe quindi necessaria una funzione factory per collegare il listener di eventi a Session , ma Car non avrebbe una dipendenza diretta a Session .

    
risposta data 29.04.2017 - 18:04
fonte

Leggi altre domande sui tag