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?