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?
