Wie behandelt man Klassenobjekte mit Zirkelverweisen?

8

Ich denke über ein einfaches Problem nach. Ich habe eine Klasse angegeben, zum Beispiel Model

%Vor%

Wie Sie sehen können, können wir neue Model -Objekte wie: let model = new Model() erstellen. Ein komplexeres Beispiel würde so aussehen:

%Vor%

Und hier sind wir an dem Punkt, an dem ich anfing zu wandern Was ist, wenn das Objekt mit gegebenem id bereits existiert ?

Die Frage ist Welches Muster sollte ich verwenden, um ein Objekt mit gegebenem id nur einmal zu instanziieren?

Gehen wir weiter: Was, wenn wir geschachtelte Objekte mit Zirkularreferenzen bekommen ? Nehmen wir an, wir haben eine andere Klasse namens AnotherModel und unser Code sieht wie folgt aus:

%Vor%

So AnotherModel enthält eine Sammlung von Model s und Model Objekt enthält einen Verweis auf AnotherModel .

Was ist der nette Weg , um dieses Problem zu lösen? Wir wollen nur ein Objekt mit derselben ID haben.

Was ich dachte ist, eine Art von ObjectPool zu machen, wo ich alle Objekte für gegebene Klassen oder Klassen speichern werde und wenn ein neues Objekt instanziiert wird, würde unser Pool ein neues erstellen, wenn es nicht existiert oder das existierende zurückgibt? / p>

Aber hier ist ein kleiner Nachteil, wenn wir zum Beispiel bereits einen Code geschrieben haben, den wir neu definieren müssen, und die Art, wie wir sie installieren, von new Model() auf ObjectPool.get(Model, parameters) ändern?

Was sind deine Ideen?

    
Vardius 28.04.2016, 11:34
quelle

1 Antwort

3

Sie können einen Objektpool (entweder in der Klasse oder außerhalb davon) verwenden, um Ihre Instanzen zu verfolgen. Indem Sie es im Konstruktor definieren, können Sie Modelle weiterhin mit:

instanziieren %Vor%

Wenn das id bereits im Pool vorhanden ist, können Sie einfach die vorhandene Instanz zurückgeben.

Außerhalb der Klasse:

%Vor%

Oder als (nicht aufzählbare, nicht schreibbare, nicht konfigurierbare) Eigenschaft für die Klasse (nicht die Instanz):

%Vor%

Wie von @Vardius hinzugefügt, kann man auch eine pseudo-abstrakte Klasse erstellen (da JS keine abstrakten Klassen hat), die erweitert werden kann. Unter Verwendung von new.target.name wird ein Namespace im Pool des abstrakte Klasse kann erstellt werden:

%Vor%     
nils 28.04.2016, 13:01
quelle

Tags und Links