Sto pensando a un problema semplice. Ho dato una classe ad esempio Model
Come gestire l'oggetto di classe con riferimenti circolari?
class Model {
constructor(parameters = {}) {
this.id = parameters.id;
}
}
così come si può vedere siamo in grado di creare nuovi oggetti come Model
: let model = new Model()
. Altro esempio complesso sarebbe simile a questa:
//we have some data given from API maybe?
let parameters = {id: 1};
let model = new Model(parameters);
E qui siamo al punto in cui ho iniziato a vagare Che cosa succede se l'oggetto con data id
esiste già?
La domanda è quale modello dovrei usare per istanziare l'oggetto con data id
una sola volta?
Andiamo oltre: cosa succede se otterremo oggetti nidificati con riferimenti circensi? Lasciate assumere abbiamo ottenuto un'altra classe chiamata AnotherModel
e il nostro codice è simile:
class Model {
constructor(parameters = {}) {
this.id = parameters.id;
this.anotherModel= nulld;
if (parameters.anotherModel) {
this.anotherModel= parameters.anotherModel instanceof AnotherModel
? parameters.anotherModel
: new AnotherModel(parameters.anotherModel);
}
}
}
class AnotherModel {
constructor(parameters = {}) {
this.id = parameters.id;
this.models = [];
if (parameters.models) {
for (let i = 0; i < parameters.models.length; i++) {
let model = parameters.models[i];
model.anotherModel= this;
this.models.push(new Model(model));
}
}
}
}
Così AnotherModel
contiene una raccolta di Model
s e Model
oggetto contiene riferimento alla AnotherModel
.
Qual è il modo per risolvere questo problema? Ciò che vogliamo ottenere è avere un solo oggetto con lo stesso id.
Quello che stavo pensando è fare una specie di ObjectPool in cui memorizzerò tutti gli oggetti per una determinata classe o classe e quando il nuovo oggetto viene istanziato il nostro pool ne creerebbe uno nuovo se non esiste o restituisce quello esistente?
Ma qui è un po 'di disadattamento, se per esempio abbiamo già scritto del codice dovremmo rifattorizzare e cambiare il modo in cui li instiamo da new Model()
a ObjectPool.get(Model, parameters)
?
Quali sono le tue idee?
nello scenario di cui sopra, è un esempio di 'AnotherModel' creato per primo?Oppure le istanze di 'Model' e' AnotherModel' possono essere create singolarmente? Non sono sicuro di aver capito come dovrebbe funzionare il tuo codice. – nils
singolarmente, non importa se prima creiamo un 'AnotherModel' o 'Model' – Vardius
Mi dispiace se questa è una domanda stupida, ma è necessario che entrambi i componenti mantengano un riferimento l'uno con l'altro? Soprattutto questa linea non ha molto senso per me: ': new AnotherModel (parameters.anotherModel);' (creando 'AnotherModel' dal Model senza passare nello stesso' Modello ') – nils